blob: de580c23e4394c5018716db76ed37bf64658bf24 [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
; RUN: llc -mtriple=riscv32 -mattr=+xqcili,+relax -code-model=small \
; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefix=NO-C
; RUN: llc -mtriple=riscv32 -mattr=+xqcili,+relax,+zca,+zcb -code-model=small \
; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefix=WITH-C
@global = external global [8 x i8]
define zeroext i8 @load_unsigned_byte() nounwind optsize {
; NO-C-LABEL: load_unsigned_byte:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a0, global
; NO-C-NEXT: lbu a0, 0(a0), %qc.access(global)
; NO-C-NEXT: ret
;
; WITH-C-LABEL: load_unsigned_byte:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a0, global
; WITH-C-NEXT: c.lbu a0, 0(a0), %qc.access(global)
; WITH-C-NEXT: ret
%1 = load i8, ptr @global, align 1
ret i8 %1
}
define zeroext i8 @load_unsigned_byte_offset() nounwind optsize {
; NO-C-LABEL: load_unsigned_byte_offset:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a0, global+1
; NO-C-NEXT: lbu a0, 0(a0), %qc.access(global+1)
; NO-C-NEXT: ret
;
; WITH-C-LABEL: load_unsigned_byte_offset:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a0, global+1
; WITH-C-NEXT: c.lbu a0, 0(a0), %qc.access(global+1)
; WITH-C-NEXT: ret
%1 = getelementptr i8, ptr @global, i32 1
%2 = load i8, ptr %1, align 1
ret i8 %2
}
define zeroext i16 @load_two_unsigned_byte() nounwind optsize {
; NO-C-LABEL: load_two_unsigned_byte:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a0, global
; NO-C-NEXT: lbu a1, 1(a0)
; NO-C-NEXT: lbu a0, 0(a0)
; NO-C-NEXT: slli a1, a1, 8
; NO-C-NEXT: or a0, a0, a1
; NO-C-NEXT: ret
;
; WITH-C-LABEL: load_two_unsigned_byte:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a0, global
; WITH-C-NEXT: lbu a1, 1(a0)
; WITH-C-NEXT: lbu a0, 0(a0)
; WITH-C-NEXT: slli a1, a1, 8
; WITH-C-NEXT: or a0, a0, a1
; WITH-C-NEXT: ret
%1 = load i16, ptr @global, align 1
ret i16 %1
}
define zeroext i8 @load_unsigned_byte_twice() nounwind optsize {
; NO-C-LABEL: load_unsigned_byte_twice:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a0, global
; NO-C-NEXT: lbu a1, 0(a0)
; NO-C-NEXT: lbu a0, 0(a0)
; NO-C-NEXT: or a0, a0, a1
; NO-C-NEXT: zext.b a0, a0
; NO-C-NEXT: ret
;
; WITH-C-LABEL: load_unsigned_byte_twice:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a0, global
; WITH-C-NEXT: lbu a1, 0(a0)
; WITH-C-NEXT: lbu a0, 0(a0)
; WITH-C-NEXT: or a0, a0, a1
; WITH-C-NEXT: zext.b a0, a0
; WITH-C-NEXT: ret
%1 = load volatile i8, ptr @global, align 1
%2 = load volatile i8, ptr @global, align 1
%3 = or i8 %1, %2
ret i8 %3
}
define zeroext i8 @load_unsigned_byte_twice_offset() nounwind optsize {
; NO-C-LABEL: load_unsigned_byte_twice_offset:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a0, global+1
; NO-C-NEXT: lbu a1, 0(a0)
; NO-C-NEXT: lbu a0, 0(a0)
; NO-C-NEXT: or a0, a0, a1
; NO-C-NEXT: zext.b a0, a0
; NO-C-NEXT: ret
;
; WITH-C-LABEL: load_unsigned_byte_twice_offset:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a0, global+1
; WITH-C-NEXT: lbu a1, 0(a0)
; WITH-C-NEXT: lbu a0, 0(a0)
; WITH-C-NEXT: or a0, a0, a1
; WITH-C-NEXT: zext.b a0, a0
; WITH-C-NEXT: ret
%1 = getelementptr i8, ptr @global, i32 1
%2 = load volatile i8, ptr %1, align 1
%3 = load volatile i8, ptr %1, align 1
%4 = or i8 %2, %3
ret i8 %4
}
define i16 @load_halfword() nounwind optsize {
; NO-C-LABEL: load_halfword:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a0, global
; NO-C-NEXT: lh a0, 0(a0), %qc.access(global)
; NO-C-NEXT: ret
;
; WITH-C-LABEL: load_halfword:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a0, global
; WITH-C-NEXT: c.lh a0, 0(a0), %qc.access(global)
; WITH-C-NEXT: ret
%1 = load i16, ptr @global, align 2
ret i16 %1
}
define i16 @load_halfword_offset() nounwind optsize {
; NO-C-LABEL: load_halfword_offset:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a0, global+2
; NO-C-NEXT: lh a0, 0(a0), %qc.access(global+2)
; NO-C-NEXT: ret
;
; WITH-C-LABEL: load_halfword_offset:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a0, global+2
; WITH-C-NEXT: c.lh a0, 0(a0), %qc.access(global+2)
; WITH-C-NEXT: ret
%1 = getelementptr i8, ptr @global, i32 2
%2 = load i16, ptr %1, align 2
ret i16 %2
}
define i32 @load_two_halfword() nounwind optsize {
; NO-C-LABEL: load_two_halfword:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a0, global
; NO-C-NEXT: lhu a1, 2(a0)
; NO-C-NEXT: lhu a0, 0(a0)
; NO-C-NEXT: slli a1, a1, 16
; NO-C-NEXT: or a0, a0, a1
; NO-C-NEXT: ret
;
; WITH-C-LABEL: load_two_halfword:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a0, global
; WITH-C-NEXT: lhu a1, 2(a0)
; WITH-C-NEXT: lhu a0, 0(a0)
; WITH-C-NEXT: slli a1, a1, 16
; WITH-C-NEXT: or a0, a0, a1
; WITH-C-NEXT: ret
%1 = load i32, ptr @global, align 2
ret i32 %1
}
define i16 @load_halfword_twice() nounwind optsize {
; NO-C-LABEL: load_halfword_twice:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a0, global
; NO-C-NEXT: lh a1, 0(a0)
; NO-C-NEXT: lh a0, 0(a0)
; NO-C-NEXT: or a0, a0, a1
; NO-C-NEXT: ret
;
; WITH-C-LABEL: load_halfword_twice:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a0, global
; WITH-C-NEXT: lh a1, 0(a0)
; WITH-C-NEXT: lh a0, 0(a0)
; WITH-C-NEXT: or a0, a0, a1
; WITH-C-NEXT: ret
%1 = load volatile i16, ptr @global, align 2
%2 = load volatile i16, ptr @global, align 2
%3 = or i16 %1, %2
ret i16 %3
}
define i16 @load_halfword_twice_offset() nounwind optsize {
; NO-C-LABEL: load_halfword_twice_offset:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a0, global+4
; NO-C-NEXT: lh a1, 0(a0)
; NO-C-NEXT: lh a0, 0(a0)
; NO-C-NEXT: or a0, a0, a1
; NO-C-NEXT: ret
;
; WITH-C-LABEL: load_halfword_twice_offset:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a0, global+4
; WITH-C-NEXT: lh a1, 0(a0)
; WITH-C-NEXT: lh a0, 0(a0)
; WITH-C-NEXT: or a0, a0, a1
; WITH-C-NEXT: ret
%1 = getelementptr i16, ptr @global, i32 2
%2 = load volatile i16, ptr %1, align 2
%3 = load volatile i16, ptr %1, align 2
%4 = or i16 %2, %3
ret i16 %4
}
define i32 @load_word() nounwind optsize {
; NO-C-LABEL: load_word:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a0, global
; NO-C-NEXT: c.lw a0, 0(a0), %qc.access(global)
; NO-C-NEXT: ret
;
; WITH-C-LABEL: load_word:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a0, global
; WITH-C-NEXT: c.lw a0, 0(a0), %qc.access(global)
; WITH-C-NEXT: ret
%1 = load i32, ptr @global, align 4
ret i32 %1
}
define i32 @load_word_offset() nounwind optsize {
; NO-C-LABEL: load_word_offset:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a0, global+4
; NO-C-NEXT: c.lw a0, 0(a0), %qc.access(global+4)
; NO-C-NEXT: ret
;
; WITH-C-LABEL: load_word_offset:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a0, global+4
; WITH-C-NEXT: c.lw a0, 0(a0), %qc.access(global+4)
; WITH-C-NEXT: ret
%1 = getelementptr i8, ptr @global, i32 4
%2 = load i32, ptr %1, align 4
ret i32 %2
}
define i64 @load_two_word() nounwind optsize {
; NO-C-LABEL: load_two_word:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a1, global
; NO-C-NEXT: lw a0, 0(a1)
; NO-C-NEXT: lw a1, 4(a1)
; NO-C-NEXT: ret
;
; WITH-C-LABEL: load_two_word:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a1, global
; WITH-C-NEXT: lw a0, 0(a1)
; WITH-C-NEXT: lw a1, 4(a1)
; WITH-C-NEXT: ret
%1 = load i64, ptr @global, align 4
ret i64 %1
}
define i32 @load_word_twice() nounwind optsize {
; NO-C-LABEL: load_word_twice:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a0, global
; NO-C-NEXT: lw a1, 0(a0)
; NO-C-NEXT: lw a0, 0(a0)
; NO-C-NEXT: or a0, a0, a1
; NO-C-NEXT: ret
;
; WITH-C-LABEL: load_word_twice:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a0, global
; WITH-C-NEXT: lw a1, 0(a0)
; WITH-C-NEXT: lw a0, 0(a0)
; WITH-C-NEXT: or a0, a0, a1
; WITH-C-NEXT: ret
%1 = load volatile i32, ptr @global, align 4
%2 = load volatile i32, ptr @global, align 4
%3 = or i32 %1, %2
ret i32 %3
}
define i32 @load_word_twice_offset() nounwind optsize {
; NO-C-LABEL: load_word_twice_offset:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a0, global+8
; NO-C-NEXT: lw a1, 0(a0)
; NO-C-NEXT: lw a0, 0(a0)
; NO-C-NEXT: or a0, a0, a1
; NO-C-NEXT: ret
;
; WITH-C-LABEL: load_word_twice_offset:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a0, global+8
; WITH-C-NEXT: lw a1, 0(a0)
; WITH-C-NEXT: lw a0, 0(a0)
; WITH-C-NEXT: or a0, a0, a1
; WITH-C-NEXT: ret
%1 = getelementptr i32, ptr @global, i32 2
%2 = load volatile i32, ptr %1, align 4
%3 = load volatile i32, ptr %1, align 4
%4 = or i32 %2, %3
ret i32 %4
}
define zeroext i8 @load_unsigned_byte_optnone() nounwind optnone noinline {
; NO-C-LABEL: load_unsigned_byte_optnone:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a0, global
; NO-C-NEXT: lbu a0, 0(a0)
; NO-C-NEXT: ret
;
; WITH-C-LABEL: load_unsigned_byte_optnone:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a0, global
; WITH-C-NEXT: lbu a0, 0(a0)
; WITH-C-NEXT: ret
%1 = load i8, ptr @global, align 1
ret i8 %1
}
define void @store_byte(i8 %a) nounwind {
; NO-C-LABEL: store_byte:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a1, global
; NO-C-NEXT: sb a0, 0(a1), %qc.access(global)
; NO-C-NEXT: ret
;
; WITH-C-LABEL: store_byte:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a1, global
; WITH-C-NEXT: c.sb a0, 0(a1), %qc.access(global)
; WITH-C-NEXT: ret
store i8 %a, ptr @global, align 1
ret void
}
define void @store_byte_offset(i8 %a) nounwind {
; NO-C-LABEL: store_byte_offset:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a1, global+1
; NO-C-NEXT: sb a0, 0(a1), %qc.access(global+1)
; NO-C-NEXT: ret
;
; WITH-C-LABEL: store_byte_offset:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a1, global+1
; WITH-C-NEXT: c.sb a0, 0(a1), %qc.access(global+1)
; WITH-C-NEXT: ret
%1 = getelementptr i8, ptr @global, i32 1
store i8 %a, ptr %1, align 1
ret void
}
define void @store_two_byte(i16 %a) nounwind {
; NO-C-LABEL: store_two_byte:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a1, global
; NO-C-NEXT: srli a2, a0, 8
; NO-C-NEXT: sb a0, 0(a1)
; NO-C-NEXT: sb a2, 1(a1)
; NO-C-NEXT: ret
;
; WITH-C-LABEL: store_two_byte:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a1, global
; WITH-C-NEXT: srli a2, a0, 8
; WITH-C-NEXT: sb a0, 0(a1)
; WITH-C-NEXT: sb a2, 1(a1)
; WITH-C-NEXT: ret
store i16 %a, ptr @global, align 1
ret void
}
define void @store_byte_twice(i8 %a) nounwind {
; NO-C-LABEL: store_byte_twice:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a1, global
; NO-C-NEXT: sb a0, 0(a1)
; NO-C-NEXT: sb a0, 0(a1)
; NO-C-NEXT: ret
;
; WITH-C-LABEL: store_byte_twice:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a1, global
; WITH-C-NEXT: sb a0, 0(a1)
; WITH-C-NEXT: sb a0, 0(a1)
; WITH-C-NEXT: ret
store volatile i8 %a, ptr @global, align 1
store volatile i8 %a, ptr @global, align 1
ret void
}
define void @store_byte_twice_offset(i8 %a) nounwind {
; NO-C-LABEL: store_byte_twice_offset:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a1, global+1
; NO-C-NEXT: sb a0, 0(a1)
; NO-C-NEXT: sb a0, 0(a1)
; NO-C-NEXT: ret
;
; WITH-C-LABEL: store_byte_twice_offset:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a1, global+1
; WITH-C-NEXT: sb a0, 0(a1)
; WITH-C-NEXT: sb a0, 0(a1)
; WITH-C-NEXT: ret
%1 = getelementptr i8, ptr @global, i32 1
store volatile i8 %a, ptr %1, align 1
store volatile i8 %a, ptr %1, align 1
ret void
}
define void @store_halfword(i16 %a) nounwind {
; NO-C-LABEL: store_halfword:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a1, global
; NO-C-NEXT: sh a0, 0(a1), %qc.access(global)
; NO-C-NEXT: ret
;
; WITH-C-LABEL: store_halfword:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a1, global
; WITH-C-NEXT: c.sh a0, 0(a1), %qc.access(global)
; WITH-C-NEXT: ret
store i16 %a, ptr @global, align 2
ret void
}
define void @store_halfword_offset(i16 %a) nounwind {
; NO-C-LABEL: store_halfword_offset:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a1, global+2
; NO-C-NEXT: sh a0, 0(a1), %qc.access(global+2)
; NO-C-NEXT: ret
;
; WITH-C-LABEL: store_halfword_offset:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a1, global+2
; WITH-C-NEXT: c.sh a0, 0(a1), %qc.access(global+2)
; WITH-C-NEXT: ret
%1 = getelementptr i8, ptr @global, i32 2
store i16 %a, ptr %1, align 2
ret void
}
define void @store_two_halfword(i32 %a) nounwind {
; NO-C-LABEL: store_two_halfword:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a1, global
; NO-C-NEXT: srli a2, a0, 16
; NO-C-NEXT: sh a0, 0(a1)
; NO-C-NEXT: sh a2, 2(a1)
; NO-C-NEXT: ret
;
; WITH-C-LABEL: store_two_halfword:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a1, global
; WITH-C-NEXT: srli a2, a0, 16
; WITH-C-NEXT: sh a0, 0(a1)
; WITH-C-NEXT: sh a2, 2(a1)
; WITH-C-NEXT: ret
store i32 %a, ptr @global, align 2
ret void
}
define void @store_halfword_twice(i16 %a) nounwind {
; NO-C-LABEL: store_halfword_twice:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a1, global
; NO-C-NEXT: sh a0, 0(a1)
; NO-C-NEXT: sh a0, 0(a1)
; NO-C-NEXT: ret
;
; WITH-C-LABEL: store_halfword_twice:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a1, global
; WITH-C-NEXT: sh a0, 0(a1)
; WITH-C-NEXT: sh a0, 0(a1)
; WITH-C-NEXT: ret
store volatile i16 %a, ptr @global, align 2
store volatile i16 %a, ptr @global, align 2
ret void
}
define void @store_halfword_twice_offset(i16 %a) nounwind {
; NO-C-LABEL: store_halfword_twice_offset:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a1, global+4
; NO-C-NEXT: sh a0, 0(a1)
; NO-C-NEXT: sh a0, 0(a1)
; NO-C-NEXT: ret
;
; WITH-C-LABEL: store_halfword_twice_offset:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a1, global+4
; WITH-C-NEXT: sh a0, 0(a1)
; WITH-C-NEXT: sh a0, 0(a1)
; WITH-C-NEXT: ret
%1 = getelementptr i16, ptr @global, i32 2
store volatile i16 %a, ptr %1, align 2
store volatile i16 %a, ptr %1, align 2
ret void
}
define void @store_word(i32 %a) nounwind {
; NO-C-LABEL: store_word:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a1, global
; NO-C-NEXT: c.sw a0, 0(a1), %qc.access(global)
; NO-C-NEXT: ret
;
; WITH-C-LABEL: store_word:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a1, global
; WITH-C-NEXT: c.sw a0, 0(a1), %qc.access(global)
; WITH-C-NEXT: ret
store i32 %a, ptr @global, align 4
ret void
}
define void @store_word_offset(i32 %a) nounwind {
; NO-C-LABEL: store_word_offset:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a1, global+4
; NO-C-NEXT: c.sw a0, 0(a1), %qc.access(global+4)
; NO-C-NEXT: ret
;
; WITH-C-LABEL: store_word_offset:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a1, global+4
; WITH-C-NEXT: c.sw a0, 0(a1), %qc.access(global+4)
; WITH-C-NEXT: ret
%1 = getelementptr i32, ptr @global, i32 1
store i32 %a, ptr %1, align 4
ret void
}
define void @store_two_word(i64 %a) nounwind {
; NO-C-LABEL: store_two_word:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a2, global
; NO-C-NEXT: sw a0, 0(a2)
; NO-C-NEXT: sw a1, 4(a2)
; NO-C-NEXT: ret
;
; WITH-C-LABEL: store_two_word:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a2, global
; WITH-C-NEXT: sw a0, 0(a2)
; WITH-C-NEXT: sw a1, 4(a2)
; WITH-C-NEXT: ret
store i64 %a, ptr @global, align 4
ret void
}
define void @store_word_twice(i32 %a) nounwind {
; NO-C-LABEL: store_word_twice:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a1, global
; NO-C-NEXT: sw a0, 0(a1)
; NO-C-NEXT: sw a0, 0(a1)
; NO-C-NEXT: ret
;
; WITH-C-LABEL: store_word_twice:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a1, global
; WITH-C-NEXT: sw a0, 0(a1)
; WITH-C-NEXT: sw a0, 0(a1)
; WITH-C-NEXT: ret
store volatile i32 %a, ptr @global, align 4
store volatile i32 %a, ptr @global, align 4
ret void
}
define void @store_word_twice_offset(i32 %a) nounwind {
; NO-C-LABEL: store_word_twice_offset:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a1, global+8
; NO-C-NEXT: sw a0, 0(a1)
; NO-C-NEXT: sw a0, 0(a1)
; NO-C-NEXT: ret
;
; WITH-C-LABEL: store_word_twice_offset:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a1, global+8
; WITH-C-NEXT: sw a0, 0(a1)
; WITH-C-NEXT: sw a0, 0(a1)
; WITH-C-NEXT: ret
%1 = getelementptr i32, ptr @global, i32 2
store volatile i32 %a, ptr %1, align 4
store volatile i32 %a, ptr %1, align 4
ret void
}
define void @store_word_self() nounwind {
; NO-C-LABEL: store_word_self:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a0, global
; NO-C-NEXT: sw a0, 0(a0)
; NO-C-NEXT: ret
;
; WITH-C-LABEL: store_word_self:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a0, global
; WITH-C-NEXT: sw a0, 0(a0)
; WITH-C-NEXT: ret
store ptr @global, ptr @global, align 4
ret void
}
define void @store_word_self_offset() nounwind {
; NO-C-LABEL: store_word_self_offset:
; NO-C: # %bb.0:
; NO-C-NEXT: qc.e.li a0, global
; NO-C-NEXT: addi a1, a0, 4
; NO-C-NEXT: sw a1, 4(a0)
; NO-C-NEXT: ret
;
; WITH-C-LABEL: store_word_self_offset:
; WITH-C: # %bb.0:
; WITH-C-NEXT: qc.e.li a0, global
; WITH-C-NEXT: addi a1, a0, 4
; WITH-C-NEXT: sw a1, 4(a0)
; WITH-C-NEXT: ret
%1 = getelementptr i32, ptr @global, i32 1
store ptr %1, ptr %1, align 4
ret void
}