We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
There was an error while loading. Please reload this page.
1 parent c3b719e commit 278fa03Copy full SHA for 278fa03
llvm/lib/Target/AMDGPU/AMDGPURegBankLegalizeHelper.cpp
@@ -500,6 +500,20 @@ void RegBankLegalizeHelper::lowerUnpackMinMax(MachineInstr &MI) {
500
MI.eraseFromParent();
501
}
502
503
+void RegBankLegalizeHelper::lowerScalarizeV2S16(MachineInstr &MI) {
504
+ // Unpack the V2S16 operands into two S16 scalars each
505
+ auto Op1 = B.buildUnmerge({SgprRB, S16}, MI.getOperand(1).getReg());
506
+ auto Op2 = B.buildUnmerge({SgprRB, S16}, MI.getOperand(2).getReg());
507
+
508
+ // Perform scalar additions on S16 values
509
+ Register Lo = B.buildInstr(MI.getOpcode(), {SgprRB_S16}, {Op1.getReg(0), Op2.getReg(0)}).getReg(0);
510
+ Register Hi = B.buildInstr(MI.getOpcode(), {SgprRB_S16}, {Op1.getReg(1), Op2.getReg(1)}).getReg(0);
511
512
+ // Pack the results back into V2S16
513
+ B.buildBuildVectorTrunc(MI.getOperand(0).getReg(), {Lo, Hi});
514
+ MI.eraseFromParent();
515
+}
516
517
static bool isSignedBFE(MachineInstr &MI) {
518
if (GIntrinsic *GI = dyn_cast<GIntrinsic>(&MI))
519
return (GI->is(Intrinsic::amdgcn_sbfe));
@@ -804,6 +818,8 @@ void RegBankLegalizeHelper::lower(MachineInstr &MI,
804
818
805
819
break;
806
820
821
+ case ScalarizeV2S16:
822
+ return lowerScalarizeV2S16(MI);
807
823
case WidenMMOToS32:
808
824
return widenMMOToS32(cast<GAnyLoad>(MI));
809
825
llvm/lib/Target/AMDGPU/AMDGPURegBankLegalizeHelper.h
@@ -74,6 +74,7 @@ class RegBankLegalizeHelper {
74
MachineRegisterInfo::VRegAttrs SgprRB_S32 = {SgprRB, S32};
75
MachineRegisterInfo::VRegAttrs VgprRB_S32 = {VgprRB, S32};
76
MachineRegisterInfo::VRegAttrs VccRB_S1 = {VccRB, S1};
77
+ MachineRegisterInfo::VRegAttrs SgprRB_S16 = {SgprRB, S16};
78
79
public:
80
RegBankLegalizeHelper(MachineIRBuilder &B, const MachineUniformityInfo &MUI,
@@ -124,6 +125,7 @@ class RegBankLegalizeHelper {
124
125
void lowerSplitTo32Select(MachineInstr &MI);
126
void lowerSplitTo32SExtInReg(MachineInstr &MI);
127
void lowerUnpackMinMax(MachineInstr &MI);
128
+ void lowerScalarizeV2S16(MachineInstr &MI);
129
};
130
131
} // end namespace AMDGPU
llvm/lib/Target/AMDGPU/AMDGPURegBankLegalizeRules.cpp
@@ -471,13 +471,11 @@ RegBankLegalizeRules::RegBankLegalizeRules(const GCNSubtarget &_ST,
471
.Div(S16, {{Vgpr16}, {Vgpr16, Vgpr16}})
472
.Uni(S32, {{Sgpr32}, {Sgpr32, Sgpr32}})
473
.Div(S32, {{Vgpr32}, {Vgpr32, Vgpr32}})
474
- /// TODO: SALU does not support packed math addition. Scalarize into two S16 additions.
475
- .Uni(V2S16, {{SgprV2S16}, {Sgpr32AExt, Sgpr32AExt}})
+ .Uni(V2S16, {{SgprV2S16}, {SgprV2S16, SgprV2S16}, ScalarizeV2S16})
476
.Div(V2S16, {{VgprV2S16}, {VgprV2S16, VgprV2S16}})
477
.Uni(S64, {{Sgpr64}, {Sgpr64, Sgpr64}})
478
.Div(S64, {{Vgpr64}, {Vgpr64, Vgpr64}});
479
480
- /// TODO: Correct these rules, related to overflow detection.
481
addRulesForGOpcs({G_UADDO, G_USUBO}, Standard)
482
.Uni(S32, {{Sgpr32, Sgpr32Trunc}, {Sgpr32, Sgpr32}})
483
.Div(S32, {{Vgpr32, Vcc}, {Vgpr32, Vgpr32}});
llvm/lib/Target/AMDGPU/AMDGPURegBankLegalizeRules.h
@@ -223,7 +223,8 @@ enum LoweringMethodID {
223
UniCstExt,
224
SplitLoad,
225
WidenLoad,
226
- WidenMMOToS32
+ WidenMMOToS32,
227
+ ScalarizeV2S16
228
229
230
enum FastRulesTypes {
llvm/test/CodeGen/AMDGPU/GlobalISel/add.ll
@@ -196,7 +196,9 @@ define i32 @v_add_i32(i32 %a, i32 %b) {
196
ret i32 %c
197
198
199
-; TODO: Add test for s_add_v2i16
+; TODO: Add test for s_add_v2i16. Instruction selector currently fails
200
+; to handle G_UNMERGE_VALUES. Same in GlobalISel/sub.ll.
201
202
define <2 x i16> @v_add_v2i16(<2 x i16> %a, <2 x i16> %b) {
203
; GFX7-LABEL: v_add_v2i16:
204
; GFX7: ; %bb.0:
llvm/test/CodeGen/AMDGPU/GlobalISel/regbankselect-add.v2s16.mir
@@ -14,8 +14,12 @@ body: |
14
; CHECK-NEXT: {{ $}}
15
; CHECK-NEXT: [[COPY:%[0-9]+]]:sgpr(<2 x s16>) = COPY $sgpr0
16
; CHECK-NEXT: [[COPY1:%[0-9]+]]:sgpr(<2 x s16>) = COPY $sgpr1
17
- ; CHECK-NEXT: [[ADD:%[0-9]+]]:sgpr(<2 x s16>) = G_ADD [[COPY]], [[COPY1]]
18
- ; CHECK-NEXT: S_ENDPGM 0, implicit [[ADD]](<2 x s16>)
+ ; CHECK-NEXT: [[UV:%[0-9]+]]:sgpr(s16), [[UV1:%[0-9]+]]:sgpr(s16) = G_UNMERGE_VALUES [[COPY]](<2 x s16>)
+ ; CHECK-NEXT: [[UV2:%[0-9]+]]:sgpr(s16), [[UV3:%[0-9]+]]:sgpr(s16) = G_UNMERGE_VALUES [[COPY1]](<2 x s16>)
19
+ ; CHECK-NEXT: [[ADD:%[0-9]+]]:sgpr(s16) = G_ADD [[UV]], [[UV2]]
20
+ ; CHECK-NEXT: [[ADD1:%[0-9]+]]:sgpr(s16) = G_ADD [[UV1]], [[UV3]]
21
+ ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:sgpr(<2 x s16>) = G_BUILD_VECTOR [[ADD]](s16), [[ADD1]](s16)
22
+ ; CHECK-NEXT: S_ENDPGM 0, implicit [[BUILD_VECTOR]](<2 x s16>)
23
%0:_(<2 x s16>) = COPY $sgpr0
24
%1:_(<2 x s16>) = COPY $sgpr1
25
%2:_(<2 x s16>) = G_ADD %0, %1
llvm/test/CodeGen/AMDGPU/GlobalISel/regbankselect-sub.v2s16.mir
@@ -1,3 +1,4 @@
1
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6
2
# RUN: llc -mtriple=amdgcn -mcpu=gfx900 -run-pass=amdgpu-regbankselect,amdgpu-regbanklegalize %s -verify-machineinstrs -o - -regbankselect-fast | FileCheck %s
3
# RUN: llc -mtriple=amdgcn -mcpu=gfx900 -run-pass=amdgpu-regbankselect,amdgpu-regbanklegalize %s -verify-machineinstrs -o - -regbankselect-greedy | FileCheck %s
4
@@ -13,8 +14,12 @@ body: |
13
- ; CHECK-NEXT: [[SUB:%[0-9]+]]:sgpr(<2 x s16>) = G_SUB [[COPY]], [[COPY1]]
- ; CHECK-NEXT: S_ENDPGM 0, implicit [[SUB]](<2 x s16>)
+ ; CHECK-NEXT: [[SUB:%[0-9]+]]:sgpr(s16) = G_SUB [[UV]], [[UV2]]
+ ; CHECK-NEXT: [[SUB1:%[0-9]+]]:sgpr(s16) = G_SUB [[UV1]], [[UV3]]
+ ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:sgpr(<2 x s16>) = G_BUILD_VECTOR [[SUB]](s16), [[SUB1]](s16)
%2:_(<2 x s16>) = G_SUB %0, %1
llvm/test/CodeGen/AMDGPU/GlobalISel/sub.ll
@@ -196,7 +196,9 @@ define i32 @v_sub_i32(i32 %a, i32 %b) {
-; TODO: sub test for s_sub_v2i16
+; TODO: Add test for s_sub_v2i16. Instruction selector currently fails
+; to handle G_UNMERGE_VALUES.
define <2 x i16> @v_sub_v2i16(<2 x i16> %a, <2 x i16> %b) {
; GFX7-LABEL: v_sub_v2i16:
0 commit comments