llvm-hs-pretty-0.4.0.0: tests/input/inst_other.ll
; --- [ Other instructions ] ---------------------------------------------------
@g1 = global i32 42
; ~~~ [ icmp ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
define i1 @icmp_1() {
; Plain instruction.
%result = icmp ne i32 42, 5
ret i1 %result
}
define <2 x i1> @icmp_2() {
; Vector operands.
%result = icmp eq <2 x i32> <i32 42, i32 11>, <i32 42, i32 22>
ret <2 x i1> %result
}
define void @icmp_3() {
; Predicates.
%1 = icmp eq i32 10, 15
%2 = icmp ne i32 10, 15
%3 = icmp ugt i32 10, 15
%4 = icmp uge i32 10, 15
%5 = icmp ult i32 10, 15
%6 = icmp ule i32 10, 15
%7 = icmp sgt i32 10, 15
%8 = icmp sge i32 10, 15
%9 = icmp slt i32 10, 15
%10 = icmp sle i32 10, 15
ret void
}
define i1 @icmp_4() {
; Metadata.
%result = icmp ne i32 42, 5, !foo !{!"bar"}, !baz !{!"qux"}
ret i1 %result
}
; ~~~ [ fcmp ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
define i1 @fcmp_1() {
; Plain instruction.
%result = fcmp one double 42.0, 5.0
ret i1 %result
}
define <2 x i1> @fcmp_2() {
; Vector operands.
%result = fcmp oeq <2 x double> <double 42.0, double 11.0>, <double 42.0, double 22.0>
ret <2 x i1> %result
}
define void @fcmp_3() {
; Predicates.
%1 = fcmp false double 10.0, 15.0
%2 = fcmp oeq double 10.0, 15.0
%3 = fcmp ogt double 10.0, 15.0
%4 = fcmp oge double 10.0, 15.0
%5 = fcmp olt double 10.0, 15.0
%6 = fcmp ole double 10.0, 15.0
%7 = fcmp one double 10.0, 15.0
%8 = fcmp ord double 10.0, 15.0
%9 = fcmp ueq double 10.0, 15.0
%10 = fcmp ugt double 10.0, 15.0
%11 = fcmp uge double 10.0, 15.0
%12 = fcmp ult double 10.0, 15.0
%13 = fcmp ule double 10.0, 15.0
%14 = fcmp une double 10.0, 15.0
%15 = fcmp uno double 10.0, 15.0
%16 = fcmp true double 10.0, 15.0
ret void
}
define i1 @fcmp_4() {
; Fast-math flags.
%result = fcmp arcp fast ninf nnan nsz one double 42.0, 5.0
ret i1 %result
}
define i1 @fcmp_5() {
; Metadata.
%result = fcmp one double 42.0, 5.0, !foo !{!"bar"}, !baz !{!"qux"}
ret i1 %result
}
define i1 @fcmp_6() {
; Full instruction.
%result = fcmp arcp fast ninf nnan nsz one double 42.0, 5.0, !foo !{!"bar"}, !baz !{!"qux"}
ret i1 %result
}
; ~~~ [ phi ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
define i32 @phi_1(i1 %cond) {
entry:
; Plain instruction.
%result = phi i32 [ 42, %entry ]
ret i32 %result
}
define i32 @phi_2(i1 %cond) {
br i1 %cond, label %foo, label %bar
foo:
br label %baz
bar:
br label %baz
baz:
; Multiple incoming branches.
%result = phi i32 [ 42, %foo ], [ 37, %bar ]
ret i32 %result
}
define void @phi_3(i1 %cond) {
br i1 %cond, label %foo, label %bar
foo:
%x = fadd double 32.0, 10.0
br label %baz
bar:
br label %baz
baz:
; Incoming values of various types.
%1 = phi i32 [ 42, %foo ], [ 37, %bar ]
%2 = phi i32* [ null, %foo ], [ @g1, %bar ]
%3 = phi double [ %x, %foo ], [ 11.0, %bar ]
%4 = phi { i32 } [ { i32 42 }, %foo ], [ zeroinitializer, %bar ]
%5 = phi void ()* [ undef, %foo ], [ @j, %bar ]
ret void
}
define i32 @phi_4(i1 %cond) {
br i1 %cond, label %foo, label %bar
foo:
br label %baz
bar:
br label %baz
baz:
; Metadata.
%result = phi i32 [ 42, %foo ], [ 37, %bar ], !foo !{!"bar"}, !baz !{!"qux"}
ret i32 %result
}
; ~~~ [ select ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
define i32 @select_1(i1 %cond) {
; Plain instruction.
%result = select i1 %cond, i32 42, i32 37
ret i32 %result
}
define <2 x i32> @select_2(i1 %cond) {
; Vector operands.
%result = select i1 %cond, <2 x i32> <i32 42, i32 37>, <2 x i32> <i32 11, i32 22>
ret <2 x i32> %result
}
define i32 @select_3(i1 %cond) {
; Metadata.
%result = select i1 %cond, i32 42, i32 37, !foo !{!"bar"}, !baz !{!"qux"}
ret i32 %result
}
; ~~~ [ call ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
define i32 @f() {
ret i32 42
}
define i32 @call_1() {
; Plain instruction.
%result = call i32 @f()
ret i32 %result
}
define i32 @call_2() {
; Tail.
%result = tail call i32 @f()
ret i32 %result
}
define i32 @call_3() {
; Tail.
%result = musttail call i32 @f()
ret i32 %result
}
define i32 @call_4() {
; Tail.
%result = notail call i32 @f()
ret i32 %result
}
define double @g() {
ret double 42.0
}
define double @call_5() {
; Fast-math flags.
%result = call arcp fast ninf nnan nsz double @g()
ret double %result
}
define void @call_6() {
; Calling convention.
%1 = call amdgpu_cs i32 @f()
%2 = call amdgpu_gs i32 @f()
%3 = call amdgpu_kernel i32 @f()
%4 = call amdgpu_ps i32 @f()
%5 = call amdgpu_vs i32 @f()
%6 = call anyregcc i32 @f()
%7 = call arm_aapcs_vfpcc i32 @f()
%8 = call arm_aapcscc i32 @f()
%9 = call arm_apcscc i32 @f()
%10 = call avr_intrcc i32 @f()
%11 = call avr_signalcc i32 @f()
%12 = call cc 0 i32 @f()
%13 = call cc 8 i32 @f()
%14 = call cc 9 i32 @f()
%15 = call cc 10 i32 @f()
%16 = call cc 11 i32 @f()
%17 = call cc 12 i32 @f()
%18 = call cc 13 i32 @f()
%19 = call cc 14 i32 @f()
%20 = call cc 15 i32 @f()
%21 = call cc 16 i32 @f()
%22 = call cc 17 i32 @f()
%23 = call cc 64 i32 @f()
%24 = call cc 65 i32 @f()
%25 = call cc 66 i32 @f()
%26 = call cc 67 i32 @f()
%27 = call cc 68 i32 @f()
%28 = call cc 69 i32 @f()
%29 = call cc 70 i32 @f()
%30 = call cc 71 i32 @f()
%31 = call cc 72 i32 @f()
%32 = call cc 75 i32 @f()
%33 = call cc 76 i32 @f()
%34 = call cc 77 i32 @f()
%35 = call cc 78 i32 @f()
%36 = call cc 79 i32 @f()
%37 = call cc 80 i32 @f()
%38 = call cc 81 i32 @f()
%39 = call cc 82 i32 @f()
%40 = call cc 83 i32 @f()
%41 = call cc 84 i32 @f()
%42 = call cc 85 i32 @f()
%43 = call cc 86 i32 @f()
%44 = call cc 87 i32 @f()
%45 = call cc 88 i32 @f()
%46 = call cc 89 i32 @f()
%47 = call cc 90 i32 @f()
%48 = call cc 91 i32 @f()
%49 = call cc 92 i32 @f()
%50 = call ccc i32 @f()
%51 = call coldcc i32 @f()
%52 = call cxx_fast_tlscc i32 @f()
%53 = call fastcc i32 @f()
%54 = call ghccc i32 @f()
%55 = call hhvm_ccc i32 @f()
%56 = call hhvmcc i32 @f()
%57 = call intel_ocl_bicc i32 @f()
%58 = call msp430_intrcc i32 @f()
%59 = call preserve_allcc i32 @f()
%60 = call preserve_mostcc i32 @f()
%61 = call ptx_device i32 @f()
%62 = call ptx_kernel i32 @f()
%63 = call spir_func i32 @f()
%64 = call spir_kernel i32 @f()
%65 = call swiftcc i32 @f()
%66 = call webkit_jscc i32 @f()
%67 = call x86_64_sysvcc i32 @f()
%68 = call win64cc i32 @f()
%69 = call x86_fastcallcc i32 @f()
%70 = call x86_intrcc i32 @f()
%71 = call x86_regcallcc i32 @f()
%72 = call x86_stdcallcc i32 @f()
%73 = call x86_thiscallcc i32 @f()
%74 = call x86_vectorcallcc i32 @f()
ret void
}
define i32 ()* @h() {
ret i32 ()* @f
}
define void @call_7() {
; Return parameter attributes.
%1 = call "foo" "bar"="baz" align 8 dereferenceable(11) dereferenceable_or_null(22) inreg noalias i32 @f()
%2 = call nonnull i32 ()* @h()
%3 = call signext i32 @f()
%4 = call zeroext i32 @f()
ret void
}
define i32 @i(i32 %x, ...) {
ret i32 42
}
define i32 @call_8() {
; Callee with variadic arguments.
%result = call i32 (i32, ...) @i(i32 10, i32 20)
ret i32 %result
}
define i32 @call_9() {
; Callee from global identifier.
%result = call i32 @f()
ret i32 %result
}
define i32 @call_10(i32 ()* %callee) {
; Callee from function parameter.
%result = call i32 %callee()
ret i32 %result
}
declare void @j()
define i32 @call_11() {
; Callee from bitcast expression.
%result = call i32 bitcast (void ()* @j to i32 (i32)*)(i32 42)
ret i32 %result
}
define i32 @call_12() {
%callee = bitcast void ()* @j to i32 (i32)*
; Callee from bitcast instruction.
%result = call i32 %callee(i32 42)
ret i32 %result
}
define i32 @call_13(i32 ()** %p) {
%callee = load i32 ()*, i32 ()** %p
; Callee from load instruction.
%result = call i32 %callee()
ret i32 %result
}
define i32 @k(i32 %x, i32 %y) {
ret i32 42
}
define i32 @call_14() {
; Multiple arguments.
%result = call i32 @k(i32 11, i32 22)
ret i32 %result
}
define i32 @call_15() {
; Function attributes.
%result = call i32 @f() "foo" "bar"="baz" #0 alignstack(8) allocsize(8) allocsize(8, 16) alwaysinline argmemonly builtin cold convergent inaccessiblemem_or_argmemonly inaccessiblememonly inlinehint jumptable minsize naked nobuiltin noduplicate noimplicitfloat noinline nonlazybind norecurse noredzone noreturn nounwind optnone optsize readnone readonly returns_twice safestack sanitize_address sanitize_memory sanitize_thread ssp sspreq sspstrong uwtable writeonly
ret i32 %result
}
define void @l() {
ret void
}
define void @call_16() {
; Callee with void return type.
call void @l()
ret void
}
define i32 @call_17() {
; Metadata.
%result = call i32 @f(), !foo !{!"bar"}, !baz !{!"qux"}
ret i32 %result
}
define double @m(double %x, double %y) {
ret double 42.0
}
define double @call_18() {
; Full instruction.
%result = tail call arcp fast ninf nnan nsz ccc "foo" "bar"="baz" align 8 dereferenceable(11) dereferenceable_or_null(22) inreg noalias double @m(double 11.0, double 22.0) "foo" "bar"="baz" #0 alignstack(8) allocsize(8) allocsize(8, 16) alwaysinline argmemonly builtin cold convergent inaccessiblemem_or_argmemonly inaccessiblememonly inlinehint jumptable minsize naked nobuiltin noduplicate noimplicitfloat noinline nonlazybind norecurse noredzone noreturn nounwind optnone optsize readnone readonly returns_twice safestack sanitize_address sanitize_memory sanitize_thread ssp sspreq sspstrong uwtable writeonly, !foo !{!"bar"}, !baz !{!"qux"}
ret double %result
}
; ~~~ [ va_arg ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
define void @va_arg(i8* %p) {
va_arg i8* %p, float
ret void
}
; ~~~ [ landingpad ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
define void @landingpad() {
landingpad { i8*, i32 } cleanup
landingpad { i8*, i32 } catch i8* bitcast (i32* @g1 to i8*)
ret void
}
; ~~~ [ catchpad ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
define void @catchpad(i32* %arg1) {
catchpad:
%cs = catchswitch within none [label %catchpad] unwind to caller
catchpad within %cs []
ret void
}
; ~~~ [ cleanuppad ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
define void @cleanuppad() {
catchpad:
%cs = catchswitch within none [label %catchpad] unwind to caller
cleanuppad within none [i32 undef]
cleanuppad within %cs []
ret void
}
; ~~~ [ cleanupret ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
define void @cleanupret() {
catchpad:
%cp = cleanuppad within none []
cleanupret from %cp unwind to caller
cleanupret from %cp unwind label %continue
continue:
ret void
}
; ~~~ [ invoke ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
declare void @llvm.donothing() nounwind readnone
define void @invoke() {
normal:
invoke void @llvm.donothing() to label %normal unwind label %exception
invoke fastcc void @llvm.donothing() to label %normal unwind label %exception
exception:
ret void
}
attributes #0 = { "qux" }