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