blob: 6c1dd95331ab602c7edf8403fc8707a2273f3ad7 [file] [log] [blame]
Sanjoy Das021de052016-03-31 00:18:46 +00001; RUN: opt -S -lower-guard-intrinsic < %s | FileCheck %s
Michael Kupersteine45d4d92016-07-28 22:08:41 +00002; RUN: opt -S -passes='lower-guard-intrinsic' < %s | FileCheck %s
Sanjoy Das021de052016-03-31 00:18:46 +00003
4declare void @llvm.experimental.guard(i1, ...)
5
6define i8 @f_basic(i1* %c_ptr) {
7; CHECK-LABEL: @f_basic(
8
9 %c = load volatile i1, i1* %c_ptr
10 call void(i1, ...) @llvm.experimental.guard(i1 %c, i32 1) [ "deopt"(i32 1) ]
11 ret i8 5
12
Sanjoy Dasfd670382016-05-17 17:51:19 +000013; CHECK: br i1 %c, label %guarded, label %deopt, !prof !0
Sanjoy Das021de052016-03-31 00:18:46 +000014; 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(i1* %c_ptr) {
22; CHECK-LABEL: @f_void_return_ty(
23
24 %c = load volatile i1, i1* %c_ptr
25 call void(i1, ...) @llvm.experimental.guard(i1 %c, i32 1) [ "deopt"() ]
26 ret void
27
Sanjoy Dasfd670382016-05-17 17:51:19 +000028; CHECK: br i1 %c, label %guarded, label %deopt, !prof !0
Sanjoy Das021de052016-03-31 00:18:46 +000029; 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(i1* %c_ptr) {
37; CHECK-LABEL: @f_multiple_args(
38
39 %c = load volatile i1, i1* %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
Sanjoy Dasfd670382016-05-17 17:51:19 +000043; CHECK: br i1 %c, label %guarded, label %deopt, !prof !0
Sanjoy Das021de052016-03-31 00:18:46 +000044; 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(i1* %c_ptr) {
52; CHECK-LABEL: @f_zero_args(
53 %c = load volatile i1, i1* %c_ptr
54 call void(i1, ...) @llvm.experimental.guard(i1 %c) [ "deopt"(i32 2, i32 3) ]
55 ret i32 500
56
Sanjoy Dasfd670382016-05-17 17:51:19 +000057; CHECK: br i1 %c, label %guarded, label %deopt, !prof !0
Sanjoy Das021de052016-03-31 00:18:46 +000058; 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}
Sanjoy Das47cf2af2016-04-30 00:55:59 +000064
65define i8 @f_with_make_implicit_md(i32* %ptr) {
66; CHECK-LABEL: @f_with_make_implicit_md(
Sanjoy Dasfd670382016-05-17 17:51:19 +000067; CHECK: br i1 %notNull, label %guarded, label %deopt, !prof !0, !make.implicit !1
Sanjoy Das47cf2af2016-04-30 00:55:59 +000068; 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 i32* %ptr, null
73 call void(i1, ...) @llvm.experimental.guard(i1 %notNull, i32 1) [ "deopt"(i32 1) ], !make.implicit !{}
74 ret i8 5
75}
Sanjoy Dasfd670382016-05-17 17:51:19 +000076
77!0 = !{!"branch_weights", i32 1048576, i32 1}