1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -simplifycfg < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.experimental.guard(i1, ...) 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdefine i32 @f_0(i1 %c) { 6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @f_0( 7*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry: 8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 false) [ "deopt"() ] 9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unreachable 10*9880d681SAndroid Build Coastguard Workerentry: 11*9880d681SAndroid Build Coastguard Worker call void(i1, ...) @llvm.experimental.guard(i1 false) [ "deopt"() ] 12*9880d681SAndroid Build Coastguard Worker ret i32 10 13*9880d681SAndroid Build Coastguard Worker} 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerdefine i32 @f_1(i1 %c) { 16*9880d681SAndroid Build Coastguard Worker; Demonstrate that we (intentionally) do not simplify a guard on undef 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @f_1( 19*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 10 20*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 20 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerentry: 23*9880d681SAndroid Build Coastguard Worker br i1 %c, label %true, label %false 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workertrue: 26*9880d681SAndroid Build Coastguard Worker call void(i1, ...) @llvm.experimental.guard(i1 undef) [ "deopt"() ] 27*9880d681SAndroid Build Coastguard Worker ret i32 10 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerfalse: 30*9880d681SAndroid Build Coastguard Worker ret i32 20 31*9880d681SAndroid Build Coastguard Worker} 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workerdefine i32 @f_2(i1 %c, i32* %buf) { 34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @f_2( 35*9880d681SAndroid Build Coastguard Workerentry: 36*9880d681SAndroid Build Coastguard Worker br i1 %c, label %guard_block, label %merge_block 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerguard_block: 39*9880d681SAndroid Build Coastguard Worker call void(i1, ...) @llvm.experimental.guard(i1 false) [ "deopt"() ] 40*9880d681SAndroid Build Coastguard Worker %val = load i32, i32* %buf 41*9880d681SAndroid Build Coastguard Worker br label %merge_block 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Workermerge_block: 44*9880d681SAndroid Build Coastguard Worker %to.return = phi i32 [ %val, %guard_block ], [ 50, %entry ] 45*9880d681SAndroid Build Coastguard Worker ret i32 %to.return 46*9880d681SAndroid Build Coastguard Worker; CHECK: guard_block: 47*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 false) [ "deopt"() ] 48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unreachable 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker; CHECK: merge_block: 51*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 50 52*9880d681SAndroid Build Coastguard Worker} 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerdefine i32 @f_3(i1* %c, i32* %buf) { 55*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @f_3( 56*9880d681SAndroid Build Coastguard Workerentry: 57*9880d681SAndroid Build Coastguard Worker %c0 = load volatile i1, i1* %c 58*9880d681SAndroid Build Coastguard Worker br i1 %c0, label %guard_block, label %merge_block 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Workerguard_block: 61*9880d681SAndroid Build Coastguard Worker call void(i1, ...) @llvm.experimental.guard(i1 false) [ "deopt"() ] 62*9880d681SAndroid Build Coastguard Worker %val = load i32, i32* %buf 63*9880d681SAndroid Build Coastguard Worker %c2 = load volatile i1, i1* %c 64*9880d681SAndroid Build Coastguard Worker br i1 %c2, label %left, label %right 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Workermerge_block: 67*9880d681SAndroid Build Coastguard Worker %c1 = load volatile i1, i1* %c 68*9880d681SAndroid Build Coastguard Worker br i1 %c1, label %left, label %right 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Workerleft: 71*9880d681SAndroid Build Coastguard Worker %val.left = phi i32 [ %val, %guard_block ], [ 50, %merge_block ] 72*9880d681SAndroid Build Coastguard Worker ret i32 %val.left 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Workerright: 75*9880d681SAndroid Build Coastguard Worker %val.right = phi i32 [ %val, %guard_block ], [ 100, %merge_block ] 76*9880d681SAndroid Build Coastguard Worker ret i32 %val.right 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker; CHECK: guard_block: 79*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 false) [ "deopt"() ] 80*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unreachable 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker; CHECK: merge_block: 83*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %c1 = load volatile i1, i1* %c 84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[VAL:%[^ ]]] = select i1 %c1, i32 50, i32 100 85*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[VAL]] 86*9880d681SAndroid Build Coastguard Worker} 87