llvm-hs-pretty-0.4.0.0: tests/input/inst_memory.ll
; --- [ Memory instructions ] --------------------------------------------------
@x = global i32 42
; ~~~ [ alloca ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
define i32* @alloca_1() {
; Plain instruction.
%result = alloca i32
ret i32* %result
}
define i32* @alloca_2() {
; Number of elements operand.
%result = alloca i32, i32 10
ret i32* %result
}
define i32* @alloca_3() {
; Alignment operand.
%result = alloca i32, align 8
ret i32* %result
}
define i32* @alloca_4() {
; Metadata.
%result = alloca i32, !foo !{!"bar"}, !baz !{!"qux"}
ret i32* %result
}
define i32* @alloca_5() {
; Full instruction.
%result = alloca i32, i32 10, align 8, !foo !{!"bar"}, !baz !{!"qux"}
ret i32* %result
}
; ~~~ [ load ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
define i32 @load_1(i32* %x) {
; Plain instruction.
%result = load i32, i32* %x
ret i32 %result
}
define i32 @load_2() {
; Global operand.
%result = load i32, i32* @x
ret i32 %result
}
define i32 @load_3(i32* %x) {
; Volatile.
%result = load volatile i32, i32* %x
ret i32 %result
}
define i32 @load_4(i32* %x) {
; Alignment operand.
%result = load i32, i32* %x, align 8
ret i32 %result
}
define i32 @load_5(i32* %x) {
; Metadata.
%result = load i32, i32* %x, !foo !{!"bar"}, !baz !{!"qux"}
ret i32 %result
}
define i32 @load_6(i32* %x) {
; Full instruction.
%result = load volatile i32, i32* %x, align 8, !foo !{!"bar"}, !baz !{!"qux"}
ret i32 %result
}
; ~~~ [ store ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
define void @store_1(i32* %x) {
; Plain instruction.
store i32 42, i32* %x
ret void
}
define void @store_2() {
; Global operand.
store i32 42, i32* @x
ret void
}
define void @store_3(i32* %x) {
; Volatile.
store volatile i32 42, i32* %x
ret void
}
define void @store_4(i32* %x) {
; Alignment operand.
store i32 42, i32* %x, align 8
ret void
}
define void @store_5(i32* %x) {
; Metadata.
store i32 42, i32* %x, !foo !{!"bar"}, !baz !{!"qux"}
ret void
}
define void @store_6(i32* %x) {
; Full instruction.
store volatile i32 42, i32* %x, align 8, !foo !{!"bar"}, !baz !{!"qux"}
ret void
}
; ~~~ [ fence ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
define void @fence() {
fence syncscope("singlethread") seq_cst
fence acquire
fence release
fence acq_rel
ret void
}
; ~~~ [ cmpxchg ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
define void @cmpxchg_1(i32* %ptr) {
entry:
%orig = load atomic i32, i32* %ptr unordered, align 4
br label %loop
loop:
%cmp = phi i32 [ %orig, %entry ], [%value_loaded, %loop]
%squared = mul i32 %cmp, %cmp
%val_success = cmpxchg i32* %ptr, i32 %cmp, i32 %squared acq_rel monotonic
%value_loaded = extractvalue { i32, i1 } %val_success, 0
%success = extractvalue { i32, i1 } %val_success, 1
br i1 %success, label %done, label %loop
done:
ret void
}
; ~~~ [ atomicrmw ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
define void @atomicrmw(i8* %Q, i32* %word, i32* %x) {
atomicrmw add i8* %Q, i8 1 monotonic
atomicrmw add i32* %x, i32 10 seq_cst
atomicrmw volatile umin i32* %word, i32 22 syncscope("singlethread") monotonic
ret void
}
; ~~~ [ resume ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
declare i32 @__gxx_personality_v0(...)
define void @resume() personality i32 (...)* @__gxx_personality_v0 {
resume { i8*, i32 } { i8* bitcast (void ()* @resume to i8*), i32 42 }
}
; ~~~ [ getelementptr ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
define i32* @getelementptr_1(i32* %x) {
; Plain instruction.
%result = getelementptr i32, i32* %x
ret i32* %result
}
define i32* @getelementptr_2({ i32, { [2 x i32], i8 } }* %x) {
; Indices.
%result = getelementptr { i32, { [2 x i32], i8 } }, { i32, { [2 x i32], i8 } }* %x, i32 0, i32 1, i32 0, i32 1
ret i32* %result
}
define i32* @getelementptr_3(i32* %x) {
; Inbounds.
%result = getelementptr inbounds i32, i32* %x
ret i32* %result
}
define i32* @getelementptr_4(i32* %x) {
; Metadata.
%result = getelementptr i32, i32* %x, !foo !{!"bar"}, !baz !{!"qux"}
ret i32* %result
}
define i32* @getelementptr_5({ i32, { [2 x i32], i8 } }* %x) {
; Full instruction.
%result = getelementptr inbounds { i32, { [2 x i32], i8 } }, { i32, { [2 x i32], i8 } }* %x, i32 0, i32 1, i32 0, i32 1, !foo !{!"bar"}, !baz !{!"qux"}
ret i32* %result
}