1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -simplifycfg -phi-node-folding-threshold=2 -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" 4*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-unknown-linux-gnu" 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i32 %a, i32 %b, i32 %c) nounwind { 7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1( 8*9880d681SAndroid Build Coastguard Workerentry: 9*9880d681SAndroid Build Coastguard Worker %tmp1 = icmp eq i32 %b, 0 10*9880d681SAndroid Build Coastguard Worker br i1 %tmp1, label %bb1, label %bb3 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerbb1: ; preds = %entry 13*9880d681SAndroid Build Coastguard Worker %tmp2 = icmp sgt i32 %c, 1 14*9880d681SAndroid Build Coastguard Worker br i1 %tmp2, label %bb2, label %bb3 15*9880d681SAndroid Build Coastguard Worker; CHECK: bb1: 16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp sgt i32 %c, 1 17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add i32 %a, 1 18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select i1 %tmp2, i32 %tmp3, i32 %a 19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br label %bb3 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerbb2: ; preds = bb1 22*9880d681SAndroid Build Coastguard Worker %tmp3 = add i32 %a, 1 23*9880d681SAndroid Build Coastguard Worker br label %bb3 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerbb3: ; preds = %bb2, %entry 26*9880d681SAndroid Build Coastguard Worker %tmp4 = phi i32 [ %b, %entry ], [ %a, %bb1 ], [ %tmp3, %bb2 ] 27*9880d681SAndroid Build Coastguard Worker %tmp5 = sub i32 %tmp4, 1 28*9880d681SAndroid Build Coastguard Worker ret i32 %tmp5 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Workerdefine i8* @test4(i1* %dummy, i8* %a, i8* %b) { 32*9880d681SAndroid Build Coastguard Worker; Test that we don't speculate an arbitrarily large number of unfolded constant 33*9880d681SAndroid Build Coastguard Worker; expressions. 34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4( 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workerentry: 37*9880d681SAndroid Build Coastguard Worker %cond1 = load volatile i1, i1* %dummy 38*9880d681SAndroid Build Coastguard Worker br i1 %cond1, label %if, label %end 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Workerif: 41*9880d681SAndroid Build Coastguard Worker %cond2 = load volatile i1, i1* %dummy 42*9880d681SAndroid Build Coastguard Worker br i1 %cond2, label %then, label %end 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Workerthen: 45*9880d681SAndroid Build Coastguard Worker br label %end 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Workerend: 48*9880d681SAndroid Build Coastguard Worker %x1 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 1 to i8*), %then ] 49*9880d681SAndroid Build Coastguard Worker %x2 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 2 to i8*), %then ] 50*9880d681SAndroid Build Coastguard Worker %x3 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 3 to i8*), %then ] 51*9880d681SAndroid Build Coastguard Worker %x4 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 4 to i8*), %then ] 52*9880d681SAndroid Build Coastguard Worker %x5 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 5 to i8*), %then ] 53*9880d681SAndroid Build Coastguard Worker %x6 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 6 to i8*), %then ] 54*9880d681SAndroid Build Coastguard Worker %x7 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 7 to i8*), %then ] 55*9880d681SAndroid Build Coastguard Worker %x8 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 8 to i8*), %then ] 56*9880d681SAndroid Build Coastguard Worker %x9 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 9 to i8*), %then ] 57*9880d681SAndroid Build Coastguard Worker %x10 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 10 to i8*), %then ] 58*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: select 59*9880d681SAndroid Build Coastguard Worker; CHECK: phi i8* 60*9880d681SAndroid Build Coastguard Worker; CHECK: phi i8* 61*9880d681SAndroid Build Coastguard Worker; CHECK: phi i8* 62*9880d681SAndroid Build Coastguard Worker; CHECK: phi i8* 63*9880d681SAndroid Build Coastguard Worker; CHECK: phi i8* 64*9880d681SAndroid Build Coastguard Worker; CHECK: phi i8* 65*9880d681SAndroid Build Coastguard Worker; CHECK: phi i8* 66*9880d681SAndroid Build Coastguard Worker; CHECK: phi i8* 67*9880d681SAndroid Build Coastguard Worker; CHECK: phi i8* 68*9880d681SAndroid Build Coastguard Worker; CHECK: phi i8* 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Worker ret i8* %x10 71*9880d681SAndroid Build Coastguard Worker} 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Workerdefine i32* @test5(i32 %a, i32 %b, i32 %c, i32* dereferenceable(10) %ptr1, 74*9880d681SAndroid Build Coastguard Worker i32* dereferenceable(10) %ptr2, i32** dereferenceable(10) %ptr3) nounwind { 75*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5( 76*9880d681SAndroid Build Coastguard Workerentry: 77*9880d681SAndroid Build Coastguard Worker %tmp1 = icmp eq i32 %b, 0 78*9880d681SAndroid Build Coastguard Worker br i1 %tmp1, label %bb1, label %bb3 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workerbb1: ; preds = %entry 81*9880d681SAndroid Build Coastguard Worker %tmp2 = icmp sgt i32 %c, 1 82*9880d681SAndroid Build Coastguard Worker br i1 %tmp2, label %bb2, label %bb3 83*9880d681SAndroid Build Coastguard Worker; CHECK: bb1: 84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp sgt i32 %c, 1 85*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: load i32*, i32** %ptr3 86*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: dereferenceable 87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select i1 %tmp2, i32* %tmp3, i32* %ptr2 88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32* %tmp3.ptr2 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Workerbb2: ; preds = bb1 91*9880d681SAndroid Build Coastguard Worker %tmp3 = load i32*, i32** %ptr3, !dereferenceable !{i64 10} 92*9880d681SAndroid Build Coastguard Worker br label %bb3 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Workerbb3: ; preds = %bb2, %entry 95*9880d681SAndroid Build Coastguard Worker %tmp4 = phi i32* [ %ptr1, %entry ], [ %ptr2, %bb1 ], [ %tmp3, %bb2 ] 96*9880d681SAndroid Build Coastguard Worker ret i32* %tmp4 97*9880d681SAndroid Build Coastguard Worker} 98