xref: /aosp_15_r20/external/llvm/test/Transforms/LowerGuardIntrinsic/basic.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -lower-guard-intrinsic < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.experimental.guard(i1, ...)
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdefine i8 @f_basic(i1* %c_ptr) {
6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @f_basic(
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Worker  %c = load volatile i1, i1* %c_ptr
9*9880d681SAndroid Build Coastguard Worker  call void(i1, ...) @llvm.experimental.guard(i1 %c, i32 1) [ "deopt"(i32 1) ]
10*9880d681SAndroid Build Coastguard Worker  ret i8 5
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Worker; CHECK:  br i1 %c, label %guarded, label %deopt, !prof !0
13*9880d681SAndroid Build Coastguard Worker; CHECK: deopt:
14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %deoptcall = call i8 (...) @llvm.experimental.deoptimize.i8(i32 1) [ "deopt"(i32 1) ]
15*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret i8 %deoptcall
16*9880d681SAndroid Build Coastguard Worker; CHECK: guarded:
17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret i8 5
18*9880d681SAndroid Build Coastguard Worker}
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Workerdefine void @f_void_return_ty(i1* %c_ptr) {
21*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @f_void_return_ty(
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Worker  %c = load volatile i1, i1* %c_ptr
24*9880d681SAndroid Build Coastguard Worker  call void(i1, ...) @llvm.experimental.guard(i1 %c, i32 1) [ "deopt"() ]
25*9880d681SAndroid Build Coastguard Worker  ret void
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker; CHECK:  br i1 %c, label %guarded, label %deopt, !prof !0
28*9880d681SAndroid Build Coastguard Worker; CHECK: deopt:
29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  call void (...) @llvm.experimental.deoptimize.isVoid(i32 1) [ "deopt"() ]
30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret void
31*9880d681SAndroid Build Coastguard Worker; CHECK: guarded:
32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret void
33*9880d681SAndroid Build Coastguard Worker}
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Workerdefine void @f_multiple_args(i1* %c_ptr) {
36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @f_multiple_args(
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker  %c = load volatile i1, i1* %c_ptr
39*9880d681SAndroid Build Coastguard Worker  call void(i1, ...) @llvm.experimental.guard(i1 %c, i32 1, i32 2, double 500.0) [ "deopt"(i32 2, i32 3) ]
40*9880d681SAndroid Build Coastguard Worker  ret void
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %c, label %guarded, label %deopt, !prof !0
43*9880d681SAndroid Build Coastguard Worker; CHECK: deopt:
44*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  call void (...) @llvm.experimental.deoptimize.isVoid(i32 1, i32 2, double 5.000000e+02) [ "deopt"(i32 2, i32 3) ]
45*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret void
46*9880d681SAndroid Build Coastguard Worker; CHECK: guarded:
47*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret void
48*9880d681SAndroid Build Coastguard Worker}
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Workerdefine i32 @f_zero_args(i1* %c_ptr) {
51*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @f_zero_args(
52*9880d681SAndroid Build Coastguard Worker  %c = load volatile i1, i1* %c_ptr
53*9880d681SAndroid Build Coastguard Worker  call void(i1, ...) @llvm.experimental.guard(i1 %c) [ "deopt"(i32 2, i32 3) ]
54*9880d681SAndroid Build Coastguard Worker  ret i32 500
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %c, label %guarded, label %deopt, !prof !0
57*9880d681SAndroid Build Coastguard Worker; CHECK: deopt:
58*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"(i32 2, i32 3) ]
59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret i32 %deoptcall
60*9880d681SAndroid Build Coastguard Worker; CHECK: guarded:
61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret i32 500
62*9880d681SAndroid Build Coastguard Worker}
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Workerdefine i8 @f_with_make_implicit_md(i32* %ptr) {
65*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @f_with_make_implicit_md(
66*9880d681SAndroid Build Coastguard Worker; CHECK:  br i1 %notNull, label %guarded, label %deopt, !prof !0, !make.implicit !1
67*9880d681SAndroid Build Coastguard Worker; CHECK: deopt:
68*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %deoptcall = call i8 (...) @llvm.experimental.deoptimize.i8(i32 1) [ "deopt"(i32 1) ]
69*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret i8 %deoptcall
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Worker  %notNull = icmp ne i32* %ptr, null
72*9880d681SAndroid Build Coastguard Worker  call void(i1, ...) @llvm.experimental.guard(i1 %notNull, i32 1) [ "deopt"(i32 1) ], !make.implicit !{}
73*9880d681SAndroid Build Coastguard Worker  ret i8 5
74*9880d681SAndroid Build Coastguard Worker}
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Worker!0 = !{!"branch_weights", i32 1048576, i32 1}
77