1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -indvars < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" 4*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-apple-macosx10.11.0" 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; SCEVExpander would try to RAUW %val_2 with %c.lcssa, breaking "def 7*9880d681SAndroid Build Coastguard Worker; dominates uses". 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Workerdefine void @pr27232(i32 %val) { 10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @pr27232( 11*9880d681SAndroid Build Coastguard Workerentry: 12*9880d681SAndroid Build Coastguard Worker br i1 undef, label %loop_0.cond, label %for.body.us 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerfor.body.us: 15*9880d681SAndroid Build Coastguard Worker br label %loop_0.cond 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Workerloop_0.cond: 18*9880d681SAndroid Build Coastguard Worker %val_2 = phi i32 [ %val, %for.body.us ], [ undef, %entry ] 19*9880d681SAndroid Build Coastguard Worker br i1 true, label %loop_0.ph, label %loop_1.ph 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerloop_0.ph: 22*9880d681SAndroid Build Coastguard Worker br label %loop_0 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workerloop_1.exit: 25*9880d681SAndroid Build Coastguard Worker br label %loop_1.ph 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Workerloop_1.ph: 28*9880d681SAndroid Build Coastguard Worker %c.lcssa = phi i32 [ 0, %loop_0.cond ], [ %val_2, %loop_1.exit ] 29*9880d681SAndroid Build Coastguard Worker br label %loop_1 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Workerloop_0: 32*9880d681SAndroid Build Coastguard Worker br i1 undef, label %loop_0, label %loop_1.exit 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Workerloop_1: 35*9880d681SAndroid Build Coastguard Worker %d.1 = phi i32 [ %c.lcssa, %loop_1 ], [ %val_2, %loop_1.ph ] 36*9880d681SAndroid Build Coastguard Worker %t.1 = phi i32 [ %val_2, %loop_1 ], [ %c.lcssa, %loop_1.ph ] 37*9880d681SAndroid Build Coastguard Worker br i1 undef, label %leave, label %loop_1 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workerleave: 40*9880d681SAndroid Build Coastguard Worker ret void 41*9880d681SAndroid Build Coastguard Worker} 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker; @ReplaceArg_0 and @ReplaceArg_1 used to trigger a failed cast<> 45*9880d681SAndroid Build Coastguard Worker; assertion in SCEVExpander. 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Workerdefine void @ReplaceArg_0(i32 %val) { 48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @ReplaceArg_0( 49*9880d681SAndroid Build Coastguard Workerentry: 50*9880d681SAndroid Build Coastguard Worker br i1 undef, label %loop_0.cond, label %for.body.us 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Workerfor.body.us: 53*9880d681SAndroid Build Coastguard Worker br label %loop_0.cond 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Workerloop_0.cond: 56*9880d681SAndroid Build Coastguard Worker br i1 true, label %loop_0.ph, label %loop_1.ph 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Workerloop_0.ph: 59*9880d681SAndroid Build Coastguard Worker br label %loop_0 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Workerloop_1.exit: 62*9880d681SAndroid Build Coastguard Worker br label %loop_1.ph 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Workerloop_1.ph: 65*9880d681SAndroid Build Coastguard Worker %c.lcssa = phi i32 [ 0, %loop_0.cond ], [ %val, %loop_1.exit ] 66*9880d681SAndroid Build Coastguard Worker br label %loop_1 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Workerloop_0: 69*9880d681SAndroid Build Coastguard Worker br i1 undef, label %loop_0, label %loop_1.exit 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Workerloop_1: 72*9880d681SAndroid Build Coastguard Worker %d.1 = phi i32 [ %c.lcssa, %loop_1 ], [ %val, %loop_1.ph ] 73*9880d681SAndroid Build Coastguard Worker %t.1 = phi i32 [ %val, %loop_1 ], [ %c.lcssa, %loop_1.ph ] 74*9880d681SAndroid Build Coastguard Worker br i1 undef, label %leave, label %loop_1 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Workerleave: 77*9880d681SAndroid Build Coastguard Worker ret void 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workerdefine void @ReplaceArg_1(i32 %val) { 81*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @ReplaceArg_1( 82*9880d681SAndroid Build Coastguard Workerentry: 83*9880d681SAndroid Build Coastguard Worker br i1 undef, label %loop_0.cond, label %for.body.us 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Workerfor.body.us: 86*9880d681SAndroid Build Coastguard Worker br label %loop_0.cond 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Workerloop_0.cond: 89*9880d681SAndroid Build Coastguard Worker br i1 true, label %loop_0.ph, label %loop_1.ph 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Workerloop_0.ph: 92*9880d681SAndroid Build Coastguard Worker br label %loop_0 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Workerloop_1.exit: 95*9880d681SAndroid Build Coastguard Worker br label %loop_1.ph 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Workerloop_1.ph: 98*9880d681SAndroid Build Coastguard Worker %c.lcssa = phi i32 [ 0, %loop_0.cond ], [ %val, %loop_1.exit ] 99*9880d681SAndroid Build Coastguard Worker br label %loop_1 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Workerloop_0: 102*9880d681SAndroid Build Coastguard Worker br i1 undef, label %loop_0, label %loop_1.exit 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Workerloop_1: 105*9880d681SAndroid Build Coastguard Worker %t.1 = phi i32 [ %val, %loop_1 ], [ %c.lcssa, %loop_1.ph ] 106*9880d681SAndroid Build Coastguard Worker %d.1 = phi i32 [ %c.lcssa, %loop_1 ], [ %val, %loop_1.ph ] 107*9880d681SAndroid Build Coastguard Worker br i1 undef, label %leave, label %loop_1 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Workerleave: 110*9880d681SAndroid Build Coastguard Worker ret void 111*9880d681SAndroid Build Coastguard Worker} 112