1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -default-data-layout="e-p:64:64:64-p1:16:16:16-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" -instcombine -S | FileCheck %s --check-prefix=LE 2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -default-data-layout="E-p:64:64:64-p1:16:16:16-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" -instcombine -S | FileCheck %s --check-prefix=BE 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; {{ 0xDEADBEEF, 0xBA }, 0xCAFEBABE} 5*9880d681SAndroid Build Coastguard Worker@g1 = constant {{i32,i8},i32} {{i32,i8} { i32 -559038737, i8 186 }, i32 -889275714 } 6*9880d681SAndroid Build Coastguard Worker@g2 = constant double 1.0 7*9880d681SAndroid Build Coastguard Worker; { 0x7B, 0x06B1BFF8 } 8*9880d681SAndroid Build Coastguard Worker@g3 = constant {i64, i64} { i64 123, i64 112312312 } 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker; Simple load 11*9880d681SAndroid Build Coastguard Workerdefine i32 @test1() { 12*9880d681SAndroid Build Coastguard Worker %r = load i32, i32* getelementptr ({{i32,i8},i32}, {{i32,i8},i32}* @g1, i32 0, i32 0, i32 0) 13*9880d681SAndroid Build Coastguard Worker ret i32 %r 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker; 0xDEADBEEF 16*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test1( 17*9880d681SAndroid Build Coastguard Worker; LE: ret i32 -559038737 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker; 0xDEADBEEF 20*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test1( 21*9880d681SAndroid Build Coastguard Worker; BE: ret i32 -559038737 22*9880d681SAndroid Build Coastguard Worker} 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Worker; PR3152 25*9880d681SAndroid Build Coastguard Worker; Load of first 16 bits of 32-bit value. 26*9880d681SAndroid Build Coastguard Workerdefine i16 @test2() { 27*9880d681SAndroid Build Coastguard Worker %r = load i16, i16* bitcast(i32* getelementptr ({{i32,i8},i32}, {{i32,i8},i32}* @g1, i32 0, i32 0, i32 0) to i16*) 28*9880d681SAndroid Build Coastguard Worker ret i16 %r 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker; 0xBEEF 31*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test2( 32*9880d681SAndroid Build Coastguard Worker; LE: ret i16 -16657 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker; 0xDEAD 35*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test2( 36*9880d681SAndroid Build Coastguard Worker; BE: ret i16 -8531 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workerdefine i16 @test2_addrspacecast() { 40*9880d681SAndroid Build Coastguard Worker %r = load i16, i16 addrspace(1)* addrspacecast(i32* getelementptr ({{i32,i8},i32}, {{i32,i8},i32}* @g1, i32 0, i32 0, i32 0) to i16 addrspace(1)*) 41*9880d681SAndroid Build Coastguard Worker ret i16 %r 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker; FIXME: Should be able to load through a constant addrspacecast. 44*9880d681SAndroid Build Coastguard Worker; 0xBEEF 45*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test2_addrspacecast( 46*9880d681SAndroid Build Coastguard Worker; XLE: ret i16 -16657 47*9880d681SAndroid Build Coastguard Worker; LE: load i16, i16 addrspace(1)* addrspacecast 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker; 0xDEAD 50*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test2_addrspacecast( 51*9880d681SAndroid Build Coastguard Worker; XBE: ret i16 -8531 52*9880d681SAndroid Build Coastguard Worker; BE: load i16, i16 addrspace(1)* addrspacecast 53*9880d681SAndroid Build Coastguard Worker} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker; Load of second 16 bits of 32-bit value. 56*9880d681SAndroid Build Coastguard Workerdefine i16 @test3() { 57*9880d681SAndroid Build Coastguard Worker %r = load i16, i16* getelementptr(i16, i16* bitcast(i32* getelementptr ({{i32,i8},i32}, {{i32,i8},i32}* @g1, i32 0, i32 0, i32 0) to i16*), i32 1) 58*9880d681SAndroid Build Coastguard Worker ret i16 %r 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker; 0xDEAD 61*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test3( 62*9880d681SAndroid Build Coastguard Worker; LE: ret i16 -8531 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker; 0xBEEF 65*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test3( 66*9880d681SAndroid Build Coastguard Worker; BE: ret i16 -16657 67*9880d681SAndroid Build Coastguard Worker} 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker; Load of 8 bit field + tail padding. 70*9880d681SAndroid Build Coastguard Workerdefine i16 @test4() { 71*9880d681SAndroid Build Coastguard Worker %r = load i16, i16* getelementptr(i16, i16* bitcast(i32* getelementptr ({{i32,i8},i32}, {{i32,i8},i32}* @g1, i32 0, i32 0, i32 0) to i16*), i32 2) 72*9880d681SAndroid Build Coastguard Worker ret i16 %r 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker; 0x00BA 75*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test4( 76*9880d681SAndroid Build Coastguard Worker; LE: ret i16 186 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker; 0xBA00 79*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test4( 80*9880d681SAndroid Build Coastguard Worker; BE: ret i16 -17920 81*9880d681SAndroid Build Coastguard Worker} 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker; Load of double bits. 84*9880d681SAndroid Build Coastguard Workerdefine i64 @test6() { 85*9880d681SAndroid Build Coastguard Worker %r = load i64, i64* bitcast(double* @g2 to i64*) 86*9880d681SAndroid Build Coastguard Worker ret i64 %r 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Worker; 0x3FF_0000000000000 89*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test6( 90*9880d681SAndroid Build Coastguard Worker; LE: ret i64 4607182418800017408 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker; 0x3FF_0000000000000 93*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test6( 94*9880d681SAndroid Build Coastguard Worker; BE: ret i64 4607182418800017408 95*9880d681SAndroid Build Coastguard Worker} 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Worker; Load of double bits. 98*9880d681SAndroid Build Coastguard Workerdefine i16 @test7() { 99*9880d681SAndroid Build Coastguard Worker %r = load i16, i16* bitcast(double* @g2 to i16*) 100*9880d681SAndroid Build Coastguard Worker ret i16 %r 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker; 0x0000 103*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test7( 104*9880d681SAndroid Build Coastguard Worker; LE: ret i16 0 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Worker; 0x3FF0 107*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test7( 108*9880d681SAndroid Build Coastguard Worker; BE: ret i16 16368 109*9880d681SAndroid Build Coastguard Worker} 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Worker; Double load. 112*9880d681SAndroid Build Coastguard Workerdefine double @test8() { 113*9880d681SAndroid Build Coastguard Worker %r = load double, double* bitcast({{i32,i8},i32}* @g1 to double*) 114*9880d681SAndroid Build Coastguard Worker ret double %r 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test8( 117*9880d681SAndroid Build Coastguard Worker; LE: ret double 0xBADEADBEEF 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test8( 120*9880d681SAndroid Build Coastguard Worker; BE: ret double 0xDEADBEEFBA000000 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Worker; i128 load. 125*9880d681SAndroid Build Coastguard Workerdefine i128 @test9() { 126*9880d681SAndroid Build Coastguard Worker %r = load i128, i128* bitcast({i64, i64}* @g3 to i128*) 127*9880d681SAndroid Build Coastguard Worker ret i128 %r 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Worker; 0x00000000_06B1BFF8_00000000_0000007B 130*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test9( 131*9880d681SAndroid Build Coastguard Worker; LE: ret i128 2071796475790618158476296315 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Worker; 0x00000000_0000007B_00000000_06B1BFF8 134*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test9( 135*9880d681SAndroid Build Coastguard Worker; BE: ret i128 2268949521066387161080 136*9880d681SAndroid Build Coastguard Worker} 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Worker; vector load. 139*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test10() { 140*9880d681SAndroid Build Coastguard Worker %r = load <2 x i64>, <2 x i64>* bitcast({i64, i64}* @g3 to <2 x i64>*) 141*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %r 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test10( 144*9880d681SAndroid Build Coastguard Worker; LE: ret <2 x i64> <i64 123, i64 112312312> 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test10( 147*9880d681SAndroid Build Coastguard Worker; BE: ret <2 x i64> <i64 123, i64 112312312> 148*9880d681SAndroid Build Coastguard Worker} 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Worker; PR5287 152*9880d681SAndroid Build Coastguard Worker; { 0xA1, 0x08 } 153*9880d681SAndroid Build Coastguard Worker@g4 = internal constant { i8, i8 } { i8 -95, i8 8 } 154*9880d681SAndroid Build Coastguard Worker 155*9880d681SAndroid Build Coastguard Workerdefine i16 @test11() nounwind { 156*9880d681SAndroid Build Coastguard Workerentry: 157*9880d681SAndroid Build Coastguard Worker %a = load i16, i16* bitcast ({ i8, i8 }* @g4 to i16*) 158*9880d681SAndroid Build Coastguard Worker ret i16 %a 159*9880d681SAndroid Build Coastguard Worker 160*9880d681SAndroid Build Coastguard Worker; 0x08A1 161*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test11( 162*9880d681SAndroid Build Coastguard Worker; LE: ret i16 2209 163*9880d681SAndroid Build Coastguard Worker 164*9880d681SAndroid Build Coastguard Worker; 0xA108 165*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test11( 166*9880d681SAndroid Build Coastguard Worker; BE: ret i16 -24312 167*9880d681SAndroid Build Coastguard Worker} 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Worker 170*9880d681SAndroid Build Coastguard Worker; PR5551 171*9880d681SAndroid Build Coastguard Worker@test12g = private constant [6 x i8] c"a\00b\00\00\00" 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Workerdefine i16 @test12() { 174*9880d681SAndroid Build Coastguard Worker %a = load i16, i16* getelementptr inbounds ([3 x i16], [3 x i16]* bitcast ([6 x i8]* @test12g to [3 x i16]*), i32 0, i64 1) 175*9880d681SAndroid Build Coastguard Worker ret i16 %a 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Worker; 0x0062 178*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test12( 179*9880d681SAndroid Build Coastguard Worker; LE: ret i16 98 180*9880d681SAndroid Build Coastguard Worker 181*9880d681SAndroid Build Coastguard Worker; 0x6200 182*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test12( 183*9880d681SAndroid Build Coastguard Worker; BE: ret i16 25088 184*9880d681SAndroid Build Coastguard Worker} 185*9880d681SAndroid Build Coastguard Worker 186*9880d681SAndroid Build Coastguard Worker 187*9880d681SAndroid Build Coastguard Worker; PR5978 188*9880d681SAndroid Build Coastguard Worker@g5 = constant i8 4 189*9880d681SAndroid Build Coastguard Workerdefine i1 @test13() { 190*9880d681SAndroid Build Coastguard Worker %A = load i1, i1* bitcast (i8* @g5 to i1*) 191*9880d681SAndroid Build Coastguard Worker ret i1 %A 192*9880d681SAndroid Build Coastguard Worker 193*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test13( 194*9880d681SAndroid Build Coastguard Worker; LE: ret i1 false 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test13( 197*9880d681SAndroid Build Coastguard Worker; BE: ret i1 false 198*9880d681SAndroid Build Coastguard Worker} 199*9880d681SAndroid Build Coastguard Worker 200*9880d681SAndroid Build Coastguard Worker@g6 = constant [2 x i8*] [i8* inttoptr (i64 1 to i8*), i8* inttoptr (i64 2 to i8*)] 201*9880d681SAndroid Build Coastguard Workerdefine i64 @test14() nounwind { 202*9880d681SAndroid Build Coastguard Workerentry: 203*9880d681SAndroid Build Coastguard Worker %tmp = load i64, i64* bitcast ([2 x i8*]* @g6 to i64*) 204*9880d681SAndroid Build Coastguard Worker ret i64 %tmp 205*9880d681SAndroid Build Coastguard Worker 206*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test14( 207*9880d681SAndroid Build Coastguard Worker; LE: ret i64 1 208*9880d681SAndroid Build Coastguard Worker 209*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test14( 210*9880d681SAndroid Build Coastguard Worker; BE: ret i64 1 211*9880d681SAndroid Build Coastguard Worker} 212*9880d681SAndroid Build Coastguard Worker 213*9880d681SAndroid Build Coastguard Worker; Check with address space pointers 214*9880d681SAndroid Build Coastguard Worker@g6_as1 = constant [2 x i8 addrspace(1)*] [i8 addrspace(1)* inttoptr (i16 1 to i8 addrspace(1)*), i8 addrspace(1)* inttoptr (i16 2 to i8 addrspace(1)*)] 215*9880d681SAndroid Build Coastguard Workerdefine i16 @test14_as1() nounwind { 216*9880d681SAndroid Build Coastguard Workerentry: 217*9880d681SAndroid Build Coastguard Worker %tmp = load i16, i16* bitcast ([2 x i8 addrspace(1)*]* @g6_as1 to i16*) 218*9880d681SAndroid Build Coastguard Worker ret i16 %tmp 219*9880d681SAndroid Build Coastguard Worker 220*9880d681SAndroid Build Coastguard Worker; LE: @test14_as1 221*9880d681SAndroid Build Coastguard Worker; LE: ret i16 1 222*9880d681SAndroid Build Coastguard Worker 223*9880d681SAndroid Build Coastguard Worker; BE: @test14_as1 224*9880d681SAndroid Build Coastguard Worker; BE: ret i16 1 225*9880d681SAndroid Build Coastguard Worker} 226*9880d681SAndroid Build Coastguard Worker 227*9880d681SAndroid Build Coastguard Workerdefine i64 @test15() nounwind { 228*9880d681SAndroid Build Coastguard Workerentry: 229*9880d681SAndroid Build Coastguard Worker %tmp = load i64, i64* bitcast (i8** getelementptr inbounds ([2 x i8*], [2 x i8*]* @g6, i32 0, i64 1) to i64*) 230*9880d681SAndroid Build Coastguard Worker ret i64 %tmp 231*9880d681SAndroid Build Coastguard Worker 232*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test15( 233*9880d681SAndroid Build Coastguard Worker; LE: ret i64 2 234*9880d681SAndroid Build Coastguard Worker 235*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test15( 236*9880d681SAndroid Build Coastguard Worker; BE: ret i64 2 237*9880d681SAndroid Build Coastguard Worker} 238*9880d681SAndroid Build Coastguard Worker 239*9880d681SAndroid Build Coastguard Worker@gv7 = constant [4 x i8*] [i8* null, i8* inttoptr (i64 -14 to i8*), i8* null, i8* null] 240*9880d681SAndroid Build Coastguard Workerdefine i64 @test16.1() { 241*9880d681SAndroid Build Coastguard Worker %v = load i64, i64* bitcast ([4 x i8*]* @gv7 to i64*), align 8 242*9880d681SAndroid Build Coastguard Worker ret i64 %v 243*9880d681SAndroid Build Coastguard Worker 244*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test16.1( 245*9880d681SAndroid Build Coastguard Worker; LE: ret i64 0 246*9880d681SAndroid Build Coastguard Worker 247*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test16.1( 248*9880d681SAndroid Build Coastguard Worker; BE: ret i64 0 249*9880d681SAndroid Build Coastguard Worker} 250*9880d681SAndroid Build Coastguard Worker 251*9880d681SAndroid Build Coastguard Workerdefine i64 @test16.2() { 252*9880d681SAndroid Build Coastguard Worker %v = load i64, i64* bitcast (i8** getelementptr inbounds ([4 x i8*], [4 x i8*]* @gv7, i64 0, i64 1) to i64*), align 8 253*9880d681SAndroid Build Coastguard Worker ret i64 %v 254*9880d681SAndroid Build Coastguard Worker 255*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test16.2( 256*9880d681SAndroid Build Coastguard Worker; LE: ret i64 -14 257*9880d681SAndroid Build Coastguard Worker 258*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test16.2( 259*9880d681SAndroid Build Coastguard Worker; BE: ret i64 -14 260*9880d681SAndroid Build Coastguard Worker} 261*9880d681SAndroid Build Coastguard Worker 262*9880d681SAndroid Build Coastguard Workerdefine i64 @test16.3() { 263*9880d681SAndroid Build Coastguard Worker %v = load i64, i64* bitcast (i8** getelementptr inbounds ([4 x i8*], [4 x i8*]* @gv7, i64 0, i64 2) to i64*), align 8 264*9880d681SAndroid Build Coastguard Worker ret i64 %v 265*9880d681SAndroid Build Coastguard Worker 266*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test16.3( 267*9880d681SAndroid Build Coastguard Worker; LE: ret i64 0 268*9880d681SAndroid Build Coastguard Worker 269*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test16.3( 270*9880d681SAndroid Build Coastguard Worker; BE: ret i64 0 271*9880d681SAndroid Build Coastguard Worker} 272