Index: lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp =================================================================== --- lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp +++ lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp @@ -283,9 +283,11 @@ // TODO: Pointer types, any 32-bit or 64-bit vector getActionDefinitionsBuilder(G_SELECT) - .legalFor({{S32, S1}, {S64, S1}, {V2S32, S1}, {V2S16, S1}}) + .legalForCartesianProduct({S32, S64, V2S32, V2S16, GlobalPtr, LocalPtr, + FlatPtr, PrivatePtr}, {S1}) .clampScalar(0, S32, S64) - .scalarize(0); + .scalarize(0) + .legalIf(all(isPointer(0), typeIs(1, S1))); // TODO: Only the low 4/5/6 bits of the shift amount are observed, so we can // be more flexible with the shift amount type. Index: test/CodeGen/AMDGPU/GlobalISel/legalize-select.mir =================================================================== --- test/CodeGen/AMDGPU/GlobalISel/legalize-select.mir +++ test/CodeGen/AMDGPU/GlobalISel/legalize-select.mir @@ -179,3 +179,171 @@ $vgpr0 = COPY %5 ... + +--- +name: test_select_p0 +body: | + bb.0: + liveins: $vgpr0, $vgpr1_vgpr2, $vgpr3_vgpr4 + ; CHECK-LABEL: name: test_select_p0 + ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0 + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $vgpr1_vgpr2 + ; CHECK: [[COPY2:%[0-9]+]]:_(p0) = COPY $vgpr3_vgpr4 + ; CHECK: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[C]](s32), [[COPY]] + ; CHECK: [[SELECT:%[0-9]+]]:_(p0) = G_SELECT [[ICMP]](s1), [[COPY1]], [[COPY2]] + ; CHECK: $vgpr0_vgpr1 = COPY [[SELECT]](p0) + %0:_(s32) = G_CONSTANT i32 0 + %1:_(s32) = COPY $vgpr0 + %2:_(p0) = COPY $vgpr1_vgpr2 + %3:_(p0) = COPY $vgpr3_vgpr4 + + %4:_(s1) = G_ICMP intpred(ne), %0, %1 + %5:_(p0) = G_SELECT %4, %2, %3 + $vgpr0_vgpr1 = COPY %5 + +... + +--- +name: test_select_p1 +body: | + bb.0: + liveins: $vgpr0, $vgpr1_vgpr2, $vgpr3_vgpr4 + ; CHECK-LABEL: name: test_select_p1 + ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0 + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:_(p1) = COPY $vgpr1_vgpr2 + ; CHECK: [[COPY2:%[0-9]+]]:_(p1) = COPY $vgpr3_vgpr4 + ; CHECK: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[C]](s32), [[COPY]] + ; CHECK: [[SELECT:%[0-9]+]]:_(p1) = G_SELECT [[ICMP]](s1), [[COPY1]], [[COPY2]] + ; CHECK: $vgpr0_vgpr1 = COPY [[SELECT]](p1) + %0:_(s32) = G_CONSTANT i32 0 + %1:_(s32) = COPY $vgpr0 + %2:_(p1) = COPY $vgpr1_vgpr2 + %3:_(p1) = COPY $vgpr3_vgpr4 + + %4:_(s1) = G_ICMP intpred(ne), %0, %1 + %5:_(p1) = G_SELECT %4, %2, %3 + $vgpr0_vgpr1 = COPY %5 + +... + +--- +name: test_select_p2 +body: | + bb.0: + liveins: $vgpr0, $vgpr1, $vgpr2 + ; CHECK-LABEL: name: test_select_p2 + ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0 + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:_(p2) = COPY $vgpr1 + ; CHECK: [[COPY2:%[0-9]+]]:_(p2) = COPY $vgpr2 + ; CHECK: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[C]](s32), [[COPY]] + ; CHECK: [[SELECT:%[0-9]+]]:_(p2) = G_SELECT [[ICMP]](s1), [[COPY1]], [[COPY2]] + ; CHECK: $vgpr0 = COPY [[SELECT]](p2) + %0:_(s32) = G_CONSTANT i32 0 + %1:_(s32) = COPY $vgpr0 + %2:_(p2) = COPY $vgpr1 + %3:_(p2) = COPY $vgpr2 + + %4:_(s1) = G_ICMP intpred(ne), %0, %1 + %5:_(p2) = G_SELECT %4, %2, %3 + $vgpr0 = COPY %5 + +... + +--- +name: test_select_p3 +body: | + bb.0: + liveins: $vgpr0, $vgpr1, $vgpr2 + ; CHECK-LABEL: name: test_select_p3 + ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0 + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:_(p3) = COPY $vgpr1 + ; CHECK: [[COPY2:%[0-9]+]]:_(p3) = COPY $vgpr2 + ; CHECK: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[C]](s32), [[COPY]] + ; CHECK: [[SELECT:%[0-9]+]]:_(p3) = G_SELECT [[ICMP]](s1), [[COPY1]], [[COPY2]] + ; CHECK: $vgpr0 = COPY [[SELECT]](p3) + %0:_(s32) = G_CONSTANT i32 0 + %1:_(s32) = COPY $vgpr0 + %2:_(p3) = COPY $vgpr1 + %3:_(p3) = COPY $vgpr2 + + %4:_(s1) = G_ICMP intpred(ne), %0, %1 + %5:_(p3) = G_SELECT %4, %2, %3 + $vgpr0 = COPY %5 + +... + +--- +name: test_select_p4 +body: | + bb.0: + liveins: $vgpr0, $vgpr1_vgpr2, $vgpr3_vgpr4 + ; CHECK-LABEL: name: test_select_p4 + ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0 + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:_(p4) = COPY $vgpr1_vgpr2 + ; CHECK: [[COPY2:%[0-9]+]]:_(p4) = COPY $vgpr3_vgpr4 + ; CHECK: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[C]](s32), [[COPY]] + ; CHECK: [[SELECT:%[0-9]+]]:_(p4) = G_SELECT [[ICMP]](s1), [[COPY1]], [[COPY2]] + ; CHECK: $vgpr0_vgpr1 = COPY [[SELECT]](p4) + %0:_(s32) = G_CONSTANT i32 0 + %1:_(s32) = COPY $vgpr0 + %2:_(p4) = COPY $vgpr1_vgpr2 + %3:_(p4) = COPY $vgpr3_vgpr4 + + %4:_(s1) = G_ICMP intpred(ne), %0, %1 + %5:_(p4) = G_SELECT %4, %2, %3 + $vgpr0_vgpr1 = COPY %5 + +... + +--- +name: test_select_p5 +body: | + bb.0: + liveins: $vgpr0, $vgpr1, $vgpr2 + ; CHECK-LABEL: name: test_select_p5 + ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0 + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:_(p5) = COPY $vgpr1 + ; CHECK: [[COPY2:%[0-9]+]]:_(p5) = COPY $vgpr2 + ; CHECK: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[C]](s32), [[COPY]] + ; CHECK: [[SELECT:%[0-9]+]]:_(p5) = G_SELECT [[ICMP]](s1), [[COPY1]], [[COPY2]] + ; CHECK: $vgpr0 = COPY [[SELECT]](p5) + %0:_(s32) = G_CONSTANT i32 0 + %1:_(s32) = COPY $vgpr0 + %2:_(p5) = COPY $vgpr1 + %3:_(p5) = COPY $vgpr2 + + %4:_(s1) = G_ICMP intpred(ne), %0, %1 + %5:_(p5) = G_SELECT %4, %2, %3 + $vgpr0 = COPY %5 + +... + +--- +name: test_select_p999 +body: | + bb.0: + liveins: $vgpr0, $vgpr1_vgpr2, $vgpr3_vgpr4 + ; CHECK-LABEL: name: test_select_p999 + ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0 + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:_(p999) = COPY $vgpr1_vgpr2 + ; CHECK: [[COPY2:%[0-9]+]]:_(p999) = COPY $vgpr3_vgpr4 + ; CHECK: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[C]](s32), [[COPY]] + ; CHECK: [[SELECT:%[0-9]+]]:_(p999) = G_SELECT [[ICMP]](s1), [[COPY1]], [[COPY2]] + ; CHECK: $vgpr0_vgpr1 = COPY [[SELECT]](p999) + %0:_(s32) = G_CONSTANT i32 0 + %1:_(s32) = COPY $vgpr0 + %2:_(p999) = COPY $vgpr1_vgpr2 + %3:_(p999) = COPY $vgpr3_vgpr4 + + %4:_(s1) = G_ICMP intpred(ne), %0, %1 + %5:_(p999) = G_SELECT %4, %2, %3 + $vgpr0_vgpr1 = COPY %5 + +...