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