1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -basicaa -gvn -enable-load-pre -S | FileCheck %s 2*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" 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i32* %p, i1 %C) { 5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1( 6*9880d681SAndroid Build Coastguard Workerblock1: 7*9880d681SAndroid Build Coastguard Worker br i1 %C, label %block2, label %block3 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Workerblock2: 10*9880d681SAndroid Build Coastguard Worker br label %block4 11*9880d681SAndroid Build Coastguard Worker; CHECK: block2: 12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: load i32, i32* %p 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerblock3: 15*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %p 16*9880d681SAndroid Build Coastguard Worker br label %block4 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Workerblock4: 19*9880d681SAndroid Build Coastguard Worker %PRE = load i32, i32* %p 20*9880d681SAndroid Build Coastguard Worker ret i32 %PRE 21*9880d681SAndroid Build Coastguard Worker; CHECK: block4: 22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: phi i32 23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 24*9880d681SAndroid Build Coastguard Worker} 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Worker; This is a simple phi translation case. 27*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i32* %p, i32* %q, i1 %C) { 28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2( 29*9880d681SAndroid Build Coastguard Workerblock1: 30*9880d681SAndroid Build Coastguard Worker br i1 %C, label %block2, label %block3 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Workerblock2: 33*9880d681SAndroid Build Coastguard Worker br label %block4 34*9880d681SAndroid Build Coastguard Worker; CHECK: block2: 35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: load i32, i32* %q 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workerblock3: 38*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %p 39*9880d681SAndroid Build Coastguard Worker br label %block4 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Workerblock4: 42*9880d681SAndroid Build Coastguard Worker %P2 = phi i32* [%p, %block3], [%q, %block2] 43*9880d681SAndroid Build Coastguard Worker %PRE = load i32, i32* %P2 44*9880d681SAndroid Build Coastguard Worker ret i32 %PRE 45*9880d681SAndroid Build Coastguard Worker; CHECK: block4: 46*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: phi i32 [ 47*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load 48*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker; This is a PRE case that requires phi translation through a GEP. 52*9880d681SAndroid Build Coastguard Workerdefine i32 @test3(i32* %p, i32* %q, i32** %Hack, i1 %C) { 53*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3( 54*9880d681SAndroid Build Coastguard Workerblock1: 55*9880d681SAndroid Build Coastguard Worker %B = getelementptr i32, i32* %q, i32 1 56*9880d681SAndroid Build Coastguard Worker store i32* %B, i32** %Hack 57*9880d681SAndroid Build Coastguard Worker br i1 %C, label %block2, label %block3 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerblock2: 60*9880d681SAndroid Build Coastguard Worker br label %block4 61*9880d681SAndroid Build Coastguard Worker; CHECK: block2: 62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: load i32, i32* %B 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Workerblock3: 65*9880d681SAndroid Build Coastguard Worker %A = getelementptr i32, i32* %p, i32 1 66*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %A 67*9880d681SAndroid Build Coastguard Worker br label %block4 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Workerblock4: 70*9880d681SAndroid Build Coastguard Worker %P2 = phi i32* [%p, %block3], [%q, %block2] 71*9880d681SAndroid Build Coastguard Worker %P3 = getelementptr i32, i32* %P2, i32 1 72*9880d681SAndroid Build Coastguard Worker %PRE = load i32, i32* %P3 73*9880d681SAndroid Build Coastguard Worker ret i32 %PRE 74*9880d681SAndroid Build Coastguard Worker; CHECK: block4: 75*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: phi i32 [ 76*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load 77*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker;; Here the loaded address is available, but the computation is in 'block3' 81*9880d681SAndroid Build Coastguard Worker;; which does not dominate 'block2'. 82*9880d681SAndroid Build Coastguard Workerdefine i32 @test4(i32* %p, i32* %q, i32** %Hack, i1 %C) { 83*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4( 84*9880d681SAndroid Build Coastguard Workerblock1: 85*9880d681SAndroid Build Coastguard Worker br i1 %C, label %block2, label %block3 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workerblock2: 88*9880d681SAndroid Build Coastguard Worker br label %block4 89*9880d681SAndroid Build Coastguard Worker; CHECK: block2: 90*9880d681SAndroid Build Coastguard Worker; CHECK: load i32, i32* 91*9880d681SAndroid Build Coastguard Worker; CHECK: br label %block4 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Workerblock3: 94*9880d681SAndroid Build Coastguard Worker %B = getelementptr i32, i32* %q, i32 1 95*9880d681SAndroid Build Coastguard Worker store i32* %B, i32** %Hack 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Worker %A = getelementptr i32, i32* %p, i32 1 98*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %A 99*9880d681SAndroid Build Coastguard Worker br label %block4 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Workerblock4: 102*9880d681SAndroid Build Coastguard Worker %P2 = phi i32* [%p, %block3], [%q, %block2] 103*9880d681SAndroid Build Coastguard Worker %P3 = getelementptr i32, i32* %P2, i32 1 104*9880d681SAndroid Build Coastguard Worker %PRE = load i32, i32* %P3 105*9880d681SAndroid Build Coastguard Worker ret i32 %PRE 106*9880d681SAndroid Build Coastguard Worker; CHECK: block4: 107*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: phi i32 [ 108*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load 109*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 110*9880d681SAndroid Build Coastguard Worker} 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Worker;void test5(int N, double *G) { 113*9880d681SAndroid Build Coastguard Worker; int j; 114*9880d681SAndroid Build Coastguard Worker; for (j = 0; j < N - 1; j++) 115*9880d681SAndroid Build Coastguard Worker; G[j] = G[j] + G[j+1]; 116*9880d681SAndroid Build Coastguard Worker;} 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Workerdefine void @test5(i32 %N, double* nocapture %G) nounwind ssp { 119*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5( 120*9880d681SAndroid Build Coastguard Workerentry: 121*9880d681SAndroid Build Coastguard Worker %0 = add i32 %N, -1 122*9880d681SAndroid Build Coastguard Worker %1 = icmp sgt i32 %0, 0 123*9880d681SAndroid Build Coastguard Worker br i1 %1, label %bb.nph, label %return 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Workerbb.nph: 126*9880d681SAndroid Build Coastguard Worker %tmp = zext i32 %0 to i64 127*9880d681SAndroid Build Coastguard Worker br label %bb 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Worker; CHECK: bb.nph: 130*9880d681SAndroid Build Coastguard Worker; CHECK: load double, double* 131*9880d681SAndroid Build Coastguard Worker; CHECK: br label %bb 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Workerbb: 134*9880d681SAndroid Build Coastguard Worker %indvar = phi i64 [ 0, %bb.nph ], [ %tmp6, %bb ] 135*9880d681SAndroid Build Coastguard Worker %tmp6 = add i64 %indvar, 1 136*9880d681SAndroid Build Coastguard Worker %scevgep = getelementptr double, double* %G, i64 %tmp6 137*9880d681SAndroid Build Coastguard Worker %scevgep7 = getelementptr double, double* %G, i64 %indvar 138*9880d681SAndroid Build Coastguard Worker %2 = load double, double* %scevgep7, align 8 139*9880d681SAndroid Build Coastguard Worker %3 = load double, double* %scevgep, align 8 140*9880d681SAndroid Build Coastguard Worker %4 = fadd double %2, %3 141*9880d681SAndroid Build Coastguard Worker store double %4, double* %scevgep7, align 8 142*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i64 %tmp6, %tmp 143*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %return, label %bb 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Worker; Should only be one load in the loop. 146*9880d681SAndroid Build Coastguard Worker; CHECK: bb: 147*9880d681SAndroid Build Coastguard Worker; CHECK: load double, double* 148*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load double, double* 149*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %exitcond 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Workerreturn: 152*9880d681SAndroid Build Coastguard Worker ret void 153*9880d681SAndroid Build Coastguard Worker} 154*9880d681SAndroid Build Coastguard Worker 155*9880d681SAndroid Build Coastguard Worker;void test6(int N, double *G) { 156*9880d681SAndroid Build Coastguard Worker; int j; 157*9880d681SAndroid Build Coastguard Worker; for (j = 0; j < N - 1; j++) 158*9880d681SAndroid Build Coastguard Worker; G[j+1] = G[j] + G[j+1]; 159*9880d681SAndroid Build Coastguard Worker;} 160*9880d681SAndroid Build Coastguard Worker 161*9880d681SAndroid Build Coastguard Workerdefine void @test6(i32 %N, double* nocapture %G) nounwind ssp { 162*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6( 163*9880d681SAndroid Build Coastguard Workerentry: 164*9880d681SAndroid Build Coastguard Worker %0 = add i32 %N, -1 165*9880d681SAndroid Build Coastguard Worker %1 = icmp sgt i32 %0, 0 166*9880d681SAndroid Build Coastguard Worker br i1 %1, label %bb.nph, label %return 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Workerbb.nph: 169*9880d681SAndroid Build Coastguard Worker %tmp = zext i32 %0 to i64 170*9880d681SAndroid Build Coastguard Worker br label %bb 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Worker; CHECK: bb.nph: 173*9880d681SAndroid Build Coastguard Worker; CHECK: load double, double* 174*9880d681SAndroid Build Coastguard Worker; CHECK: br label %bb 175*9880d681SAndroid Build Coastguard Worker 176*9880d681SAndroid Build Coastguard Workerbb: 177*9880d681SAndroid Build Coastguard Worker %indvar = phi i64 [ 0, %bb.nph ], [ %tmp6, %bb ] 178*9880d681SAndroid Build Coastguard Worker %tmp6 = add i64 %indvar, 1 179*9880d681SAndroid Build Coastguard Worker %scevgep = getelementptr double, double* %G, i64 %tmp6 180*9880d681SAndroid Build Coastguard Worker %scevgep7 = getelementptr double, double* %G, i64 %indvar 181*9880d681SAndroid Build Coastguard Worker %2 = load double, double* %scevgep7, align 8 182*9880d681SAndroid Build Coastguard Worker %3 = load double, double* %scevgep, align 8 183*9880d681SAndroid Build Coastguard Worker %4 = fadd double %2, %3 184*9880d681SAndroid Build Coastguard Worker store double %4, double* %scevgep, align 8 185*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i64 %tmp6, %tmp 186*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %return, label %bb 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Worker; Should only be one load in the loop. 189*9880d681SAndroid Build Coastguard Worker; CHECK: bb: 190*9880d681SAndroid Build Coastguard Worker; CHECK: load double, double* 191*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load double, double* 192*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %exitcond 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Workerreturn: 195*9880d681SAndroid Build Coastguard Worker ret void 196*9880d681SAndroid Build Coastguard Worker} 197*9880d681SAndroid Build Coastguard Worker 198*9880d681SAndroid Build Coastguard Worker;void test7(int N, double* G) { 199*9880d681SAndroid Build Coastguard Worker; long j; 200*9880d681SAndroid Build Coastguard Worker; G[1] = 1; 201*9880d681SAndroid Build Coastguard Worker; for (j = 1; j < N - 1; j++) 202*9880d681SAndroid Build Coastguard Worker; G[j+1] = G[j] + G[j+1]; 203*9880d681SAndroid Build Coastguard Worker;} 204*9880d681SAndroid Build Coastguard Worker 205*9880d681SAndroid Build Coastguard Worker; This requires phi translation of the adds. 206*9880d681SAndroid Build Coastguard Workerdefine void @test7(i32 %N, double* nocapture %G) nounwind ssp { 207*9880d681SAndroid Build Coastguard Workerentry: 208*9880d681SAndroid Build Coastguard Worker %0 = getelementptr inbounds double, double* %G, i64 1 209*9880d681SAndroid Build Coastguard Worker store double 1.000000e+00, double* %0, align 8 210*9880d681SAndroid Build Coastguard Worker %1 = add i32 %N, -1 211*9880d681SAndroid Build Coastguard Worker %2 = icmp sgt i32 %1, 1 212*9880d681SAndroid Build Coastguard Worker br i1 %2, label %bb.nph, label %return 213*9880d681SAndroid Build Coastguard Worker 214*9880d681SAndroid Build Coastguard Workerbb.nph: 215*9880d681SAndroid Build Coastguard Worker %tmp = sext i32 %1 to i64 216*9880d681SAndroid Build Coastguard Worker %tmp7 = add i64 %tmp, -1 217*9880d681SAndroid Build Coastguard Worker br label %bb 218*9880d681SAndroid Build Coastguard Worker 219*9880d681SAndroid Build Coastguard Workerbb: 220*9880d681SAndroid Build Coastguard Worker %indvar = phi i64 [ 0, %bb.nph ], [ %tmp9, %bb ] 221*9880d681SAndroid Build Coastguard Worker %tmp8 = add i64 %indvar, 2 222*9880d681SAndroid Build Coastguard Worker %scevgep = getelementptr double, double* %G, i64 %tmp8 223*9880d681SAndroid Build Coastguard Worker %tmp9 = add i64 %indvar, 1 224*9880d681SAndroid Build Coastguard Worker %scevgep10 = getelementptr double, double* %G, i64 %tmp9 225*9880d681SAndroid Build Coastguard Worker %3 = load double, double* %scevgep10, align 8 226*9880d681SAndroid Build Coastguard Worker %4 = load double, double* %scevgep, align 8 227*9880d681SAndroid Build Coastguard Worker %5 = fadd double %3, %4 228*9880d681SAndroid Build Coastguard Worker store double %5, double* %scevgep, align 8 229*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i64 %tmp9, %tmp7 230*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %return, label %bb 231*9880d681SAndroid Build Coastguard Worker 232*9880d681SAndroid Build Coastguard Worker; Should only be one load in the loop. 233*9880d681SAndroid Build Coastguard Worker; CHECK: bb: 234*9880d681SAndroid Build Coastguard Worker; CHECK: load double, double* 235*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load double, double* 236*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %exitcond 237*9880d681SAndroid Build Coastguard Worker 238*9880d681SAndroid Build Coastguard Workerreturn: 239*9880d681SAndroid Build Coastguard Worker ret void 240*9880d681SAndroid Build Coastguard Worker} 241*9880d681SAndroid Build Coastguard Worker 242*9880d681SAndroid Build Coastguard Worker;; Here the loaded address isn't available in 'block2' at all, requiring a new 243*9880d681SAndroid Build Coastguard Worker;; GEP to be inserted into it. 244*9880d681SAndroid Build Coastguard Workerdefine i32 @test8(i32* %p, i32* %q, i32** %Hack, i1 %C) { 245*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8( 246*9880d681SAndroid Build Coastguard Workerblock1: 247*9880d681SAndroid Build Coastguard Worker br i1 %C, label %block2, label %block3 248*9880d681SAndroid Build Coastguard Worker 249*9880d681SAndroid Build Coastguard Workerblock2: 250*9880d681SAndroid Build Coastguard Worker br label %block4 251*9880d681SAndroid Build Coastguard Worker; CHECK: block2: 252*9880d681SAndroid Build Coastguard Worker; CHECK: load i32, i32* 253*9880d681SAndroid Build Coastguard Worker; CHECK: br label %block4 254*9880d681SAndroid Build Coastguard Worker 255*9880d681SAndroid Build Coastguard Workerblock3: 256*9880d681SAndroid Build Coastguard Worker %A = getelementptr i32, i32* %p, i32 1 257*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %A 258*9880d681SAndroid Build Coastguard Worker br label %block4 259*9880d681SAndroid Build Coastguard Worker 260*9880d681SAndroid Build Coastguard Workerblock4: 261*9880d681SAndroid Build Coastguard Worker %P2 = phi i32* [%p, %block3], [%q, %block2] 262*9880d681SAndroid Build Coastguard Worker %P3 = getelementptr i32, i32* %P2, i32 1 263*9880d681SAndroid Build Coastguard Worker %PRE = load i32, i32* %P3 264*9880d681SAndroid Build Coastguard Worker ret i32 %PRE 265*9880d681SAndroid Build Coastguard Worker; CHECK: block4: 266*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: phi i32 [ 267*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load 268*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 269*9880d681SAndroid Build Coastguard Worker} 270*9880d681SAndroid Build Coastguard Worker 271*9880d681SAndroid Build Coastguard Worker;void test9(int N, double* G) { 272*9880d681SAndroid Build Coastguard Worker; long j; 273*9880d681SAndroid Build Coastguard Worker; for (j = 1; j < N - 1; j++) 274*9880d681SAndroid Build Coastguard Worker; G[j+1] = G[j] + G[j+1]; 275*9880d681SAndroid Build Coastguard Worker;} 276*9880d681SAndroid Build Coastguard Worker 277*9880d681SAndroid Build Coastguard Worker; This requires phi translation of the adds. 278*9880d681SAndroid Build Coastguard Workerdefine void @test9(i32 %N, double* nocapture %G) nounwind ssp { 279*9880d681SAndroid Build Coastguard Workerentry: 280*9880d681SAndroid Build Coastguard Worker add i32 0, 0 281*9880d681SAndroid Build Coastguard Worker %1 = add i32 %N, -1 282*9880d681SAndroid Build Coastguard Worker %2 = icmp sgt i32 %1, 1 283*9880d681SAndroid Build Coastguard Worker br i1 %2, label %bb.nph, label %return 284*9880d681SAndroid Build Coastguard Worker 285*9880d681SAndroid Build Coastguard Workerbb.nph: 286*9880d681SAndroid Build Coastguard Worker %tmp = sext i32 %1 to i64 287*9880d681SAndroid Build Coastguard Worker %tmp7 = add i64 %tmp, -1 288*9880d681SAndroid Build Coastguard Worker br label %bb 289*9880d681SAndroid Build Coastguard Worker 290*9880d681SAndroid Build Coastguard Worker; CHECK: bb.nph: 291*9880d681SAndroid Build Coastguard Worker; CHECK: load double, double* 292*9880d681SAndroid Build Coastguard Worker; CHECK: br label %bb 293*9880d681SAndroid Build Coastguard Worker 294*9880d681SAndroid Build Coastguard Workerbb: 295*9880d681SAndroid Build Coastguard Worker %indvar = phi i64 [ 0, %bb.nph ], [ %tmp9, %bb ] 296*9880d681SAndroid Build Coastguard Worker %tmp8 = add i64 %indvar, 2 297*9880d681SAndroid Build Coastguard Worker %scevgep = getelementptr double, double* %G, i64 %tmp8 298*9880d681SAndroid Build Coastguard Worker %tmp9 = add i64 %indvar, 1 299*9880d681SAndroid Build Coastguard Worker %scevgep10 = getelementptr double, double* %G, i64 %tmp9 300*9880d681SAndroid Build Coastguard Worker %3 = load double, double* %scevgep10, align 8 301*9880d681SAndroid Build Coastguard Worker %4 = load double, double* %scevgep, align 8 302*9880d681SAndroid Build Coastguard Worker %5 = fadd double %3, %4 303*9880d681SAndroid Build Coastguard Worker store double %5, double* %scevgep, align 8 304*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i64 %tmp9, %tmp7 305*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %return, label %bb 306*9880d681SAndroid Build Coastguard Worker 307*9880d681SAndroid Build Coastguard Worker; Should only be one load in the loop. 308*9880d681SAndroid Build Coastguard Worker; CHECK: bb: 309*9880d681SAndroid Build Coastguard Worker; CHECK: load double, double* 310*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load double, double* 311*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %exitcond 312*9880d681SAndroid Build Coastguard Worker 313*9880d681SAndroid Build Coastguard Workerreturn: 314*9880d681SAndroid Build Coastguard Worker ret void 315*9880d681SAndroid Build Coastguard Worker} 316*9880d681SAndroid Build Coastguard Worker 317*9880d681SAndroid Build Coastguard Worker;void test10(int N, double* G) { 318*9880d681SAndroid Build Coastguard Worker; long j; 319*9880d681SAndroid Build Coastguard Worker; for (j = 1; j < N - 1; j++) 320*9880d681SAndroid Build Coastguard Worker; G[j] = G[j] + G[j+1] + G[j-1]; 321*9880d681SAndroid Build Coastguard Worker;} 322*9880d681SAndroid Build Coastguard Worker 323*9880d681SAndroid Build Coastguard Worker; PR5501 324*9880d681SAndroid Build Coastguard Workerdefine void @test10(i32 %N, double* nocapture %G) nounwind ssp { 325*9880d681SAndroid Build Coastguard Workerentry: 326*9880d681SAndroid Build Coastguard Worker %0 = add i32 %N, -1 327*9880d681SAndroid Build Coastguard Worker %1 = icmp sgt i32 %0, 1 328*9880d681SAndroid Build Coastguard Worker br i1 %1, label %bb.nph, label %return 329*9880d681SAndroid Build Coastguard Worker 330*9880d681SAndroid Build Coastguard Workerbb.nph: 331*9880d681SAndroid Build Coastguard Worker %tmp = sext i32 %0 to i64 332*9880d681SAndroid Build Coastguard Worker %tmp8 = add i64 %tmp, -1 333*9880d681SAndroid Build Coastguard Worker br label %bb 334*9880d681SAndroid Build Coastguard Worker; CHECK: bb.nph: 335*9880d681SAndroid Build Coastguard Worker; CHECK: load double, double* 336*9880d681SAndroid Build Coastguard Worker; CHECK: load double, double* 337*9880d681SAndroid Build Coastguard Worker; CHECK: br label %bb 338*9880d681SAndroid Build Coastguard Worker 339*9880d681SAndroid Build Coastguard Worker 340*9880d681SAndroid Build Coastguard Workerbb: 341*9880d681SAndroid Build Coastguard Worker %indvar = phi i64 [ 0, %bb.nph ], [ %tmp11, %bb ] 342*9880d681SAndroid Build Coastguard Worker %scevgep = getelementptr double, double* %G, i64 %indvar 343*9880d681SAndroid Build Coastguard Worker %tmp9 = add i64 %indvar, 2 344*9880d681SAndroid Build Coastguard Worker %scevgep10 = getelementptr double, double* %G, i64 %tmp9 345*9880d681SAndroid Build Coastguard Worker %tmp11 = add i64 %indvar, 1 346*9880d681SAndroid Build Coastguard Worker %scevgep12 = getelementptr double, double* %G, i64 %tmp11 347*9880d681SAndroid Build Coastguard Worker %2 = load double, double* %scevgep12, align 8 348*9880d681SAndroid Build Coastguard Worker %3 = load double, double* %scevgep10, align 8 349*9880d681SAndroid Build Coastguard Worker %4 = fadd double %2, %3 350*9880d681SAndroid Build Coastguard Worker %5 = load double, double* %scevgep, align 8 351*9880d681SAndroid Build Coastguard Worker %6 = fadd double %4, %5 352*9880d681SAndroid Build Coastguard Worker store double %6, double* %scevgep12, align 8 353*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i64 %tmp11, %tmp8 354*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %return, label %bb 355*9880d681SAndroid Build Coastguard Worker 356*9880d681SAndroid Build Coastguard Worker; Should only be one load in the loop. 357*9880d681SAndroid Build Coastguard Worker; CHECK: bb: 358*9880d681SAndroid Build Coastguard Worker; CHECK: load double, double* 359*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load double, double* 360*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %exitcond 361*9880d681SAndroid Build Coastguard Worker 362*9880d681SAndroid Build Coastguard Workerreturn: 363*9880d681SAndroid Build Coastguard Worker ret void 364*9880d681SAndroid Build Coastguard Worker} 365*9880d681SAndroid Build Coastguard Worker 366*9880d681SAndroid Build Coastguard Worker; Test critical edge splitting. 367*9880d681SAndroid Build Coastguard Workerdefine i32 @test11(i32* %p, i1 %C, i32 %N) { 368*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11( 369*9880d681SAndroid Build Coastguard Workerblock1: 370*9880d681SAndroid Build Coastguard Worker br i1 %C, label %block2, label %block3 371*9880d681SAndroid Build Coastguard Worker 372*9880d681SAndroid Build Coastguard Workerblock2: 373*9880d681SAndroid Build Coastguard Worker %cond = icmp sgt i32 %N, 1 374*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %block4, label %block5 375*9880d681SAndroid Build Coastguard Worker; CHECK: load i32, i32* %p 376*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br label %block4 377*9880d681SAndroid Build Coastguard Worker 378*9880d681SAndroid Build Coastguard Workerblock3: 379*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %p 380*9880d681SAndroid Build Coastguard Worker br label %block4 381*9880d681SAndroid Build Coastguard Worker 382*9880d681SAndroid Build Coastguard Workerblock4: 383*9880d681SAndroid Build Coastguard Worker %PRE = load i32, i32* %p 384*9880d681SAndroid Build Coastguard Worker br label %block5 385*9880d681SAndroid Build Coastguard Worker 386*9880d681SAndroid Build Coastguard Workerblock5: 387*9880d681SAndroid Build Coastguard Worker %ret = phi i32 [ 0, %block2 ], [ %PRE, %block4 ] 388*9880d681SAndroid Build Coastguard Worker ret i32 %ret 389*9880d681SAndroid Build Coastguard Worker; CHECK: block4: 390*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: phi i32 391*9880d681SAndroid Build Coastguard Worker} 392*9880d681SAndroid Build Coastguard Worker 393*9880d681SAndroid Build Coastguard Workerdeclare void @f() 394*9880d681SAndroid Build Coastguard Workerdeclare void @g(i32) 395*9880d681SAndroid Build Coastguard Workerdeclare i32 @__CxxFrameHandler3(...) 396*9880d681SAndroid Build Coastguard Worker 397*9880d681SAndroid Build Coastguard Worker; Test that loads aren't PRE'd into EH pads. 398*9880d681SAndroid Build Coastguard Workerdefine void @test12(i32* %p) personality i32 (...)* @__CxxFrameHandler3 { 399*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test12( 400*9880d681SAndroid Build Coastguard Workerblock1: 401*9880d681SAndroid Build Coastguard Worker invoke void @f() 402*9880d681SAndroid Build Coastguard Worker to label %block2 unwind label %catch.dispatch 403*9880d681SAndroid Build Coastguard Worker 404*9880d681SAndroid Build Coastguard Workerblock2: 405*9880d681SAndroid Build Coastguard Worker invoke void @f() 406*9880d681SAndroid Build Coastguard Worker to label %block3 unwind label %cleanup 407*9880d681SAndroid Build Coastguard Worker 408*9880d681SAndroid Build Coastguard Workerblock3: 409*9880d681SAndroid Build Coastguard Worker ret void 410*9880d681SAndroid Build Coastguard Worker 411*9880d681SAndroid Build Coastguard Workercatch.dispatch: 412*9880d681SAndroid Build Coastguard Worker %cs1 = catchswitch within none [label %catch] unwind label %cleanup2 413*9880d681SAndroid Build Coastguard Worker 414*9880d681SAndroid Build Coastguard Workercatch: 415*9880d681SAndroid Build Coastguard Worker %c = catchpad within %cs1 [] 416*9880d681SAndroid Build Coastguard Worker catchret from %c to label %block2 417*9880d681SAndroid Build Coastguard Worker 418*9880d681SAndroid Build Coastguard Workercleanup: 419*9880d681SAndroid Build Coastguard Worker %c1 = cleanuppad within none [] 420*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %p 421*9880d681SAndroid Build Coastguard Worker cleanupret from %c1 unwind label %cleanup2 422*9880d681SAndroid Build Coastguard Worker 423*9880d681SAndroid Build Coastguard Worker; CHECK: cleanup2: 424*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: phi 425*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %c2 = cleanuppad within none [] 426*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %NOTPRE = load i32, i32* %p 427*9880d681SAndroid Build Coastguard Workercleanup2: 428*9880d681SAndroid Build Coastguard Worker %c2 = cleanuppad within none [] 429*9880d681SAndroid Build Coastguard Worker %NOTPRE = load i32, i32* %p 430*9880d681SAndroid Build Coastguard Worker call void @g(i32 %NOTPRE) 431*9880d681SAndroid Build Coastguard Worker cleanupret from %c2 unwind to caller 432*9880d681SAndroid Build Coastguard Worker} 433