1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -default-data-layout="e-p:32:32:32-p1:16:16:16-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-n8:16:32" -basicaa -gvn -S -die | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -default-data-layout="E-p:32:32:32-p1:16:16:16-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:64:64-n32" -basicaa -gvn -S -die | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker;; Trivial RLE test. 5*9880d681SAndroid Build Coastguard Workerdefine i32 @test0(i32 %V, i32* %P) { 6*9880d681SAndroid Build Coastguard Worker store i32 %V, i32* %P 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker %A = load i32, i32* %P 9*9880d681SAndroid Build Coastguard Worker ret i32 %A 10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test0( 11*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %V 12*9880d681SAndroid Build Coastguard Worker} 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker;;===----------------------------------------------------------------------===;; 16*9880d681SAndroid Build Coastguard Worker;; Tests for crashers 17*9880d681SAndroid Build Coastguard Worker;;===----------------------------------------------------------------------===;; 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker;; PR5016 20*9880d681SAndroid Build Coastguard Workerdefine i8 @crash0({i32, i32} %A, {i32, i32}* %P) { 21*9880d681SAndroid Build Coastguard Worker store {i32, i32} %A, {i32, i32}* %P 22*9880d681SAndroid Build Coastguard Worker %X = bitcast {i32, i32}* %P to i8* 23*9880d681SAndroid Build Coastguard Worker %Y = load i8, i8* %X 24*9880d681SAndroid Build Coastguard Worker ret i8 %Y 25*9880d681SAndroid Build Coastguard Worker} 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker;; No PR filed, crashed in CaptureTracker. 28*9880d681SAndroid Build Coastguard Workerdeclare void @helper() 29*9880d681SAndroid Build Coastguard Workerdefine void @crash1() { 30*9880d681SAndroid Build Coastguard Worker tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* undef, i8* undef, i64 undef, i32 1, i1 false) nounwind 31*9880d681SAndroid Build Coastguard Worker %tmp = load i8, i8* bitcast (void ()* @helper to i8*) 32*9880d681SAndroid Build Coastguard Worker %x = icmp eq i8 %tmp, 15 33*9880d681SAndroid Build Coastguard Worker ret void 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker;;===----------------------------------------------------------------------===;; 38*9880d681SAndroid Build Coastguard Worker;; Store -> Load and Load -> Load forwarding where src and dst are different 39*9880d681SAndroid Build Coastguard Worker;; types, but where the base pointer is a must alias. 40*9880d681SAndroid Build Coastguard Worker;;===----------------------------------------------------------------------===;; 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker;; i32 -> f32 forwarding. 43*9880d681SAndroid Build Coastguard Workerdefine float @coerce_mustalias1(i32 %V, i32* %P) { 44*9880d681SAndroid Build Coastguard Worker store i32 %V, i32* %P 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker %P2 = bitcast i32* %P to float* 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker %A = load float, float* %P2 49*9880d681SAndroid Build Coastguard Worker ret float %A 50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @coerce_mustalias1( 51*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load 52*9880d681SAndroid Build Coastguard Worker; CHECK: ret float 53*9880d681SAndroid Build Coastguard Worker} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker;; i32* -> float forwarding. 56*9880d681SAndroid Build Coastguard Workerdefine float @coerce_mustalias2(i32* %V, i32** %P) { 57*9880d681SAndroid Build Coastguard Worker store i32* %V, i32** %P 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker %P2 = bitcast i32** %P to float* 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker %A = load float, float* %P2 62*9880d681SAndroid Build Coastguard Worker ret float %A 63*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @coerce_mustalias2( 64*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load 65*9880d681SAndroid Build Coastguard Worker; CHECK: ret float 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker;; float -> i32* forwarding. 69*9880d681SAndroid Build Coastguard Workerdefine i32* @coerce_mustalias3(float %V, float* %P) { 70*9880d681SAndroid Build Coastguard Worker store float %V, float* %P 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker %P2 = bitcast float* %P to i32** 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker %A = load i32*, i32** %P2 75*9880d681SAndroid Build Coastguard Worker ret i32* %A 76*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @coerce_mustalias3( 77*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load 78*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32* 79*9880d681SAndroid Build Coastguard Worker} 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Worker;; i32 -> f32 load forwarding. 82*9880d681SAndroid Build Coastguard Workerdefine float @coerce_mustalias4(i32* %P, i1 %cond) { 83*9880d681SAndroid Build Coastguard Worker %A = load i32, i32* %P 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Worker %P2 = bitcast i32* %P to float* 86*9880d681SAndroid Build Coastguard Worker %B = load float, float* %P2 87*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %T, label %F 88*9880d681SAndroid Build Coastguard WorkerT: 89*9880d681SAndroid Build Coastguard Worker ret float %B 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard WorkerF: 92*9880d681SAndroid Build Coastguard Worker %X = bitcast i32 %A to float 93*9880d681SAndroid Build Coastguard Worker ret float %X 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @coerce_mustalias4( 96*9880d681SAndroid Build Coastguard Worker; CHECK: %A = load i32, i32* %P 97*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load 98*9880d681SAndroid Build Coastguard Worker; CHECK: ret float 99*9880d681SAndroid Build Coastguard Worker; CHECK: F: 100*9880d681SAndroid Build Coastguard Worker} 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker;; i32 -> i8 forwarding 103*9880d681SAndroid Build Coastguard Workerdefine i8 @coerce_mustalias5(i32 %V, i32* %P) { 104*9880d681SAndroid Build Coastguard Worker store i32 %V, i32* %P 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Worker %P2 = bitcast i32* %P to i8* 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker %A = load i8, i8* %P2 109*9880d681SAndroid Build Coastguard Worker ret i8 %A 110*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @coerce_mustalias5( 111*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load 112*9880d681SAndroid Build Coastguard Worker; CHECK: ret i8 113*9880d681SAndroid Build Coastguard Worker} 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Worker;; i64 -> float forwarding 116*9880d681SAndroid Build Coastguard Workerdefine float @coerce_mustalias6(i64 %V, i64* %P) { 117*9880d681SAndroid Build Coastguard Worker store i64 %V, i64* %P 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Worker %P2 = bitcast i64* %P to float* 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Worker %A = load float, float* %P2 122*9880d681SAndroid Build Coastguard Worker ret float %A 123*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @coerce_mustalias6( 124*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load 125*9880d681SAndroid Build Coastguard Worker; CHECK: ret float 126*9880d681SAndroid Build Coastguard Worker} 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Worker;; i64 -> i8* (32-bit) forwarding 129*9880d681SAndroid Build Coastguard Workerdefine i8* @coerce_mustalias7(i64 %V, i64* %P) { 130*9880d681SAndroid Build Coastguard Worker store i64 %V, i64* %P 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Worker %P2 = bitcast i64* %P to i8** 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker %A = load i8*, i8** %P2 135*9880d681SAndroid Build Coastguard Worker ret i8* %A 136*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @coerce_mustalias7( 137*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load 138*9880d681SAndroid Build Coastguard Worker; CHECK: ret i8* 139*9880d681SAndroid Build Coastguard Worker} 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Worker; memset -> i16 forwarding. 142*9880d681SAndroid Build Coastguard Workerdefine signext i16 @memset_to_i16_local(i16* %A) nounwind ssp { 143*9880d681SAndroid Build Coastguard Workerentry: 144*9880d681SAndroid Build Coastguard Worker %conv = bitcast i16* %A to i8* 145*9880d681SAndroid Build Coastguard Worker tail call void @llvm.memset.p0i8.i64(i8* %conv, i8 1, i64 200, i32 1, i1 false) 146*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i16, i16* %A, i64 42 147*9880d681SAndroid Build Coastguard Worker %tmp2 = load i16, i16* %arrayidx 148*9880d681SAndroid Build Coastguard Worker ret i16 %tmp2 149*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @memset_to_i16_local( 150*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load 151*9880d681SAndroid Build Coastguard Worker; CHECK: ret i16 257 152*9880d681SAndroid Build Coastguard Worker} 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Worker; memset -> float forwarding. 155*9880d681SAndroid Build Coastguard Workerdefine float @memset_to_float_local(float* %A, i8 %Val) nounwind ssp { 156*9880d681SAndroid Build Coastguard Workerentry: 157*9880d681SAndroid Build Coastguard Worker %conv = bitcast float* %A to i8* ; <i8*> [#uses=1] 158*9880d681SAndroid Build Coastguard Worker tail call void @llvm.memset.p0i8.i64(i8* %conv, i8 %Val, i64 400, i32 1, i1 false) 159*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds float, float* %A, i64 42 ; <float*> [#uses=1] 160*9880d681SAndroid Build Coastguard Worker %tmp2 = load float, float* %arrayidx ; <float> [#uses=1] 161*9880d681SAndroid Build Coastguard Worker ret float %tmp2 162*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @memset_to_float_local( 163*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load 164*9880d681SAndroid Build Coastguard Worker; CHECK: zext 165*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shl 166*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: or 167*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shl 168*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: or 169*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bitcast 170*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float 171*9880d681SAndroid Build Coastguard Worker} 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Worker;; non-local memset -> i16 load forwarding. 174*9880d681SAndroid Build Coastguard Workerdefine i16 @memset_to_i16_nonlocal0(i16* %P, i1 %cond) { 175*9880d681SAndroid Build Coastguard Worker %P3 = bitcast i16* %P to i8* 176*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %T, label %F 177*9880d681SAndroid Build Coastguard WorkerT: 178*9880d681SAndroid Build Coastguard Worker tail call void @llvm.memset.p0i8.i64(i8* %P3, i8 1, i64 400, i32 1, i1 false) 179*9880d681SAndroid Build Coastguard Worker br label %Cont 180*9880d681SAndroid Build Coastguard Worker 181*9880d681SAndroid Build Coastguard WorkerF: 182*9880d681SAndroid Build Coastguard Worker tail call void @llvm.memset.p0i8.i64(i8* %P3, i8 2, i64 400, i32 1, i1 false) 183*9880d681SAndroid Build Coastguard Worker br label %Cont 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard WorkerCont: 186*9880d681SAndroid Build Coastguard Worker %P2 = getelementptr i16, i16* %P, i32 4 187*9880d681SAndroid Build Coastguard Worker %A = load i16, i16* %P2 188*9880d681SAndroid Build Coastguard Worker ret i16 %A 189*9880d681SAndroid Build Coastguard Worker 190*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @memset_to_i16_nonlocal0( 191*9880d681SAndroid Build Coastguard Worker; CHECK: Cont: 192*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %A = phi i16 [ 514, %F ], [ 257, %T ] 193*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load 194*9880d681SAndroid Build Coastguard Worker; CHECK: ret i16 %A 195*9880d681SAndroid Build Coastguard Worker} 196*9880d681SAndroid Build Coastguard Worker 197*9880d681SAndroid Build Coastguard Worker@GCst = constant {i32, float, i32 } { i32 42, float 14., i32 97 } 198*9880d681SAndroid Build Coastguard Worker@GCst_as1 = addrspace(1) constant {i32, float, i32 } { i32 42, float 14., i32 97 } 199*9880d681SAndroid Build Coastguard Worker 200*9880d681SAndroid Build Coastguard Worker; memset -> float forwarding. 201*9880d681SAndroid Build Coastguard Workerdefine float @memcpy_to_float_local(float* %A) nounwind ssp { 202*9880d681SAndroid Build Coastguard Workerentry: 203*9880d681SAndroid Build Coastguard Worker %conv = bitcast float* %A to i8* ; <i8*> [#uses=1] 204*9880d681SAndroid Build Coastguard Worker tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %conv, i8* bitcast ({i32, float, i32 }* @GCst to i8*), i64 12, i32 1, i1 false) 205*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds float, float* %A, i64 1 ; <float*> [#uses=1] 206*9880d681SAndroid Build Coastguard Worker %tmp2 = load float, float* %arrayidx ; <float> [#uses=1] 207*9880d681SAndroid Build Coastguard Worker ret float %tmp2 208*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @memcpy_to_float_local( 209*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load 210*9880d681SAndroid Build Coastguard Worker; CHECK: ret float 1.400000e+01 211*9880d681SAndroid Build Coastguard Worker} 212*9880d681SAndroid Build Coastguard Worker 213*9880d681SAndroid Build Coastguard Worker; memcpy from address space 1 214*9880d681SAndroid Build Coastguard Workerdefine float @memcpy_to_float_local_as1(float* %A) nounwind ssp { 215*9880d681SAndroid Build Coastguard Workerentry: 216*9880d681SAndroid Build Coastguard Worker %conv = bitcast float* %A to i8* ; <i8*> [#uses=1] 217*9880d681SAndroid Build Coastguard Worker tail call void @llvm.memcpy.p0i8.p1i8.i64(i8* %conv, i8 addrspace(1)* bitcast ({i32, float, i32 } addrspace(1)* @GCst_as1 to i8 addrspace(1)*), i64 12, i32 1, i1 false) 218*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds float, float* %A, i64 1 ; <float*> [#uses=1] 219*9880d681SAndroid Build Coastguard Worker %tmp2 = load float, float* %arrayidx ; <float> [#uses=1] 220*9880d681SAndroid Build Coastguard Worker ret float %tmp2 221*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @memcpy_to_float_local_as1( 222*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load 223*9880d681SAndroid Build Coastguard Worker; CHECK: ret float 1.400000e+01 224*9880d681SAndroid Build Coastguard Worker} 225*9880d681SAndroid Build Coastguard Worker 226*9880d681SAndroid Build Coastguard Worker;; non-local i32/float -> i8 load forwarding. 227*9880d681SAndroid Build Coastguard Workerdefine i8 @coerce_mustalias_nonlocal0(i32* %P, i1 %cond) { 228*9880d681SAndroid Build Coastguard Worker %P2 = bitcast i32* %P to float* 229*9880d681SAndroid Build Coastguard Worker %P3 = bitcast i32* %P to i8* 230*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %T, label %F 231*9880d681SAndroid Build Coastguard WorkerT: 232*9880d681SAndroid Build Coastguard Worker store i32 42, i32* %P 233*9880d681SAndroid Build Coastguard Worker br label %Cont 234*9880d681SAndroid Build Coastguard Worker 235*9880d681SAndroid Build Coastguard WorkerF: 236*9880d681SAndroid Build Coastguard Worker store float 1.0, float* %P2 237*9880d681SAndroid Build Coastguard Worker br label %Cont 238*9880d681SAndroid Build Coastguard Worker 239*9880d681SAndroid Build Coastguard WorkerCont: 240*9880d681SAndroid Build Coastguard Worker %A = load i8, i8* %P3 241*9880d681SAndroid Build Coastguard Worker ret i8 %A 242*9880d681SAndroid Build Coastguard Worker 243*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @coerce_mustalias_nonlocal0( 244*9880d681SAndroid Build Coastguard Worker; CHECK: Cont: 245*9880d681SAndroid Build Coastguard Worker; CHECK: %A = phi i8 [ 246*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load 247*9880d681SAndroid Build Coastguard Worker; CHECK: ret i8 %A 248*9880d681SAndroid Build Coastguard Worker} 249*9880d681SAndroid Build Coastguard Worker 250*9880d681SAndroid Build Coastguard Worker 251*9880d681SAndroid Build Coastguard Worker;; non-local i32/float -> i8 load forwarding. This also tests that the "P3" 252*9880d681SAndroid Build Coastguard Worker;; bitcast equivalence can be properly phi translated. 253*9880d681SAndroid Build Coastguard Workerdefine i8 @coerce_mustalias_nonlocal1(i32* %P, i1 %cond) { 254*9880d681SAndroid Build Coastguard Worker %P2 = bitcast i32* %P to float* 255*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %T, label %F 256*9880d681SAndroid Build Coastguard WorkerT: 257*9880d681SAndroid Build Coastguard Worker store i32 42, i32* %P 258*9880d681SAndroid Build Coastguard Worker br label %Cont 259*9880d681SAndroid Build Coastguard Worker 260*9880d681SAndroid Build Coastguard WorkerF: 261*9880d681SAndroid Build Coastguard Worker store float 1.0, float* %P2 262*9880d681SAndroid Build Coastguard Worker br label %Cont 263*9880d681SAndroid Build Coastguard Worker 264*9880d681SAndroid Build Coastguard WorkerCont: 265*9880d681SAndroid Build Coastguard Worker %P3 = bitcast i32* %P to i8* 266*9880d681SAndroid Build Coastguard Worker %A = load i8, i8* %P3 267*9880d681SAndroid Build Coastguard Worker ret i8 %A 268*9880d681SAndroid Build Coastguard Worker 269*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @coerce_mustalias_nonlocal1( 270*9880d681SAndroid Build Coastguard Worker; CHECK: Cont: 271*9880d681SAndroid Build Coastguard Worker; CHECK: %A = phi i8 [ 272*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load 273*9880d681SAndroid Build Coastguard Worker; CHECK: ret i8 %A 274*9880d681SAndroid Build Coastguard Worker} 275*9880d681SAndroid Build Coastguard Worker 276*9880d681SAndroid Build Coastguard Worker 277*9880d681SAndroid Build Coastguard Worker;; non-local i32 -> i8 partial redundancy load forwarding. 278*9880d681SAndroid Build Coastguard Workerdefine i8 @coerce_mustalias_pre0(i32* %P, i1 %cond) { 279*9880d681SAndroid Build Coastguard Worker %P3 = bitcast i32* %P to i8* 280*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %T, label %F 281*9880d681SAndroid Build Coastguard WorkerT: 282*9880d681SAndroid Build Coastguard Worker store i32 42, i32* %P 283*9880d681SAndroid Build Coastguard Worker br label %Cont 284*9880d681SAndroid Build Coastguard Worker 285*9880d681SAndroid Build Coastguard WorkerF: 286*9880d681SAndroid Build Coastguard Worker br label %Cont 287*9880d681SAndroid Build Coastguard Worker 288*9880d681SAndroid Build Coastguard WorkerCont: 289*9880d681SAndroid Build Coastguard Worker %A = load i8, i8* %P3 290*9880d681SAndroid Build Coastguard Worker ret i8 %A 291*9880d681SAndroid Build Coastguard Worker 292*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @coerce_mustalias_pre0( 293*9880d681SAndroid Build Coastguard Worker; CHECK: F: 294*9880d681SAndroid Build Coastguard Worker; CHECK: load i8, i8* %P3 295*9880d681SAndroid Build Coastguard Worker; CHECK: Cont: 296*9880d681SAndroid Build Coastguard Worker; CHECK: %A = phi i8 [ 297*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load 298*9880d681SAndroid Build Coastguard Worker; CHECK: ret i8 %A 299*9880d681SAndroid Build Coastguard Worker} 300*9880d681SAndroid Build Coastguard Worker 301*9880d681SAndroid Build Coastguard Worker;;===----------------------------------------------------------------------===;; 302*9880d681SAndroid Build Coastguard Worker;; Store -> Load and Load -> Load forwarding where src and dst are different 303*9880d681SAndroid Build Coastguard Worker;; types, and the reload is an offset from the store pointer. 304*9880d681SAndroid Build Coastguard Worker;;===----------------------------------------------------------------------===;; 305*9880d681SAndroid Build Coastguard Worker 306*9880d681SAndroid Build Coastguard Worker;; i32 -> i8 forwarding. 307*9880d681SAndroid Build Coastguard Worker;; PR4216 308*9880d681SAndroid Build Coastguard Workerdefine i8 @coerce_offset0(i32 %V, i32* %P) { 309*9880d681SAndroid Build Coastguard Worker store i32 %V, i32* %P 310*9880d681SAndroid Build Coastguard Worker 311*9880d681SAndroid Build Coastguard Worker %P2 = bitcast i32* %P to i8* 312*9880d681SAndroid Build Coastguard Worker %P3 = getelementptr i8, i8* %P2, i32 2 313*9880d681SAndroid Build Coastguard Worker 314*9880d681SAndroid Build Coastguard Worker %A = load i8, i8* %P3 315*9880d681SAndroid Build Coastguard Worker ret i8 %A 316*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @coerce_offset0( 317*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load 318*9880d681SAndroid Build Coastguard Worker; CHECK: ret i8 319*9880d681SAndroid Build Coastguard Worker} 320*9880d681SAndroid Build Coastguard Worker 321*9880d681SAndroid Build Coastguard Workerdefine i8 @coerce_offset0_addrspacecast(i32 %V, i32* %P) { 322*9880d681SAndroid Build Coastguard Worker store i32 %V, i32* %P 323*9880d681SAndroid Build Coastguard Worker 324*9880d681SAndroid Build Coastguard Worker %P2 = addrspacecast i32* %P to i8 addrspace(1)* 325*9880d681SAndroid Build Coastguard Worker %P3 = getelementptr i8, i8 addrspace(1)* %P2, i32 2 326*9880d681SAndroid Build Coastguard Worker 327*9880d681SAndroid Build Coastguard Worker %A = load i8, i8 addrspace(1)* %P3 328*9880d681SAndroid Build Coastguard Worker ret i8 %A 329*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @coerce_offset0_addrspacecast( 330*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load 331*9880d681SAndroid Build Coastguard Worker; CHECK: ret i8 332*9880d681SAndroid Build Coastguard Worker} 333*9880d681SAndroid Build Coastguard Worker 334*9880d681SAndroid Build Coastguard Worker;; non-local i32/float -> i8 load forwarding. 335*9880d681SAndroid Build Coastguard Workerdefine i8 @coerce_offset_nonlocal0(i32* %P, i1 %cond) { 336*9880d681SAndroid Build Coastguard Worker %P2 = bitcast i32* %P to float* 337*9880d681SAndroid Build Coastguard Worker %P3 = bitcast i32* %P to i8* 338*9880d681SAndroid Build Coastguard Worker %P4 = getelementptr i8, i8* %P3, i32 2 339*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %T, label %F 340*9880d681SAndroid Build Coastguard WorkerT: 341*9880d681SAndroid Build Coastguard Worker store i32 57005, i32* %P 342*9880d681SAndroid Build Coastguard Worker br label %Cont 343*9880d681SAndroid Build Coastguard Worker 344*9880d681SAndroid Build Coastguard WorkerF: 345*9880d681SAndroid Build Coastguard Worker store float 1.0, float* %P2 346*9880d681SAndroid Build Coastguard Worker br label %Cont 347*9880d681SAndroid Build Coastguard Worker 348*9880d681SAndroid Build Coastguard WorkerCont: 349*9880d681SAndroid Build Coastguard Worker %A = load i8, i8* %P4 350*9880d681SAndroid Build Coastguard Worker ret i8 %A 351*9880d681SAndroid Build Coastguard Worker 352*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @coerce_offset_nonlocal0( 353*9880d681SAndroid Build Coastguard Worker; CHECK: Cont: 354*9880d681SAndroid Build Coastguard Worker; CHECK: %A = phi i8 [ 355*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load 356*9880d681SAndroid Build Coastguard Worker; CHECK: ret i8 %A 357*9880d681SAndroid Build Coastguard Worker} 358*9880d681SAndroid Build Coastguard Worker 359*9880d681SAndroid Build Coastguard Worker 360*9880d681SAndroid Build Coastguard Worker;; non-local i32 -> i8 partial redundancy load forwarding. 361*9880d681SAndroid Build Coastguard Workerdefine i8 @coerce_offset_pre0(i32* %P, i1 %cond) { 362*9880d681SAndroid Build Coastguard Worker %P3 = bitcast i32* %P to i8* 363*9880d681SAndroid Build Coastguard Worker %P4 = getelementptr i8, i8* %P3, i32 2 364*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %T, label %F 365*9880d681SAndroid Build Coastguard WorkerT: 366*9880d681SAndroid Build Coastguard Worker store i32 42, i32* %P 367*9880d681SAndroid Build Coastguard Worker br label %Cont 368*9880d681SAndroid Build Coastguard Worker 369*9880d681SAndroid Build Coastguard WorkerF: 370*9880d681SAndroid Build Coastguard Worker br label %Cont 371*9880d681SAndroid Build Coastguard Worker 372*9880d681SAndroid Build Coastguard WorkerCont: 373*9880d681SAndroid Build Coastguard Worker %A = load i8, i8* %P4 374*9880d681SAndroid Build Coastguard Worker ret i8 %A 375*9880d681SAndroid Build Coastguard Worker 376*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @coerce_offset_pre0( 377*9880d681SAndroid Build Coastguard Worker; CHECK: F: 378*9880d681SAndroid Build Coastguard Worker; CHECK: load i8, i8* %P4 379*9880d681SAndroid Build Coastguard Worker; CHECK: Cont: 380*9880d681SAndroid Build Coastguard Worker; CHECK: %A = phi i8 [ 381*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load 382*9880d681SAndroid Build Coastguard Worker; CHECK: ret i8 %A 383*9880d681SAndroid Build Coastguard Worker} 384*9880d681SAndroid Build Coastguard Worker 385*9880d681SAndroid Build Coastguard Workerdefine i32 @chained_load(i32** %p, i32 %x, i32 %y) { 386*9880d681SAndroid Build Coastguard Workerblock1: 387*9880d681SAndroid Build Coastguard Worker %A = alloca i32* 388*9880d681SAndroid Build Coastguard Worker 389*9880d681SAndroid Build Coastguard Worker %z = load i32*, i32** %p 390*9880d681SAndroid Build Coastguard Worker store i32* %z, i32** %A 391*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %x, %y 392*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %block2, label %block3 393*9880d681SAndroid Build Coastguard Worker 394*9880d681SAndroid Build Coastguard Workerblock2: 395*9880d681SAndroid Build Coastguard Worker %a = load i32*, i32** %p 396*9880d681SAndroid Build Coastguard Worker br label %block4 397*9880d681SAndroid Build Coastguard Worker 398*9880d681SAndroid Build Coastguard Workerblock3: 399*9880d681SAndroid Build Coastguard Worker %b = load i32*, i32** %p 400*9880d681SAndroid Build Coastguard Worker br label %block4 401*9880d681SAndroid Build Coastguard Worker 402*9880d681SAndroid Build Coastguard Workerblock4: 403*9880d681SAndroid Build Coastguard Worker %c = load i32*, i32** %p 404*9880d681SAndroid Build Coastguard Worker %d = load i32, i32* %c 405*9880d681SAndroid Build Coastguard Worker ret i32 %d 406*9880d681SAndroid Build Coastguard Worker 407*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @chained_load( 408*9880d681SAndroid Build Coastguard Worker; CHECK: %z = load i32*, i32** %p 409*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load 410*9880d681SAndroid Build Coastguard Worker; CHECK: %d = load i32, i32* %z 411*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %d 412*9880d681SAndroid Build Coastguard Worker} 413*9880d681SAndroid Build Coastguard Worker 414*9880d681SAndroid Build Coastguard Worker 415*9880d681SAndroid Build Coastguard Workerdeclare i1 @cond() readonly 416*9880d681SAndroid Build Coastguard Workerdeclare i1 @cond2() readonly 417*9880d681SAndroid Build Coastguard Worker 418*9880d681SAndroid Build Coastguard Workerdefine i32 @phi_trans2() { 419*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @phi_trans2( 420*9880d681SAndroid Build Coastguard Workerentry: 421*9880d681SAndroid Build Coastguard Worker %P = alloca i32, i32 400 422*9880d681SAndroid Build Coastguard Worker br label %F1 423*9880d681SAndroid Build Coastguard Worker 424*9880d681SAndroid Build Coastguard WorkerF1: 425*9880d681SAndroid Build Coastguard Worker %A = phi i32 [1, %entry], [2, %F] 426*9880d681SAndroid Build Coastguard Worker %cond2 = call i1 @cond() 427*9880d681SAndroid Build Coastguard Worker br i1 %cond2, label %T1, label %TY 428*9880d681SAndroid Build Coastguard Worker 429*9880d681SAndroid Build Coastguard WorkerT1: 430*9880d681SAndroid Build Coastguard Worker %P2 = getelementptr i32, i32* %P, i32 %A 431*9880d681SAndroid Build Coastguard Worker %x = load i32, i32* %P2 432*9880d681SAndroid Build Coastguard Worker %cond = call i1 @cond2() 433*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %TX, label %F 434*9880d681SAndroid Build Coastguard Worker 435*9880d681SAndroid Build Coastguard WorkerF: 436*9880d681SAndroid Build Coastguard Worker %P3 = getelementptr i32, i32* %P, i32 2 437*9880d681SAndroid Build Coastguard Worker store i32 17, i32* %P3 438*9880d681SAndroid Build Coastguard Worker 439*9880d681SAndroid Build Coastguard Worker store i32 42, i32* %P2 ; Provides "P[A]". 440*9880d681SAndroid Build Coastguard Worker br label %F1 441*9880d681SAndroid Build Coastguard Worker 442*9880d681SAndroid Build Coastguard WorkerTX: 443*9880d681SAndroid Build Coastguard Worker ; This load should not be compiled to 'ret i32 42'. An overly clever 444*9880d681SAndroid Build Coastguard Worker ; implementation of GVN would see that we're returning 17 if the loop 445*9880d681SAndroid Build Coastguard Worker ; executes once or 42 if it executes more than that, but we'd have to do 446*9880d681SAndroid Build Coastguard Worker ; loop restructuring to expose this, and GVN shouldn't do this sort of CFG 447*9880d681SAndroid Build Coastguard Worker ; transformation. 448*9880d681SAndroid Build Coastguard Worker 449*9880d681SAndroid Build Coastguard Worker; CHECK: TX: 450*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %x 451*9880d681SAndroid Build Coastguard Worker ret i32 %x 452*9880d681SAndroid Build Coastguard WorkerTY: 453*9880d681SAndroid Build Coastguard Worker ret i32 0 454*9880d681SAndroid Build Coastguard Worker} 455*9880d681SAndroid Build Coastguard Worker 456*9880d681SAndroid Build Coastguard Workerdefine i32 @phi_trans3(i32* %p, i32 %x, i32 %y, i32 %z) { 457*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @phi_trans3( 458*9880d681SAndroid Build Coastguard Workerblock1: 459*9880d681SAndroid Build Coastguard Worker %cmpxy = icmp eq i32 %x, %y 460*9880d681SAndroid Build Coastguard Worker br i1 %cmpxy, label %block2, label %block3 461*9880d681SAndroid Build Coastguard Worker 462*9880d681SAndroid Build Coastguard Workerblock2: 463*9880d681SAndroid Build Coastguard Worker store i32 87, i32* %p 464*9880d681SAndroid Build Coastguard Worker br label %block4 465*9880d681SAndroid Build Coastguard Worker 466*9880d681SAndroid Build Coastguard Workerblock3: 467*9880d681SAndroid Build Coastguard Worker %p2 = getelementptr i32, i32* %p, i32 43 468*9880d681SAndroid Build Coastguard Worker store i32 97, i32* %p2 469*9880d681SAndroid Build Coastguard Worker br label %block4 470*9880d681SAndroid Build Coastguard Worker 471*9880d681SAndroid Build Coastguard Workerblock4: 472*9880d681SAndroid Build Coastguard Worker %A = phi i32 [-1, %block2], [42, %block3] 473*9880d681SAndroid Build Coastguard Worker br i1 %cmpxy, label %block5, label %exit 474*9880d681SAndroid Build Coastguard Worker 475*9880d681SAndroid Build Coastguard Worker; CHECK: block4: 476*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %D = phi i32 [ 87, %block2 ], [ 97, %block3 ] 477*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load 478*9880d681SAndroid Build Coastguard Worker 479*9880d681SAndroid Build Coastguard Workerblock5: 480*9880d681SAndroid Build Coastguard Worker %B = add i32 %A, 1 481*9880d681SAndroid Build Coastguard Worker br i1 %cmpxy, label %block6, label %exit 482*9880d681SAndroid Build Coastguard Worker 483*9880d681SAndroid Build Coastguard Workerblock6: 484*9880d681SAndroid Build Coastguard Worker %C = getelementptr i32, i32* %p, i32 %B 485*9880d681SAndroid Build Coastguard Worker br i1 %cmpxy, label %block7, label %exit 486*9880d681SAndroid Build Coastguard Worker 487*9880d681SAndroid Build Coastguard Workerblock7: 488*9880d681SAndroid Build Coastguard Worker %D = load i32, i32* %C 489*9880d681SAndroid Build Coastguard Worker ret i32 %D 490*9880d681SAndroid Build Coastguard Worker 491*9880d681SAndroid Build Coastguard Worker; CHECK: block7: 492*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %D 493*9880d681SAndroid Build Coastguard Worker 494*9880d681SAndroid Build Coastguard Workerexit: 495*9880d681SAndroid Build Coastguard Worker ret i32 -1 496*9880d681SAndroid Build Coastguard Worker} 497*9880d681SAndroid Build Coastguard Worker 498*9880d681SAndroid Build Coastguard Workerdefine i8 @phi_trans4(i8* %p) { 499*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @phi_trans4( 500*9880d681SAndroid Build Coastguard Workerentry: 501*9880d681SAndroid Build Coastguard Worker %X3 = getelementptr i8, i8* %p, i32 192 502*9880d681SAndroid Build Coastguard Worker store i8 192, i8* %X3 503*9880d681SAndroid Build Coastguard Worker 504*9880d681SAndroid Build Coastguard Worker %X = getelementptr i8, i8* %p, i32 4 505*9880d681SAndroid Build Coastguard Worker %Y = load i8, i8* %X 506*9880d681SAndroid Build Coastguard Worker br label %loop 507*9880d681SAndroid Build Coastguard Worker 508*9880d681SAndroid Build Coastguard Workerloop: 509*9880d681SAndroid Build Coastguard Worker %i = phi i32 [4, %entry], [192, %loop] 510*9880d681SAndroid Build Coastguard Worker %X2 = getelementptr i8, i8* %p, i32 %i 511*9880d681SAndroid Build Coastguard Worker %Y2 = load i8, i8* %X2 512*9880d681SAndroid Build Coastguard Worker 513*9880d681SAndroid Build Coastguard Worker; CHECK: loop: 514*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %Y2 = phi i8 [ %Y, %entry ], [ 0, %loop ] 515*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load i8 516*9880d681SAndroid Build Coastguard Worker 517*9880d681SAndroid Build Coastguard Worker %cond = call i1 @cond2() 518*9880d681SAndroid Build Coastguard Worker 519*9880d681SAndroid Build Coastguard Worker %Z = bitcast i8 *%X3 to i32* 520*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %Z 521*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %loop, label %out 522*9880d681SAndroid Build Coastguard Worker 523*9880d681SAndroid Build Coastguard Workerout: 524*9880d681SAndroid Build Coastguard Worker %R = add i8 %Y, %Y2 525*9880d681SAndroid Build Coastguard Worker ret i8 %R 526*9880d681SAndroid Build Coastguard Worker} 527*9880d681SAndroid Build Coastguard Worker 528*9880d681SAndroid Build Coastguard Workerdefine i8 @phi_trans5(i8* %p) { 529*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @phi_trans5( 530*9880d681SAndroid Build Coastguard Workerentry: 531*9880d681SAndroid Build Coastguard Worker 532*9880d681SAndroid Build Coastguard Worker %X4 = getelementptr i8, i8* %p, i32 2 533*9880d681SAndroid Build Coastguard Worker store i8 19, i8* %X4 534*9880d681SAndroid Build Coastguard Worker 535*9880d681SAndroid Build Coastguard Worker %X = getelementptr i8, i8* %p, i32 4 536*9880d681SAndroid Build Coastguard Worker %Y = load i8, i8* %X 537*9880d681SAndroid Build Coastguard Worker br label %loop 538*9880d681SAndroid Build Coastguard Worker 539*9880d681SAndroid Build Coastguard Workerloop: 540*9880d681SAndroid Build Coastguard Worker %i = phi i32 [4, %entry], [3, %cont] 541*9880d681SAndroid Build Coastguard Worker %X2 = getelementptr i8, i8* %p, i32 %i 542*9880d681SAndroid Build Coastguard Worker %Y2 = load i8, i8* %X2 ; Ensure this load is not being incorrectly replaced. 543*9880d681SAndroid Build Coastguard Worker %cond = call i1 @cond2() 544*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %cont, label %out 545*9880d681SAndroid Build Coastguard Worker 546*9880d681SAndroid Build Coastguard Workercont: 547*9880d681SAndroid Build Coastguard Worker %Z = getelementptr i8, i8* %X2, i32 -1 548*9880d681SAndroid Build Coastguard Worker %Z2 = bitcast i8 *%Z to i32* 549*9880d681SAndroid Build Coastguard Worker store i32 50462976, i32* %Z2 ;; (1 << 8) | (2 << 16) | (3 << 24) 550*9880d681SAndroid Build Coastguard Worker 551*9880d681SAndroid Build Coastguard Worker 552*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 553*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: getelementptr i8, i8* %p, i32 3 554*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: load i8, i8* 555*9880d681SAndroid Build Coastguard Worker br label %loop 556*9880d681SAndroid Build Coastguard Worker 557*9880d681SAndroid Build Coastguard Workerout: 558*9880d681SAndroid Build Coastguard Worker %R = add i8 %Y, %Y2 559*9880d681SAndroid Build Coastguard Worker ret i8 %R 560*9880d681SAndroid Build Coastguard Worker} 561*9880d681SAndroid Build Coastguard Worker 562*9880d681SAndroid Build Coastguard Worker 563*9880d681SAndroid Build Coastguard Worker; PR6642 564*9880d681SAndroid Build Coastguard Workerdefine i32 @memset_to_load() nounwind readnone { 565*9880d681SAndroid Build Coastguard Workerentry: 566*9880d681SAndroid Build Coastguard Worker %x = alloca [256 x i32], align 4 ; <[256 x i32]*> [#uses=2] 567*9880d681SAndroid Build Coastguard Worker %tmp = bitcast [256 x i32]* %x to i8* ; <i8*> [#uses=1] 568*9880d681SAndroid Build Coastguard Worker call void @llvm.memset.p0i8.i64(i8* %tmp, i8 0, i64 1024, i32 4, i1 false) 569*9880d681SAndroid Build Coastguard Worker %arraydecay = getelementptr inbounds [256 x i32], [256 x i32]* %x, i32 0, i32 0 ; <i32*> 570*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* %arraydecay ; <i32> [#uses=1] 571*9880d681SAndroid Build Coastguard Worker ret i32 %tmp1 572*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @memset_to_load( 573*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 0 574*9880d681SAndroid Build Coastguard Worker} 575*9880d681SAndroid Build Coastguard Worker 576*9880d681SAndroid Build Coastguard Worker 577*9880d681SAndroid Build Coastguard Worker;;===----------------------------------------------------------------------===;; 578*9880d681SAndroid Build Coastguard Worker;; Load -> Load forwarding in partial alias case. 579*9880d681SAndroid Build Coastguard Worker;;===----------------------------------------------------------------------===;; 580*9880d681SAndroid Build Coastguard Worker 581*9880d681SAndroid Build Coastguard Workerdefine i32 @load_load_partial_alias(i8* %P) nounwind ssp { 582*9880d681SAndroid Build Coastguard Workerentry: 583*9880d681SAndroid Build Coastguard Worker %0 = bitcast i8* %P to i32* 584*9880d681SAndroid Build Coastguard Worker %tmp2 = load i32, i32* %0 585*9880d681SAndroid Build Coastguard Worker %add.ptr = getelementptr inbounds i8, i8* %P, i64 1 586*9880d681SAndroid Build Coastguard Worker %tmp5 = load i8, i8* %add.ptr 587*9880d681SAndroid Build Coastguard Worker %conv = zext i8 %tmp5 to i32 588*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %tmp2, %conv 589*9880d681SAndroid Build Coastguard Worker ret i32 %add 590*9880d681SAndroid Build Coastguard Worker 591*9880d681SAndroid Build Coastguard Worker; TEMPORARILYDISABLED-LABEL: @load_load_partial_alias( 592*9880d681SAndroid Build Coastguard Worker; TEMPORARILYDISABLED: load i32, i32* 593*9880d681SAndroid Build Coastguard Worker; TEMPORARILYDISABLED-NOT: load 594*9880d681SAndroid Build Coastguard Worker; TEMPORARILYDISABLED: lshr i32 {{.*}}, 8 595*9880d681SAndroid Build Coastguard Worker; TEMPORARILYDISABLED-NOT: load 596*9880d681SAndroid Build Coastguard Worker; TEMPORARILYDISABLED: trunc i32 {{.*}} to i8 597*9880d681SAndroid Build Coastguard Worker; TEMPORARILYDISABLED-NOT: load 598*9880d681SAndroid Build Coastguard Worker; TEMPORARILYDISABLED: ret i32 599*9880d681SAndroid Build Coastguard Worker} 600*9880d681SAndroid Build Coastguard Worker 601*9880d681SAndroid Build Coastguard Worker 602*9880d681SAndroid Build Coastguard Worker; Cross block partial alias case. 603*9880d681SAndroid Build Coastguard Workerdefine i32 @load_load_partial_alias_cross_block(i8* %P) nounwind ssp { 604*9880d681SAndroid Build Coastguard Workerentry: 605*9880d681SAndroid Build Coastguard Worker %xx = bitcast i8* %P to i32* 606*9880d681SAndroid Build Coastguard Worker %x1 = load i32, i32* %xx, align 4 607*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %x1, 127 608*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %land.lhs.true, label %if.end 609*9880d681SAndroid Build Coastguard Worker 610*9880d681SAndroid Build Coastguard Workerland.lhs.true: ; preds = %entry 611*9880d681SAndroid Build Coastguard Worker %arrayidx4 = getelementptr inbounds i8, i8* %P, i64 1 612*9880d681SAndroid Build Coastguard Worker %tmp5 = load i8, i8* %arrayidx4, align 1 613*9880d681SAndroid Build Coastguard Worker %conv6 = zext i8 %tmp5 to i32 614*9880d681SAndroid Build Coastguard Worker ret i32 %conv6 615*9880d681SAndroid Build Coastguard Worker 616*9880d681SAndroid Build Coastguard Workerif.end: 617*9880d681SAndroid Build Coastguard Worker ret i32 52 618*9880d681SAndroid Build Coastguard Worker; TEMPORARILY_DISABLED-LABEL: @load_load_partial_alias_cross_block( 619*9880d681SAndroid Build Coastguard Worker; TEMPORARILY_DISABLED: land.lhs.true: 620*9880d681SAndroid Build Coastguard Worker; TEMPORARILY_DISABLED-NOT: load i8 621*9880d681SAndroid Build Coastguard Worker; TEMPORARILY_DISABLED: ret i32 %conv6 622*9880d681SAndroid Build Coastguard Worker} 623*9880d681SAndroid Build Coastguard Worker 624*9880d681SAndroid Build Coastguard Worker 625*9880d681SAndroid Build Coastguard Worker;;===----------------------------------------------------------------------===;; 626*9880d681SAndroid Build Coastguard Worker;; Load Widening 627*9880d681SAndroid Build Coastguard Worker;;===----------------------------------------------------------------------===;; 628*9880d681SAndroid Build Coastguard Worker 629*9880d681SAndroid Build Coastguard Worker%widening1 = type { i32, i8, i8, i8, i8 } 630*9880d681SAndroid Build Coastguard Worker 631*9880d681SAndroid Build Coastguard Worker@f = global %widening1 zeroinitializer, align 4 632*9880d681SAndroid Build Coastguard Worker 633*9880d681SAndroid Build Coastguard Workerdefine i32 @test_widening1(i8* %P) nounwind ssp noredzone { 634*9880d681SAndroid Build Coastguard Workerentry: 635*9880d681SAndroid Build Coastguard Worker %tmp = load i8, i8* getelementptr inbounds (%widening1, %widening1* @f, i64 0, i32 1), align 4 636*9880d681SAndroid Build Coastguard Worker %conv = zext i8 %tmp to i32 637*9880d681SAndroid Build Coastguard Worker %tmp1 = load i8, i8* getelementptr inbounds (%widening1, %widening1* @f, i64 0, i32 2), align 1 638*9880d681SAndroid Build Coastguard Worker %conv2 = zext i8 %tmp1 to i32 639*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %conv, %conv2 640*9880d681SAndroid Build Coastguard Worker ret i32 %add 641*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_widening1( 642*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load 643*9880d681SAndroid Build Coastguard Worker; CHECK: load i16, i16* 644*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load 645*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 646*9880d681SAndroid Build Coastguard Worker} 647*9880d681SAndroid Build Coastguard Worker 648*9880d681SAndroid Build Coastguard Workerdefine i32 @test_widening2() nounwind ssp noredzone { 649*9880d681SAndroid Build Coastguard Workerentry: 650*9880d681SAndroid Build Coastguard Worker %tmp = load i8, i8* getelementptr inbounds (%widening1, %widening1* @f, i64 0, i32 1), align 4 651*9880d681SAndroid Build Coastguard Worker %conv = zext i8 %tmp to i32 652*9880d681SAndroid Build Coastguard Worker %tmp1 = load i8, i8* getelementptr inbounds (%widening1, %widening1* @f, i64 0, i32 2), align 1 653*9880d681SAndroid Build Coastguard Worker %conv2 = zext i8 %tmp1 to i32 654*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %conv, %conv2 655*9880d681SAndroid Build Coastguard Worker 656*9880d681SAndroid Build Coastguard Worker %tmp2 = load i8, i8* getelementptr inbounds (%widening1, %widening1* @f, i64 0, i32 3), align 2 657*9880d681SAndroid Build Coastguard Worker %conv3 = zext i8 %tmp2 to i32 658*9880d681SAndroid Build Coastguard Worker %add2 = add nsw i32 %add, %conv3 659*9880d681SAndroid Build Coastguard Worker 660*9880d681SAndroid Build Coastguard Worker %tmp3 = load i8, i8* getelementptr inbounds (%widening1, %widening1* @f, i64 0, i32 4), align 1 661*9880d681SAndroid Build Coastguard Worker %conv4 = zext i8 %tmp3 to i32 662*9880d681SAndroid Build Coastguard Worker %add3 = add nsw i32 %add2, %conv3 663*9880d681SAndroid Build Coastguard Worker 664*9880d681SAndroid Build Coastguard Worker ret i32 %add3 665*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_widening2( 666*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load 667*9880d681SAndroid Build Coastguard Worker; CHECK: load i32, i32* 668*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load 669*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 670*9880d681SAndroid Build Coastguard Worker} 671*9880d681SAndroid Build Coastguard Worker 672*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) nounwind 673*9880d681SAndroid Build Coastguard Worker 674*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind 675*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memcpy.p0i8.p1i8.i64(i8* nocapture, i8 addrspace(1)* nocapture, i64, i32, i1) nounwind 676*9880d681SAndroid Build Coastguard Worker 677*9880d681SAndroid Build Coastguard Worker 678*9880d681SAndroid Build Coastguard Worker;;===----------------------------------------------------------------------===;; 679*9880d681SAndroid Build Coastguard Worker;; Load -> Store dependency which isn't interfered with by a call that happens 680*9880d681SAndroid Build Coastguard Worker;; before the pointer was captured. 681*9880d681SAndroid Build Coastguard Worker;;===----------------------------------------------------------------------===;; 682*9880d681SAndroid Build Coastguard Worker 683*9880d681SAndroid Build Coastguard Worker%class.X = type { [8 x i8] } 684*9880d681SAndroid Build Coastguard Worker 685*9880d681SAndroid Build Coastguard Worker@_ZTV1X = weak_odr constant [5 x i8*] zeroinitializer 686*9880d681SAndroid Build Coastguard Worker@_ZTV1Y = weak_odr constant [5 x i8*] zeroinitializer 687*9880d681SAndroid Build Coastguard Worker 688*9880d681SAndroid Build Coastguard Workerdeclare void @use() 689*9880d681SAndroid Build Coastguard Workerdeclare void @use3(i8***, i8**) 690*9880d681SAndroid Build Coastguard Worker 691*9880d681SAndroid Build Coastguard Worker; PR8908 692*9880d681SAndroid Build Coastguard Workerdefine void @test_escape1() nounwind { 693*9880d681SAndroid Build Coastguard Worker %x = alloca i8**, align 8 694*9880d681SAndroid Build Coastguard Worker store i8** getelementptr inbounds ([5 x i8*], [5 x i8*]* @_ZTV1X, i64 0, i64 2), i8*** %x, align 8 695*9880d681SAndroid Build Coastguard Worker call void @use() nounwind 696*9880d681SAndroid Build Coastguard Worker %DEAD = load i8**, i8*** %x, align 8 697*9880d681SAndroid Build Coastguard Worker call void @use3(i8*** %x, i8** %DEAD) nounwind 698*9880d681SAndroid Build Coastguard Worker ret void 699*9880d681SAndroid Build Coastguard Worker; CHECK: test_escape1 700*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: DEAD 701*9880d681SAndroid Build Coastguard Worker; CHECK: ret 702*9880d681SAndroid Build Coastguard Worker} 703