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; This normally would be fixed by instcombine to be compare to the GEP 4*9880d681SAndroid Build Coastguard Worker; indices 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @lds_promoted_alloca_icmp_same_derived_pointer( 7*9880d681SAndroid Build Coastguard Worker; CHECK: [[ARRAYGEP:%[0-9]+]] = getelementptr inbounds [256 x [16 x i32]], [256 x [16 x i32]] addrspace(3)* @lds_promoted_alloca_icmp_same_derived_pointer.alloca, i32 0, i32 %{{[0-9]+}} 8*9880d681SAndroid Build Coastguard Worker; CHECK: %ptr0 = getelementptr inbounds [16 x i32], [16 x i32] addrspace(3)* [[ARRAYGEP]], i32 0, i32 %a 9*9880d681SAndroid Build Coastguard Worker; CHECK: %ptr1 = getelementptr inbounds [16 x i32], [16 x i32] addrspace(3)* [[ARRAYGEP]], i32 0, i32 %b 10*9880d681SAndroid Build Coastguard Worker; CHECK: %cmp = icmp eq i32 addrspace(3)* %ptr0, %ptr1 11*9880d681SAndroid Build Coastguard Workerdefine void @lds_promoted_alloca_icmp_same_derived_pointer(i32 addrspace(1)* %out, i32 %a, i32 %b) #0 { 12*9880d681SAndroid Build Coastguard Worker %alloca = alloca [16 x i32], align 4 13*9880d681SAndroid Build Coastguard Worker %ptr0 = getelementptr inbounds [16 x i32], [16 x i32]* %alloca, i32 0, i32 %a 14*9880d681SAndroid Build Coastguard Worker %ptr1 = getelementptr inbounds [16 x i32], [16 x i32]* %alloca, i32 0, i32 %b 15*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32* %ptr0, %ptr1 16*9880d681SAndroid Build Coastguard Worker %zext = zext i1 %cmp to i32 17*9880d681SAndroid Build Coastguard Worker store volatile i32 %zext, i32 addrspace(1)* %out 18*9880d681SAndroid Build Coastguard Worker ret void 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @lds_promoted_alloca_icmp_null_rhs( 22*9880d681SAndroid Build Coastguard Worker; CHECK: [[ARRAYGEP:%[0-9]+]] = getelementptr inbounds [256 x [16 x i32]], [256 x [16 x i32]] addrspace(3)* @lds_promoted_alloca_icmp_null_rhs.alloca, i32 0, i32 %{{[0-9]+}} 23*9880d681SAndroid Build Coastguard Worker; CHECK: %ptr0 = getelementptr inbounds [16 x i32], [16 x i32] addrspace(3)* [[ARRAYGEP]], i32 0, i32 %a 24*9880d681SAndroid Build Coastguard Worker; CHECK: %cmp = icmp eq i32 addrspace(3)* %ptr0, null 25*9880d681SAndroid Build Coastguard Workerdefine void @lds_promoted_alloca_icmp_null_rhs(i32 addrspace(1)* %out, i32 %a, i32 %b) #0 { 26*9880d681SAndroid Build Coastguard Worker %alloca = alloca [16 x i32], align 4 27*9880d681SAndroid Build Coastguard Worker %ptr0 = getelementptr inbounds [16 x i32], [16 x i32]* %alloca, i32 0, i32 %a 28*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32* %ptr0, null 29*9880d681SAndroid Build Coastguard Worker %zext = zext i1 %cmp to i32 30*9880d681SAndroid Build Coastguard Worker store volatile i32 %zext, i32 addrspace(1)* %out 31*9880d681SAndroid Build Coastguard Worker ret void 32*9880d681SAndroid Build Coastguard Worker} 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @lds_promoted_alloca_icmp_null_lhs( 35*9880d681SAndroid Build Coastguard Worker; CHECK: [[ARRAYGEP:%[0-9]+]] = getelementptr inbounds [256 x [16 x i32]], [256 x [16 x i32]] addrspace(3)* @lds_promoted_alloca_icmp_null_lhs.alloca, i32 0, i32 %{{[0-9]+}} 36*9880d681SAndroid Build Coastguard Worker; CHECK: %ptr0 = getelementptr inbounds [16 x i32], [16 x i32] addrspace(3)* [[ARRAYGEP]], i32 0, i32 %a 37*9880d681SAndroid Build Coastguard Worker; CHECK: %cmp = icmp eq i32 addrspace(3)* null, %ptr0 38*9880d681SAndroid Build Coastguard Workerdefine void @lds_promoted_alloca_icmp_null_lhs(i32 addrspace(1)* %out, i32 %a, i32 %b) #0 { 39*9880d681SAndroid Build Coastguard Worker %alloca = alloca [16 x i32], align 4 40*9880d681SAndroid Build Coastguard Worker %ptr0 = getelementptr inbounds [16 x i32], [16 x i32]* %alloca, i32 0, i32 %a 41*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32* null, %ptr0 42*9880d681SAndroid Build Coastguard Worker %zext = zext i1 %cmp to i32 43*9880d681SAndroid Build Coastguard Worker store volatile i32 %zext, i32 addrspace(1)* %out 44*9880d681SAndroid Build Coastguard Worker ret void 45*9880d681SAndroid Build Coastguard Worker} 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @lds_promoted_alloca_icmp_unknown_ptr( 48*9880d681SAndroid Build Coastguard Worker; CHECK: %alloca = alloca [16 x i32], align 4 49*9880d681SAndroid Build Coastguard Worker; CHECK: %ptr0 = getelementptr inbounds [16 x i32], [16 x i32]* %alloca, i32 0, i32 %a 50*9880d681SAndroid Build Coastguard Worker; CHECK: %ptr1 = call i32* @get_unknown_pointer() 51*9880d681SAndroid Build Coastguard Worker; CHECK: %cmp = icmp eq i32* %ptr0, %ptr1 52*9880d681SAndroid Build Coastguard Workerdefine void @lds_promoted_alloca_icmp_unknown_ptr(i32 addrspace(1)* %out, i32 %a, i32 %b) #0 { 53*9880d681SAndroid Build Coastguard Worker %alloca = alloca [16 x i32], align 4 54*9880d681SAndroid Build Coastguard Worker %ptr0 = getelementptr inbounds [16 x i32], [16 x i32]* %alloca, i32 0, i32 %a 55*9880d681SAndroid Build Coastguard Worker %ptr1 = call i32* @get_unknown_pointer() 56*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32* %ptr0, %ptr1 57*9880d681SAndroid Build Coastguard Worker %zext = zext i1 %cmp to i32 58*9880d681SAndroid Build Coastguard Worker store volatile i32 %zext, i32 addrspace(1)* %out 59*9880d681SAndroid Build Coastguard Worker ret void 60*9880d681SAndroid Build Coastguard Worker} 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Workerdeclare i32* @get_unknown_pointer() #0 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind "amdgpu-max-waves-per-eu"="1" } 65