1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -mtriple=amdgcn-unknown-amdhsa -mcpu=kaveri -amdgpu-promote-alloca < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @branch_ptr_var_same_alloca( 5*9880d681SAndroid Build Coastguard Worker; CHECK: getelementptr inbounds [256 x [64 x i32]], [256 x [64 x i32]] addrspace(3)* @branch_ptr_var_same_alloca.alloca, i32 0, i32 %{{[0-9]+}} 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; CHECK: if: 8*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx0 = getelementptr inbounds [64 x i32], [64 x i32] addrspace(3)* %{{[0-9]+}}, i32 0, i32 %a 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker; CHECK: else: 11*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx1 = getelementptr inbounds [64 x i32], [64 x i32] addrspace(3)* %15, i32 0, i32 %b 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker; CHECK: endif: 14*9880d681SAndroid Build Coastguard Worker; CHECK: %phi.ptr = phi i32 addrspace(3)* [ %arrayidx0, %if ], [ %arrayidx1, %else ] 15*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 0, i32 addrspace(3)* %phi.ptr, align 4 16*9880d681SAndroid Build Coastguard Workerdefine void @branch_ptr_var_same_alloca(i32 %a, i32 %b) #0 { 17*9880d681SAndroid Build Coastguard Workerentry: 18*9880d681SAndroid Build Coastguard Worker %alloca = alloca [64 x i32], align 4 19*9880d681SAndroid Build Coastguard Worker br i1 undef, label %if, label %else 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerif: 22*9880d681SAndroid Build Coastguard Worker %arrayidx0 = getelementptr inbounds [64 x i32], [64 x i32]* %alloca, i32 0, i32 %a 23*9880d681SAndroid Build Coastguard Worker br label %endif 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerelse: 26*9880d681SAndroid Build Coastguard Worker %arrayidx1 = getelementptr inbounds [64 x i32], [64 x i32]* %alloca, i32 0, i32 %b 27*9880d681SAndroid Build Coastguard Worker br label %endif 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerendif: 30*9880d681SAndroid Build Coastguard Worker %phi.ptr = phi i32* [ %arrayidx0, %if ], [ %arrayidx1, %else ] 31*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %phi.ptr, align 4 32*9880d681SAndroid Build Coastguard Worker ret void 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @branch_ptr_phi_alloca_null_0( 36*9880d681SAndroid Build Coastguard Worker; CHECK: %phi.ptr = phi i32 addrspace(3)* [ %arrayidx0, %if ], [ null, %entry ] 37*9880d681SAndroid Build Coastguard Workerdefine void @branch_ptr_phi_alloca_null_0(i32 %a, i32 %b) #0 { 38*9880d681SAndroid Build Coastguard Workerentry: 39*9880d681SAndroid Build Coastguard Worker %alloca = alloca [64 x i32], align 4 40*9880d681SAndroid Build Coastguard Worker br i1 undef, label %if, label %endif 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerif: 43*9880d681SAndroid Build Coastguard Worker %arrayidx0 = getelementptr inbounds [64 x i32], [64 x i32]* %alloca, i32 0, i32 %a 44*9880d681SAndroid Build Coastguard Worker br label %endif 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerendif: 47*9880d681SAndroid Build Coastguard Worker %phi.ptr = phi i32* [ %arrayidx0, %if ], [ null, %entry ] 48*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %phi.ptr, align 4 49*9880d681SAndroid Build Coastguard Worker ret void 50*9880d681SAndroid Build Coastguard Worker} 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @branch_ptr_phi_alloca_null_1( 53*9880d681SAndroid Build Coastguard Worker; CHECK: %phi.ptr = phi i32 addrspace(3)* [ null, %entry ], [ %arrayidx0, %if ] 54*9880d681SAndroid Build Coastguard Workerdefine void @branch_ptr_phi_alloca_null_1(i32 %a, i32 %b) #0 { 55*9880d681SAndroid Build Coastguard Workerentry: 56*9880d681SAndroid Build Coastguard Worker %alloca = alloca [64 x i32], align 4 57*9880d681SAndroid Build Coastguard Worker br i1 undef, label %if, label %endif 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerif: 60*9880d681SAndroid Build Coastguard Worker %arrayidx0 = getelementptr inbounds [64 x i32], [64 x i32]* %alloca, i32 0, i32 %a 61*9880d681SAndroid Build Coastguard Worker br label %endif 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workerendif: 64*9880d681SAndroid Build Coastguard Worker %phi.ptr = phi i32* [ null, %entry ], [ %arrayidx0, %if ] 65*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %phi.ptr, align 4 66*9880d681SAndroid Build Coastguard Worker ret void 67*9880d681SAndroid Build Coastguard Worker} 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @one_phi_value( 70*9880d681SAndroid Build Coastguard Worker; CHECK: getelementptr inbounds [256 x [64 x i32]], [256 x [64 x i32]] addrspace(3)* @one_phi_value.alloca, i32 0, i32 %14 71*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx0 = getelementptr inbounds [64 x i32], [64 x i32] addrspace(3)* %{{[0-9]+}}, i32 0, i32 %a 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker; CHECK: br label %exit 74*9880d681SAndroid Build Coastguard Worker; CHECK: %phi.ptr = phi i32 addrspace(3)* [ %arrayidx0, %entry ] 75*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 0, i32 addrspace(3)* %phi.ptr, align 4 76*9880d681SAndroid Build Coastguard Workerdefine void @one_phi_value(i32 %a) #0 { 77*9880d681SAndroid Build Coastguard Workerentry: 78*9880d681SAndroid Build Coastguard Worker %alloca = alloca [64 x i32], align 4 79*9880d681SAndroid Build Coastguard Worker %arrayidx0 = getelementptr inbounds [64 x i32], [64 x i32]* %alloca, i32 0, i32 %a 80*9880d681SAndroid Build Coastguard Worker br label %exit 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Workerexit: 83*9880d681SAndroid Build Coastguard Worker %phi.ptr = phi i32* [ %arrayidx0, %entry ] 84*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %phi.ptr, align 4 85*9880d681SAndroid Build Coastguard Worker ret void 86*9880d681SAndroid Build Coastguard Worker} 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @branch_ptr_alloca_unknown_obj( 89*9880d681SAndroid Build Coastguard Worker; CHECK: %alloca = alloca [64 x i32], align 4 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Worker; CHECK: if: 92*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx0 = getelementptr inbounds [64 x i32], [64 x i32]* %alloca, i32 0, i32 %a 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker; CHECK: else: 95*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx1 = call i32* @get_unknown_pointer() 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Worker; CHECK: endif: 98*9880d681SAndroid Build Coastguard Worker; CHECK: %phi.ptr = phi i32* [ %arrayidx0, %if ], [ %arrayidx1, %else ] 99*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 0, i32* %phi.ptr, align 4 100*9880d681SAndroid Build Coastguard Workerdefine void @branch_ptr_alloca_unknown_obj(i32 %a, i32 %b) #0 { 101*9880d681SAndroid Build Coastguard Workerentry: 102*9880d681SAndroid Build Coastguard Worker %alloca = alloca [64 x i32], align 4 103*9880d681SAndroid Build Coastguard Worker br i1 undef, label %if, label %else 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Workerif: 106*9880d681SAndroid Build Coastguard Worker %arrayidx0 = getelementptr inbounds [64 x i32], [64 x i32]* %alloca, i32 0, i32 %a 107*9880d681SAndroid Build Coastguard Worker br label %endif 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Workerelse: 110*9880d681SAndroid Build Coastguard Worker %arrayidx1 = call i32* @get_unknown_pointer() 111*9880d681SAndroid Build Coastguard Worker br label %endif 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Workerendif: 114*9880d681SAndroid Build Coastguard Worker %phi.ptr = phi i32* [ %arrayidx0, %if ], [ %arrayidx1, %else ] 115*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %phi.ptr, align 4 116*9880d681SAndroid Build Coastguard Worker ret void 117*9880d681SAndroid Build Coastguard Worker} 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Worker; kernel void ptr_induction_var_same_alloca(void) 120*9880d681SAndroid Build Coastguard Worker; { 121*9880d681SAndroid Build Coastguard Worker; int alloca[64]; 122*9880d681SAndroid Build Coastguard Worker; int i = 0; 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Worker; #pragma nounroll 125*9880d681SAndroid Build Coastguard Worker; for (int* p = &alloca[2], *e = &alloca[48]; p != e; ++p, ++i) 126*9880d681SAndroid Build Coastguard Worker; { 127*9880d681SAndroid Build Coastguard Worker; *p = i; 128*9880d681SAndroid Build Coastguard Worker; } 129*9880d681SAndroid Build Coastguard Worker; } 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Worker; FIXME: This should be promotable. We need to use 132*9880d681SAndroid Build Coastguard Worker; GetUnderlyingObjects when looking at the icmp user. 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @ptr_induction_var_same_alloca( 135*9880d681SAndroid Build Coastguard Worker; CHECK: %alloca = alloca [64 x i32], align 4 136*9880d681SAndroid Build Coastguard Worker; CHECK: phi i32* [ %arrayidx, %entry ], [ %incdec.ptr, %for.body ] 137*9880d681SAndroid Build Coastguard Workerdefine void @ptr_induction_var_same_alloca() #0 { 138*9880d681SAndroid Build Coastguard Workerentry: 139*9880d681SAndroid Build Coastguard Worker %alloca = alloca [64 x i32], align 4 140*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds [64 x i32], [64 x i32]* %alloca, i32 0, i32 2 141*9880d681SAndroid Build Coastguard Worker %arrayidx1 = getelementptr inbounds [64 x i32], [64 x i32]* %alloca, i32 0, i32 48 142*9880d681SAndroid Build Coastguard Worker br label %for.body 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup: ; preds = %for.body 145*9880d681SAndroid Build Coastguard Worker ret void 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %for.body, %entry 148*9880d681SAndroid Build Coastguard Worker %i.09 = phi i32 [ 0, %entry ], [ %inc, %for.body ] 149*9880d681SAndroid Build Coastguard Worker %p.08 = phi i32* [ %arrayidx, %entry ], [ %incdec.ptr, %for.body ] 150*9880d681SAndroid Build Coastguard Worker store i32 %i.09, i32* %p.08, align 4 151*9880d681SAndroid Build Coastguard Worker %incdec.ptr = getelementptr inbounds i32, i32* %p.08, i32 1 152*9880d681SAndroid Build Coastguard Worker %inc = add nuw nsw i32 %i.09, 1 153*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32* %incdec.ptr, %arrayidx1 154*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.cond.cleanup, label %for.body 155*9880d681SAndroid Build Coastguard Worker} 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Worker; extern int* get_unknown_pointer(void); 159*9880d681SAndroid Build Coastguard Worker 160*9880d681SAndroid Build Coastguard Worker; kernel void ptr_induction_var_alloca_unknown(void) 161*9880d681SAndroid Build Coastguard Worker; { 162*9880d681SAndroid Build Coastguard Worker; int alloca[64]; 163*9880d681SAndroid Build Coastguard Worker; int i = 0; 164*9880d681SAndroid Build Coastguard Worker; 165*9880d681SAndroid Build Coastguard Worker; for (int* p = &alloca[2], *e = get_unknown_pointer(); p != e; ++p, ++i) 166*9880d681SAndroid Build Coastguard Worker; { 167*9880d681SAndroid Build Coastguard Worker; *p = i; 168*9880d681SAndroid Build Coastguard Worker; } 169*9880d681SAndroid Build Coastguard Worker; } 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @ptr_induction_var_alloca_unknown( 172*9880d681SAndroid Build Coastguard Worker; CHECK: %alloca = alloca [64 x i32], align 4 173*9880d681SAndroid Build Coastguard Worker; CHECK: %p.08 = phi i32* [ %incdec.ptr, %for.body ], [ %arrayidx, %for.body.preheader ] 174*9880d681SAndroid Build Coastguard Worker; CHECK: %cmp = icmp eq i32* %incdec.ptr, %call 175*9880d681SAndroid Build Coastguard Workerdefine void @ptr_induction_var_alloca_unknown() #0 { 176*9880d681SAndroid Build Coastguard Workerentry: 177*9880d681SAndroid Build Coastguard Worker %alloca = alloca [64 x i32], align 4 178*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds [64 x i32], [64 x i32]* %alloca, i32 0, i32 2 179*9880d681SAndroid Build Coastguard Worker %call = tail call i32* @get_unknown_pointer() #2 180*9880d681SAndroid Build Coastguard Worker %cmp.7 = icmp eq i32* %arrayidx, %call 181*9880d681SAndroid Build Coastguard Worker br i1 %cmp.7, label %for.cond.cleanup, label %for.body.preheader 182*9880d681SAndroid Build Coastguard Worker 183*9880d681SAndroid Build Coastguard Workerfor.body.preheader: ; preds = %entry 184*9880d681SAndroid Build Coastguard Worker br label %for.body 185*9880d681SAndroid Build Coastguard Worker 186*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup.loopexit: ; preds = %for.body 187*9880d681SAndroid Build Coastguard Worker br label %for.cond.cleanup 188*9880d681SAndroid Build Coastguard Worker 189*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry 190*9880d681SAndroid Build Coastguard Worker ret void 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %for.body, %for.body.preheader 193*9880d681SAndroid Build Coastguard Worker %i.09 = phi i32 [ %inc, %for.body ], [ 0, %for.body.preheader ] 194*9880d681SAndroid Build Coastguard Worker %p.08 = phi i32* [ %incdec.ptr, %for.body ], [ %arrayidx, %for.body.preheader ] 195*9880d681SAndroid Build Coastguard Worker store i32 %i.09, i32* %p.08, align 4 196*9880d681SAndroid Build Coastguard Worker %incdec.ptr = getelementptr inbounds i32, i32* %p.08, i32 1 197*9880d681SAndroid Build Coastguard Worker %inc = add nuw nsw i32 %i.09, 1 198*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32* %incdec.ptr, %call 199*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.cond.cleanup.loopexit, label %for.body 200*9880d681SAndroid Build Coastguard Worker} 201*9880d681SAndroid Build Coastguard Worker 202*9880d681SAndroid Build Coastguard Workerdeclare i32* @get_unknown_pointer() #0 203*9880d681SAndroid Build Coastguard Worker 204*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind "amdgpu-max-waves-per-eu"="1" } 205