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