1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck %s -check-prefix=R600 -check-prefix=FUNC 2*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -mtriple=r600-unknown-unknown -mcpu=redwood -amdgpu-promote-alloca < %s | FileCheck -check-prefix=OPT %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.r600.read.tidig.x() nounwind readnone 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}mova_same_clause: 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker; R600: LDS_WRITE 9*9880d681SAndroid Build Coastguard Worker; R600: LDS_WRITE 10*9880d681SAndroid Build Coastguard Worker; R600: LDS_READ 11*9880d681SAndroid Build Coastguard Worker; R600: LDS_READ 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker; OPT: call i32 @llvm.r600.read.local.size.y(), !range !0 14*9880d681SAndroid Build Coastguard Worker; OPT: call i32 @llvm.r600.read.local.size.z(), !range !0 15*9880d681SAndroid Build Coastguard Worker; OPT: call i32 @llvm.r600.read.tidig.x(), !range !0 16*9880d681SAndroid Build Coastguard Worker; OPT: call i32 @llvm.r600.read.tidig.y(), !range !0 17*9880d681SAndroid Build Coastguard Worker; OPT: call i32 @llvm.r600.read.tidig.z(), !range !0 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerdefine void @mova_same_clause(i32 addrspace(1)* nocapture %out, i32 addrspace(1)* nocapture %in) #0 { 20*9880d681SAndroid Build Coastguard Workerentry: 21*9880d681SAndroid Build Coastguard Worker %stack = alloca [5 x i32], align 4 22*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32 addrspace(1)* %in, align 4 23*9880d681SAndroid Build Coastguard Worker %arrayidx1 = getelementptr inbounds [5 x i32], [5 x i32]* %stack, i32 0, i32 %0 24*9880d681SAndroid Build Coastguard Worker store i32 4, i32* %arrayidx1, align 4 25*9880d681SAndroid Build Coastguard Worker %arrayidx2 = getelementptr inbounds i32, i32 addrspace(1)* %in, i32 1 26*9880d681SAndroid Build Coastguard Worker %1 = load i32, i32 addrspace(1)* %arrayidx2, align 4 27*9880d681SAndroid Build Coastguard Worker %arrayidx3 = getelementptr inbounds [5 x i32], [5 x i32]* %stack, i32 0, i32 %1 28*9880d681SAndroid Build Coastguard Worker store i32 5, i32* %arrayidx3, align 4 29*9880d681SAndroid Build Coastguard Worker %arrayidx10 = getelementptr inbounds [5 x i32], [5 x i32]* %stack, i32 0, i32 0 30*9880d681SAndroid Build Coastguard Worker %2 = load i32, i32* %arrayidx10, align 4 31*9880d681SAndroid Build Coastguard Worker store i32 %2, i32 addrspace(1)* %out, align 4 32*9880d681SAndroid Build Coastguard Worker %arrayidx12 = getelementptr inbounds [5 x i32], [5 x i32]* %stack, i32 0, i32 1 33*9880d681SAndroid Build Coastguard Worker %3 = load i32, i32* %arrayidx12 34*9880d681SAndroid Build Coastguard Worker %arrayidx13 = getelementptr inbounds i32, i32 addrspace(1)* %out, i32 1 35*9880d681SAndroid Build Coastguard Worker store i32 %3, i32 addrspace(1)* %arrayidx13 36*9880d681SAndroid Build Coastguard Worker ret void 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker; This test checks that the stack offset is calculated correctly for structs. 40*9880d681SAndroid Build Coastguard Worker; All register loads/stores should be optimized away, so there shouldn't be 41*9880d681SAndroid Build Coastguard Worker; any MOVA instructions. 42*9880d681SAndroid Build Coastguard Worker; 43*9880d681SAndroid Build Coastguard Worker; XXX: This generated code has unnecessary MOVs, we should be able to optimize 44*9880d681SAndroid Build Coastguard Worker; this. 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}multiple_structs: 47*9880d681SAndroid Build Coastguard Worker; R600-NOT: MOVA_INT 48*9880d681SAndroid Build Coastguard Worker%struct.point = type { i32, i32 } 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Workerdefine void @multiple_structs(i32 addrspace(1)* %out) #0 { 51*9880d681SAndroid Build Coastguard Workerentry: 52*9880d681SAndroid Build Coastguard Worker %a = alloca %struct.point 53*9880d681SAndroid Build Coastguard Worker %b = alloca %struct.point 54*9880d681SAndroid Build Coastguard Worker %a.x.ptr = getelementptr inbounds %struct.point, %struct.point* %a, i32 0, i32 0 55*9880d681SAndroid Build Coastguard Worker %a.y.ptr = getelementptr inbounds %struct.point, %struct.point* %a, i32 0, i32 1 56*9880d681SAndroid Build Coastguard Worker %b.x.ptr = getelementptr inbounds %struct.point, %struct.point* %b, i32 0, i32 0 57*9880d681SAndroid Build Coastguard Worker %b.y.ptr = getelementptr inbounds %struct.point, %struct.point* %b, i32 0, i32 1 58*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %a.x.ptr 59*9880d681SAndroid Build Coastguard Worker store i32 1, i32* %a.y.ptr 60*9880d681SAndroid Build Coastguard Worker store i32 2, i32* %b.x.ptr 61*9880d681SAndroid Build Coastguard Worker store i32 3, i32* %b.y.ptr 62*9880d681SAndroid Build Coastguard Worker %a.indirect.ptr = getelementptr inbounds %struct.point, %struct.point* %a, i32 0, i32 0 63*9880d681SAndroid Build Coastguard Worker %b.indirect.ptr = getelementptr inbounds %struct.point, %struct.point* %b, i32 0, i32 0 64*9880d681SAndroid Build Coastguard Worker %a.indirect = load i32, i32* %a.indirect.ptr 65*9880d681SAndroid Build Coastguard Worker %b.indirect = load i32, i32* %b.indirect.ptr 66*9880d681SAndroid Build Coastguard Worker %0 = add i32 %a.indirect, %b.indirect 67*9880d681SAndroid Build Coastguard Worker store i32 %0, i32 addrspace(1)* %out 68*9880d681SAndroid Build Coastguard Worker ret void 69*9880d681SAndroid Build Coastguard Worker} 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker; Test direct access of a private array inside a loop. The private array 72*9880d681SAndroid Build Coastguard Worker; loads and stores should be lowered to copies, so there shouldn't be any 73*9880d681SAndroid Build Coastguard Worker; MOVA instructions. 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}direct_loop: 76*9880d681SAndroid Build Coastguard Worker; R600-NOT: MOVA_INT 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Workerdefine void @direct_loop(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #0 { 79*9880d681SAndroid Build Coastguard Workerentry: 80*9880d681SAndroid Build Coastguard Worker %prv_array_const = alloca [2 x i32] 81*9880d681SAndroid Build Coastguard Worker %prv_array = alloca [2 x i32] 82*9880d681SAndroid Build Coastguard Worker %a = load i32, i32 addrspace(1)* %in 83*9880d681SAndroid Build Coastguard Worker %b_src_ptr = getelementptr inbounds i32, i32 addrspace(1)* %in, i32 1 84*9880d681SAndroid Build Coastguard Worker %b = load i32, i32 addrspace(1)* %b_src_ptr 85*9880d681SAndroid Build Coastguard Worker %a_dst_ptr = getelementptr inbounds [2 x i32], [2 x i32]* %prv_array_const, i32 0, i32 0 86*9880d681SAndroid Build Coastguard Worker store i32 %a, i32* %a_dst_ptr 87*9880d681SAndroid Build Coastguard Worker %b_dst_ptr = getelementptr inbounds [2 x i32], [2 x i32]* %prv_array_const, i32 0, i32 1 88*9880d681SAndroid Build Coastguard Worker store i32 %b, i32* %b_dst_ptr 89*9880d681SAndroid Build Coastguard Worker br label %for.body 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Workerfor.body: 92*9880d681SAndroid Build Coastguard Worker %inc = phi i32 [0, %entry], [%count, %for.body] 93*9880d681SAndroid Build Coastguard Worker %x_ptr = getelementptr inbounds [2 x i32], [2 x i32]* %prv_array_const, i32 0, i32 0 94*9880d681SAndroid Build Coastguard Worker %x = load i32, i32* %x_ptr 95*9880d681SAndroid Build Coastguard Worker %y_ptr = getelementptr inbounds [2 x i32], [2 x i32]* %prv_array, i32 0, i32 0 96*9880d681SAndroid Build Coastguard Worker %y = load i32, i32* %y_ptr 97*9880d681SAndroid Build Coastguard Worker %xy = add i32 %x, %y 98*9880d681SAndroid Build Coastguard Worker store i32 %xy, i32* %y_ptr 99*9880d681SAndroid Build Coastguard Worker %count = add i32 %inc, 1 100*9880d681SAndroid Build Coastguard Worker %done = icmp eq i32 %count, 4095 101*9880d681SAndroid Build Coastguard Worker br i1 %done, label %for.end, label %for.body 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Workerfor.end: 104*9880d681SAndroid Build Coastguard Worker %value_ptr = getelementptr inbounds [2 x i32], [2 x i32]* %prv_array, i32 0, i32 0 105*9880d681SAndroid Build Coastguard Worker %value = load i32, i32* %value_ptr 106*9880d681SAndroid Build Coastguard Worker store i32 %value, i32 addrspace(1)* %out 107*9880d681SAndroid Build Coastguard Worker ret void 108*9880d681SAndroid Build Coastguard Worker} 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}short_array: 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Worker; R600: MOVA_INT 113*9880d681SAndroid Build Coastguard Workerdefine void @short_array(i32 addrspace(1)* %out, i32 %index) #0 { 114*9880d681SAndroid Build Coastguard Workerentry: 115*9880d681SAndroid Build Coastguard Worker %0 = alloca [2 x i16] 116*9880d681SAndroid Build Coastguard Worker %1 = getelementptr inbounds [2 x i16], [2 x i16]* %0, i32 0, i32 0 117*9880d681SAndroid Build Coastguard Worker %2 = getelementptr inbounds [2 x i16], [2 x i16]* %0, i32 0, i32 1 118*9880d681SAndroid Build Coastguard Worker store i16 0, i16* %1 119*9880d681SAndroid Build Coastguard Worker store i16 1, i16* %2 120*9880d681SAndroid Build Coastguard Worker %3 = getelementptr inbounds [2 x i16], [2 x i16]* %0, i32 0, i32 %index 121*9880d681SAndroid Build Coastguard Worker %4 = load i16, i16* %3 122*9880d681SAndroid Build Coastguard Worker %5 = sext i16 %4 to i32 123*9880d681SAndroid Build Coastguard Worker store i32 %5, i32 addrspace(1)* %out 124*9880d681SAndroid Build Coastguard Worker ret void 125*9880d681SAndroid Build Coastguard Worker} 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}char_array: 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Worker; R600: MOVA_INT 130*9880d681SAndroid Build Coastguard Workerdefine void @char_array(i32 addrspace(1)* %out, i32 %index) #0 { 131*9880d681SAndroid Build Coastguard Workerentry: 132*9880d681SAndroid Build Coastguard Worker %0 = alloca [2 x i8] 133*9880d681SAndroid Build Coastguard Worker %1 = getelementptr inbounds [2 x i8], [2 x i8]* %0, i32 0, i32 0 134*9880d681SAndroid Build Coastguard Worker %2 = getelementptr inbounds [2 x i8], [2 x i8]* %0, i32 0, i32 1 135*9880d681SAndroid Build Coastguard Worker store i8 0, i8* %1 136*9880d681SAndroid Build Coastguard Worker store i8 1, i8* %2 137*9880d681SAndroid Build Coastguard Worker %3 = getelementptr inbounds [2 x i8], [2 x i8]* %0, i32 0, i32 %index 138*9880d681SAndroid Build Coastguard Worker %4 = load i8, i8* %3 139*9880d681SAndroid Build Coastguard Worker %5 = sext i8 %4 to i32 140*9880d681SAndroid Build Coastguard Worker store i32 %5, i32 addrspace(1)* %out 141*9880d681SAndroid Build Coastguard Worker ret void 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Worker} 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Worker; Make sure we don't overwrite workitem information with private memory 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}work_item_info: 148*9880d681SAndroid Build Coastguard Worker; R600-NOT: MOV T0.X 149*9880d681SAndroid Build Coastguard Worker; Additional check in case the move ends up in the last slot 150*9880d681SAndroid Build Coastguard Worker; R600-NOT: MOV * TO.X 151*9880d681SAndroid Build Coastguard Workerdefine void @work_item_info(i32 addrspace(1)* %out, i32 %in) #0 { 152*9880d681SAndroid Build Coastguard Workerentry: 153*9880d681SAndroid Build Coastguard Worker %0 = alloca [2 x i32] 154*9880d681SAndroid Build Coastguard Worker %1 = getelementptr inbounds [2 x i32], [2 x i32]* %0, i32 0, i32 0 155*9880d681SAndroid Build Coastguard Worker %2 = getelementptr inbounds [2 x i32], [2 x i32]* %0, i32 0, i32 1 156*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %1 157*9880d681SAndroid Build Coastguard Worker store i32 1, i32* %2 158*9880d681SAndroid Build Coastguard Worker %3 = getelementptr inbounds [2 x i32], [2 x i32]* %0, i32 0, i32 %in 159*9880d681SAndroid Build Coastguard Worker %4 = load i32, i32* %3 160*9880d681SAndroid Build Coastguard Worker %5 = call i32 @llvm.r600.read.tidig.x() 161*9880d681SAndroid Build Coastguard Worker %6 = add i32 %4, %5 162*9880d681SAndroid Build Coastguard Worker store i32 %6, i32 addrspace(1)* %out 163*9880d681SAndroid Build Coastguard Worker ret void 164*9880d681SAndroid Build Coastguard Worker} 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Worker; Test that two stack objects are not stored in the same register 167*9880d681SAndroid Build Coastguard Worker; The second stack object should be in T3.X 168*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}no_overlap: 169*9880d681SAndroid Build Coastguard Worker; R600_CHECK: MOV 170*9880d681SAndroid Build Coastguard Worker; R600_CHECK: [[CHAN:[XYZW]]]+ 171*9880d681SAndroid Build Coastguard Worker; R600-NOT: [[CHAN]]+ 172*9880d681SAndroid Build Coastguard Workerdefine void @no_overlap(i32 addrspace(1)* %out, i32 %in) #0 { 173*9880d681SAndroid Build Coastguard Workerentry: 174*9880d681SAndroid Build Coastguard Worker %0 = alloca [3 x i8], align 1 175*9880d681SAndroid Build Coastguard Worker %1 = alloca [2 x i8], align 1 176*9880d681SAndroid Build Coastguard Worker %2 = getelementptr inbounds [3 x i8], [3 x i8]* %0, i32 0, i32 0 177*9880d681SAndroid Build Coastguard Worker %3 = getelementptr inbounds [3 x i8], [3 x i8]* %0, i32 0, i32 1 178*9880d681SAndroid Build Coastguard Worker %4 = getelementptr inbounds [3 x i8], [3 x i8]* %0, i32 0, i32 2 179*9880d681SAndroid Build Coastguard Worker %5 = getelementptr inbounds [2 x i8], [2 x i8]* %1, i32 0, i32 0 180*9880d681SAndroid Build Coastguard Worker %6 = getelementptr inbounds [2 x i8], [2 x i8]* %1, i32 0, i32 1 181*9880d681SAndroid Build Coastguard Worker store i8 0, i8* %2 182*9880d681SAndroid Build Coastguard Worker store i8 1, i8* %3 183*9880d681SAndroid Build Coastguard Worker store i8 2, i8* %4 184*9880d681SAndroid Build Coastguard Worker store i8 1, i8* %5 185*9880d681SAndroid Build Coastguard Worker store i8 0, i8* %6 186*9880d681SAndroid Build Coastguard Worker %7 = getelementptr inbounds [3 x i8], [3 x i8]* %0, i32 0, i32 %in 187*9880d681SAndroid Build Coastguard Worker %8 = getelementptr inbounds [2 x i8], [2 x i8]* %1, i32 0, i32 %in 188*9880d681SAndroid Build Coastguard Worker %9 = load i8, i8* %7 189*9880d681SAndroid Build Coastguard Worker %10 = load i8, i8* %8 190*9880d681SAndroid Build Coastguard Worker %11 = add i8 %9, %10 191*9880d681SAndroid Build Coastguard Worker %12 = sext i8 %11 to i32 192*9880d681SAndroid Build Coastguard Worker store i32 %12, i32 addrspace(1)* %out 193*9880d681SAndroid Build Coastguard Worker ret void 194*9880d681SAndroid Build Coastguard Worker} 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard Workerdefine void @char_array_array(i32 addrspace(1)* %out, i32 %index) #0 { 197*9880d681SAndroid Build Coastguard Workerentry: 198*9880d681SAndroid Build Coastguard Worker %alloca = alloca [2 x [2 x i8]] 199*9880d681SAndroid Build Coastguard Worker %gep0 = getelementptr inbounds [2 x [2 x i8]], [2 x [2 x i8]]* %alloca, i32 0, i32 0, i32 0 200*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr inbounds [2 x [2 x i8]], [2 x [2 x i8]]* %alloca, i32 0, i32 0, i32 1 201*9880d681SAndroid Build Coastguard Worker store i8 0, i8* %gep0 202*9880d681SAndroid Build Coastguard Worker store i8 1, i8* %gep1 203*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr inbounds [2 x [2 x i8]], [2 x [2 x i8]]* %alloca, i32 0, i32 0, i32 %index 204*9880d681SAndroid Build Coastguard Worker %load = load i8, i8* %gep2 205*9880d681SAndroid Build Coastguard Worker %sext = sext i8 %load to i32 206*9880d681SAndroid Build Coastguard Worker store i32 %sext, i32 addrspace(1)* %out 207*9880d681SAndroid Build Coastguard Worker ret void 208*9880d681SAndroid Build Coastguard Worker} 209*9880d681SAndroid Build Coastguard Worker 210*9880d681SAndroid Build Coastguard Workerdefine void @i32_array_array(i32 addrspace(1)* %out, i32 %index) #0 { 211*9880d681SAndroid Build Coastguard Workerentry: 212*9880d681SAndroid Build Coastguard Worker %alloca = alloca [2 x [2 x i32]] 213*9880d681SAndroid Build Coastguard Worker %gep0 = getelementptr inbounds [2 x [2 x i32]], [2 x [2 x i32]]* %alloca, i32 0, i32 0, i32 0 214*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr inbounds [2 x [2 x i32]], [2 x [2 x i32]]* %alloca, i32 0, i32 0, i32 1 215*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %gep0 216*9880d681SAndroid Build Coastguard Worker store i32 1, i32* %gep1 217*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr inbounds [2 x [2 x i32]], [2 x [2 x i32]]* %alloca, i32 0, i32 0, i32 %index 218*9880d681SAndroid Build Coastguard Worker %load = load i32, i32* %gep2 219*9880d681SAndroid Build Coastguard Worker store i32 %load, i32 addrspace(1)* %out 220*9880d681SAndroid Build Coastguard Worker ret void 221*9880d681SAndroid Build Coastguard Worker} 222*9880d681SAndroid Build Coastguard Worker 223*9880d681SAndroid Build Coastguard Workerdefine void @i64_array_array(i64 addrspace(1)* %out, i32 %index) #0 { 224*9880d681SAndroid Build Coastguard Workerentry: 225*9880d681SAndroid Build Coastguard Worker %alloca = alloca [2 x [2 x i64]] 226*9880d681SAndroid Build Coastguard Worker %gep0 = getelementptr inbounds [2 x [2 x i64]], [2 x [2 x i64]]* %alloca, i32 0, i32 0, i32 0 227*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr inbounds [2 x [2 x i64]], [2 x [2 x i64]]* %alloca, i32 0, i32 0, i32 1 228*9880d681SAndroid Build Coastguard Worker store i64 0, i64* %gep0 229*9880d681SAndroid Build Coastguard Worker store i64 1, i64* %gep1 230*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr inbounds [2 x [2 x i64]], [2 x [2 x i64]]* %alloca, i32 0, i32 0, i32 %index 231*9880d681SAndroid Build Coastguard Worker %load = load i64, i64* %gep2 232*9880d681SAndroid Build Coastguard Worker store i64 %load, i64 addrspace(1)* %out 233*9880d681SAndroid Build Coastguard Worker ret void 234*9880d681SAndroid Build Coastguard Worker} 235*9880d681SAndroid Build Coastguard Worker 236*9880d681SAndroid Build Coastguard Worker%struct.pair32 = type { i32, i32 } 237*9880d681SAndroid Build Coastguard Worker 238*9880d681SAndroid Build Coastguard Workerdefine void @struct_array_array(i32 addrspace(1)* %out, i32 %index) #0 { 239*9880d681SAndroid Build Coastguard Workerentry: 240*9880d681SAndroid Build Coastguard Worker %alloca = alloca [2 x [2 x %struct.pair32]] 241*9880d681SAndroid Build Coastguard Worker %gep0 = getelementptr inbounds [2 x [2 x %struct.pair32]], [2 x [2 x %struct.pair32]]* %alloca, i32 0, i32 0, i32 0, i32 1 242*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr inbounds [2 x [2 x %struct.pair32]], [2 x [2 x %struct.pair32]]* %alloca, i32 0, i32 0, i32 1, i32 1 243*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %gep0 244*9880d681SAndroid Build Coastguard Worker store i32 1, i32* %gep1 245*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr inbounds [2 x [2 x %struct.pair32]], [2 x [2 x %struct.pair32]]* %alloca, i32 0, i32 0, i32 %index, i32 0 246*9880d681SAndroid Build Coastguard Worker %load = load i32, i32* %gep2 247*9880d681SAndroid Build Coastguard Worker store i32 %load, i32 addrspace(1)* %out 248*9880d681SAndroid Build Coastguard Worker ret void 249*9880d681SAndroid Build Coastguard Worker} 250*9880d681SAndroid Build Coastguard Worker 251*9880d681SAndroid Build Coastguard Workerdefine void @struct_pair32_array(i32 addrspace(1)* %out, i32 %index) #0 { 252*9880d681SAndroid Build Coastguard Workerentry: 253*9880d681SAndroid Build Coastguard Worker %alloca = alloca [2 x %struct.pair32] 254*9880d681SAndroid Build Coastguard Worker %gep0 = getelementptr inbounds [2 x %struct.pair32], [2 x %struct.pair32]* %alloca, i32 0, i32 0, i32 1 255*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr inbounds [2 x %struct.pair32], [2 x %struct.pair32]* %alloca, i32 0, i32 1, i32 0 256*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %gep0 257*9880d681SAndroid Build Coastguard Worker store i32 1, i32* %gep1 258*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr inbounds [2 x %struct.pair32], [2 x %struct.pair32]* %alloca, i32 0, i32 %index, i32 0 259*9880d681SAndroid Build Coastguard Worker %load = load i32, i32* %gep2 260*9880d681SAndroid Build Coastguard Worker store i32 %load, i32 addrspace(1)* %out 261*9880d681SAndroid Build Coastguard Worker ret void 262*9880d681SAndroid Build Coastguard Worker} 263*9880d681SAndroid Build Coastguard Worker 264*9880d681SAndroid Build Coastguard Workerdefine void @select_private(i32 addrspace(1)* %out, i32 %in) nounwind { 265*9880d681SAndroid Build Coastguard Workerentry: 266*9880d681SAndroid Build Coastguard Worker %tmp = alloca [2 x i32] 267*9880d681SAndroid Build Coastguard Worker %tmp1 = getelementptr inbounds [2 x i32], [2 x i32]* %tmp, i32 0, i32 0 268*9880d681SAndroid Build Coastguard Worker %tmp2 = getelementptr inbounds [2 x i32], [2 x i32]* %tmp, i32 0, i32 1 269*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %tmp1 270*9880d681SAndroid Build Coastguard Worker store i32 1, i32* %tmp2 271*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %in, 0 272*9880d681SAndroid Build Coastguard Worker %sel = select i1 %cmp, i32* %tmp1, i32* %tmp2 273*9880d681SAndroid Build Coastguard Worker %load = load i32, i32* %sel 274*9880d681SAndroid Build Coastguard Worker store i32 %load, i32 addrspace(1)* %out 275*9880d681SAndroid Build Coastguard Worker ret void 276*9880d681SAndroid Build Coastguard Worker} 277*9880d681SAndroid Build Coastguard Worker 278*9880d681SAndroid Build Coastguard Worker; AMDGPUPromoteAlloca does not know how to handle ptrtoint. When it 279*9880d681SAndroid Build Coastguard Worker; finds one, it should stop trying to promote. 280*9880d681SAndroid Build Coastguard Worker 281*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: ptrtoint: 282*9880d681SAndroid Build Coastguard Worker; SI-NOT: ds_write 283*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword v{{[0-9]+}}, v{{[0-9]+}}, s[{{[0-9]+:[0-9]+}}], s{{[0-9]+}} offen 284*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword v{{[0-9]+}}, v{{[0-9]+}}, s[{{[0-9]+:[0-9]+}}], s{{[0-9]+}} offen ; 285*9880d681SAndroid Build Coastguard Workerdefine void @ptrtoint(i32 addrspace(1)* %out, i32 %a, i32 %b) #0 { 286*9880d681SAndroid Build Coastguard Worker %alloca = alloca [16 x i32] 287*9880d681SAndroid Build Coastguard Worker %tmp0 = getelementptr inbounds [16 x i32], [16 x i32]* %alloca, i32 0, i32 %a 288*9880d681SAndroid Build Coastguard Worker store i32 5, i32* %tmp0 289*9880d681SAndroid Build Coastguard Worker %tmp1 = ptrtoint [16 x i32]* %alloca to i32 290*9880d681SAndroid Build Coastguard Worker %tmp2 = add i32 %tmp1, 5 291*9880d681SAndroid Build Coastguard Worker %tmp3 = inttoptr i32 %tmp2 to i32* 292*9880d681SAndroid Build Coastguard Worker %tmp4 = getelementptr inbounds i32, i32* %tmp3, i32 %b 293*9880d681SAndroid Build Coastguard Worker %tmp5 = load i32, i32* %tmp4 294*9880d681SAndroid Build Coastguard Worker store i32 %tmp5, i32 addrspace(1)* %out 295*9880d681SAndroid Build Coastguard Worker ret void 296*9880d681SAndroid Build Coastguard Worker} 297*9880d681SAndroid Build Coastguard Worker 298*9880d681SAndroid Build Coastguard Worker; OPT: !0 = !{i32 0, i32 2048} 299*9880d681SAndroid Build Coastguard Worker 300*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind "amdgpu-max-waves-per-eu"="2" } 301