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