207 lines · plain
1; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=infer-address-spaces %s | FileCheck %s2 3; Instcombine pulls the addrspacecast out of the select, make sure4; this doesn't do something insane on non-canonical IR.5 6; CHECK-LABEL: define ptr @return_select_group_flat(7; CHECK-SAME: i1 [[C:%.*]], ptr addrspace(3) [[GROUP_PTR_0:%.*]], ptr addrspace(3) [[GROUP_PTR_1:%.*]]) #[[ATTR0:[0-9]+]] {8; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[C]], ptr addrspace(3) [[GROUP_PTR_0]], ptr addrspace(3) [[GROUP_PTR_1]]9; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast ptr addrspace(3) [[SELECT]] to ptr10; CHECK-NEXT: ret ptr [[TMP1]]11define ptr @return_select_group_flat(i1 %c, ptr addrspace(3) %group.ptr.0, ptr addrspace(3) %group.ptr.1) #0 {12 %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr13 %cast1 = addrspacecast ptr addrspace(3) %group.ptr.1 to ptr14 %select = select i1 %c, ptr %cast0, ptr %cast115 ret ptr %select16}17 18; CHECK-LABEL: @store_select_group_flat(19; CHECK: %select = select i1 %c, ptr addrspace(3) %group.ptr.0, ptr addrspace(3) %group.ptr.120; CHECK: store i32 -1, ptr addrspace(3) %select21define amdgpu_kernel void @store_select_group_flat(i1 %c, ptr addrspace(3) %group.ptr.0, ptr addrspace(3) %group.ptr.1) #0 {22 %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr23 %cast1 = addrspacecast ptr addrspace(3) %group.ptr.1 to ptr24 %select = select i1 %c, ptr %cast0, ptr %cast125 store i32 -1, ptr %select26 ret void27}28 29; Make sure metadata is preserved30; CHECK-LABEL: @load_select_group_flat_md(31; CHECK: %select = select i1 %c, ptr addrspace(3) %group.ptr.0, ptr addrspace(3) %group.ptr.1, !prof !032; CHECK: %load = load i32, ptr addrspace(3) %select33define i32 @load_select_group_flat_md(i1 %c, ptr addrspace(3) %group.ptr.0, ptr addrspace(3) %group.ptr.1) #0 {34 %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr35 %cast1 = addrspacecast ptr addrspace(3) %group.ptr.1 to ptr36 %select = select i1 %c, ptr %cast0, ptr %cast1, !prof !037 %load = load i32, ptr %select38 ret i32 %load39}40 41; CHECK-LABEL: @store_select_mismatch_group_private_flat(42; CHECK: %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr43; CHECK: %cast1 = addrspacecast ptr addrspace(5) %private.ptr.1 to ptr44; CHECK: %select = select i1 %c, ptr %cast0, ptr %cast145; CHECK: store i32 -1, ptr %select46define amdgpu_kernel void @store_select_mismatch_group_private_flat(i1 %c, ptr addrspace(3) %group.ptr.0, ptr addrspace(5) %private.ptr.1) #0 {47 %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr48 %cast1 = addrspacecast ptr addrspace(5) %private.ptr.1 to ptr49 %select = select i1 %c, ptr %cast0, ptr %cast150 store i32 -1, ptr %select51 ret void52}53 54@lds0 = internal addrspace(3) global i32 123, align 455@lds1 = internal addrspace(3) global i32 456, align 456 57; CHECK-LABEL: @store_select_group_flat_null(58; CHECK: %select = select i1 %c, ptr addrspace(3) %group.ptr.0, ptr addrspace(3) addrspacecast (ptr null to ptr addrspace(3))59; CHECK: store i32 -1, ptr addrspace(3) %select60define amdgpu_kernel void @store_select_group_flat_null(i1 %c, ptr addrspace(3) %group.ptr.0) #0 {61 %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr62 %select = select i1 %c, ptr %cast0, ptr null63 store i32 -1, ptr %select64 ret void65}66 67; CHECK-LABEL: @store_select_group_flat_null_swap(68; CHECK: %select = select i1 %c, ptr addrspace(3) addrspacecast (ptr null to ptr addrspace(3)), ptr addrspace(3) %group.ptr.069; CHECK: store i32 -1, ptr addrspace(3) %select70define amdgpu_kernel void @store_select_group_flat_null_swap(i1 %c, ptr addrspace(3) %group.ptr.0) #0 {71 %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr72 %select = select i1 %c, ptr null, ptr %cast073 store i32 -1, ptr %select74 ret void75}76 77; CHECK-LABEL: @store_select_group_flat_poison(78; CHECK: %select = select i1 %c, ptr addrspace(3) %group.ptr.0, ptr addrspace(3) poison79; CHECK: store i32 -1, ptr addrspace(3) %select80define amdgpu_kernel void @store_select_group_flat_poison(i1 %c, ptr addrspace(3) %group.ptr.0) #0 {81 %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr82 %select = select i1 %c, ptr %cast0, ptr poison83 store i32 -1, ptr %select84 ret void85}86 87; CHECK-LABEL: @store_select_group_flat_poison_swap(88; CHECK: %select = select i1 %c, ptr addrspace(3) poison, ptr addrspace(3) %group.ptr.089; CHECK: store i32 -1, ptr addrspace(3) %select90define amdgpu_kernel void @store_select_group_flat_poison_swap(i1 %c, ptr addrspace(3) %group.ptr.0) #0 {91 %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr92 %select = select i1 %c, ptr poison, ptr %cast093 store i32 -1, ptr %select94 ret void95}96 97; CHECK-LABEL: @store_select_gep_group_flat_null(98; CHECK: %select = select i1 %c, ptr addrspace(3) %group.ptr.0, ptr addrspace(3) addrspacecast (ptr null to ptr addrspace(3))99; CHECK: %gep = getelementptr i32, ptr addrspace(3) %select, i64 16100; CHECK: store i32 -1, ptr addrspace(3) %gep101define amdgpu_kernel void @store_select_gep_group_flat_null(i1 %c, ptr addrspace(3) %group.ptr.0) #0 {102 %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr103 %select = select i1 %c, ptr %cast0, ptr null104 %gep = getelementptr i32, ptr %select, i64 16105 store i32 -1, ptr %gep106 ret void107}108 109@global0 = internal addrspace(1) global i32 123, align 4110 111; CHECK-LABEL: @store_select_group_flat_constexpr(112; CHECK: %select = select i1 %c, ptr addrspace(3) %group.ptr.0, ptr addrspace(3) @lds1113; CHECK: store i32 7, ptr addrspace(3) %select114define amdgpu_kernel void @store_select_group_flat_constexpr(i1 %c, ptr addrspace(3) %group.ptr.0) #0 {115 %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr116 %select = select i1 %c, ptr %cast0, ptr addrspacecast (ptr addrspace(3) @lds1 to ptr)117 store i32 7, ptr %select118 ret void119}120 121; CHECK-LABEL: @store_select_group_flat_inttoptr_flat(122; CHECK: %select = select i1 %c, ptr addrspace(3) %group.ptr.0, ptr addrspace(3) addrspacecast (ptr inttoptr (i64 12345 to ptr) to ptr addrspace(3))123; CHECK: store i32 7, ptr addrspace(3) %select124define amdgpu_kernel void @store_select_group_flat_inttoptr_flat(i1 %c, ptr addrspace(3) %group.ptr.0) #0 {125 %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr126 %select = select i1 %c, ptr %cast0, ptr inttoptr (i64 12345 to ptr)127 store i32 7, ptr %select128 ret void129}130 131; CHECK-LABEL: @store_select_group_flat_inttoptr_group(132; CHECK: %select = select i1 %c, ptr addrspace(3) %group.ptr.0, ptr addrspace(3) inttoptr (i32 400 to ptr addrspace(3))133; CHECK-NEXT: store i32 7, ptr addrspace(3) %select134define amdgpu_kernel void @store_select_group_flat_inttoptr_group(i1 %c, ptr addrspace(3) %group.ptr.0) #0 {135 %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr136 %select = select i1 %c, ptr %cast0, ptr addrspacecast (ptr addrspace(3) inttoptr (i32 400 to ptr addrspace(3)) to ptr)137 store i32 7, ptr %select138 ret void139}140 141; CHECK-LABEL: @store_select_group_global_mismatch_flat_constexpr(142; CHECK: %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr143; CHECK: %select = select i1 %c, ptr %cast0, ptr addrspacecast (ptr addrspace(1) @global0 to ptr)144; CHECK: store i32 7, ptr %select145define amdgpu_kernel void @store_select_group_global_mismatch_flat_constexpr(i1 %c, ptr addrspace(3) %group.ptr.0) #0 {146 %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr147 %select = select i1 %c, ptr %cast0, ptr addrspacecast (ptr addrspace(1) @global0 to ptr)148 store i32 7, ptr %select149 ret void150}151 152; CHECK-LABEL: @store_select_group_global_mismatch_flat_constexpr_swap(153; CHECK: %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr154; CHECK: %select = select i1 %c, ptr addrspacecast (ptr addrspace(1) @global0 to ptr), ptr %cast0155; CHECK: store i32 7, ptr %select156define amdgpu_kernel void @store_select_group_global_mismatch_flat_constexpr_swap(i1 %c, ptr addrspace(3) %group.ptr.0) #0 {157 %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr158 %select = select i1 %c, ptr addrspacecast (ptr addrspace(1) @global0 to ptr), ptr %cast0159 store i32 7, ptr %select160 ret void161}162 163; CHECK-LABEL: @store_select_group_global_mismatch_null_null(164; CHECK: %select = select i1 %c, ptr addrspacecast (ptr addrspace(3) null to ptr), ptr addrspacecast (ptr addrspace(1) null to ptr)165; CHECK: store i32 7, ptr %select166define amdgpu_kernel void @store_select_group_global_mismatch_null_null(i1 %c) #0 {167 %select = select i1 %c, ptr addrspacecast (ptr addrspace(3) null to ptr), ptr addrspacecast (ptr addrspace(1) null to ptr)168 store i32 7, ptr %select169 ret void170}171 172@lds2 = external addrspace(3) global [1024 x i32], align 4173 174; CHECK-LABEL: @store_select_group_constexpr_ptrtoint(175; CHECK: %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr176; CHECK: %select = select i1 %c, ptr %cast0, ptr addrspacecast (ptr addrspace(1) inttoptr (i32 add (i32 ptrtoint (ptr addrspace(3) @lds2 to i32), i32 124) to ptr addrspace(1)) to ptr)177; CHECK: store i32 7, ptr %select178define amdgpu_kernel void @store_select_group_constexpr_ptrtoint(i1 %c, ptr addrspace(3) %group.ptr.0) #0 {179 %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr180 %select = select i1 %c, ptr %cast0, ptr addrspacecast (ptr addrspace(1) inttoptr (i32 add (i32 ptrtoint (ptr addrspace(3) @lds2 to i32), i32 124) to ptr addrspace(1)) to ptr)181 store i32 7, ptr %select182 ret void183}184 185; CHECK-LABEL: @store_select_group_flat_vector(186; CHECK: %cast0 = addrspacecast <2 x ptr addrspace(3)> %group.ptr.0 to <2 x ptr>187; CHECK: %cast1 = addrspacecast <2 x ptr addrspace(3)> %group.ptr.1 to <2 x ptr>188; CHECK: %select = select i1 %c, <2 x ptr> %cast0, <2 x ptr> %cast1189; CHECK: %extract0 = extractelement <2 x ptr> %select, i32 0190; CHECK: %extract1 = extractelement <2 x ptr> %select, i32 1191; CHECK: store i32 -1, ptr %extract0192; CHECK: store i32 -2, ptr %extract1193define amdgpu_kernel void @store_select_group_flat_vector(i1 %c, <2 x ptr addrspace(3)> %group.ptr.0, <2 x ptr addrspace(3)> %group.ptr.1) #0 {194 %cast0 = addrspacecast <2 x ptr addrspace(3)> %group.ptr.0 to <2 x ptr>195 %cast1 = addrspacecast <2 x ptr addrspace(3)> %group.ptr.1 to <2 x ptr>196 %select = select i1 %c, <2 x ptr> %cast0, <2 x ptr> %cast1197 %extract0 = extractelement <2 x ptr> %select, i32 0198 %extract1 = extractelement <2 x ptr> %select, i32 1199 store i32 -1, ptr %extract0200 store i32 -2, ptr %extract1201 ret void202}203 204attributes #0 = { nounwind }205 206!0 = !{!"branch_weights", i32 2, i32 10}207