Skip to content

Commit 2ad5fc1

Browse files
committed
AMDGPU/GlobalISel: Implement computeNumSignBitsForTargetInstr
1 parent 58f843a commit 2ad5fc1

File tree

5 files changed

+106
-0
lines changed

5 files changed

+106
-0
lines changed

llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4587,6 +4587,29 @@ unsigned AMDGPUTargetLowering::ComputeNumSignBitsForTargetNode(
45874587
}
45884588
}
45894589

4590+
unsigned AMDGPUTargetLowering::computeNumSignBitsForTargetInstr(
4591+
GISelKnownBits &Analysis, Register R,
4592+
const APInt &DemandedElts, const MachineRegisterInfo &MRI,
4593+
unsigned Depth) const {
4594+
const MachineInstr *MI = MRI.getVRegDef(R);
4595+
if (!MI)
4596+
return 1;
4597+
4598+
// TODO: Check range metadata on MMO.
4599+
switch (MI->getOpcode()) {
4600+
case AMDGPU::G_AMDGPU_BUFFER_LOAD_SBYTE:
4601+
return 25;
4602+
case AMDGPU::G_AMDGPU_BUFFER_LOAD_SSHORT:
4603+
return 17;
4604+
case AMDGPU::G_AMDGPU_BUFFER_LOAD_UBYTE:
4605+
return 24;
4606+
case AMDGPU::G_AMDGPU_BUFFER_LOAD_USHORT:
4607+
return 16;
4608+
default:
4609+
return 1;
4610+
}
4611+
}
4612+
45904613
bool AMDGPUTargetLowering::isKnownNeverNaNForTargetNode(SDValue Op,
45914614
const SelectionDAG &DAG,
45924615
bool SNaN,

llvm/lib/Target/AMDGPU/AMDGPUISelLowering.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,12 @@ class AMDGPUTargetLowering : public TargetLowering {
269269
const SelectionDAG &DAG,
270270
unsigned Depth = 0) const override;
271271

272+
unsigned computeNumSignBitsForTargetInstr(GISelKnownBits &Analysis,
273+
Register R,
274+
const APInt &DemandedElts,
275+
const MachineRegisterInfo &MRI,
276+
unsigned Depth = 0) const override;
277+
272278
bool isKnownNeverNaNForTargetNode(SDValue Op,
273279
const SelectionDAG &DAG,
274280
bool SNaN = false,

llvm/unittests/CodeGen/GlobalISel/GISelMITest.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,41 @@ body: |
6666
Twine(MIRFunc) + Twine("...\n"))
6767
.toNullTerminatedStringRef(S);
6868
}
69+
70+
std::unique_ptr<LLVMTargetMachine>
71+
AMDGPUGISelMITest::createTargetMachine() const {
72+
Triple TargetTriple("amdgcn-amd-amdhsa");
73+
std::string Error;
74+
const Target *T = TargetRegistry::lookupTarget("", TargetTriple, Error);
75+
if (!T)
76+
return nullptr;
77+
78+
TargetOptions Options;
79+
return std::unique_ptr<LLVMTargetMachine>(
80+
static_cast<LLVMTargetMachine *>(T->createTargetMachine(
81+
"amdgcn-amd-amdhsa", "gfx900", "", Options, None, None,
82+
CodeGenOpt::Aggressive)));
83+
}
84+
85+
void AMDGPUGISelMITest::getTargetTestModuleString(
86+
SmallString<512> &S, StringRef MIRFunc) const {
87+
(Twine(R"MIR(
88+
---
89+
...
90+
name: func
91+
tracksRegLiveness: true
92+
registers:
93+
- { id: 0, class: _ }
94+
- { id: 1, class: _ }
95+
- { id: 2, class: _ }
96+
- { id: 3, class: _ }
97+
body: |
98+
bb.1:
99+
liveins: $vgpr0, $vgpr1, $vgpr2
100+
101+
%0(s32) = COPY $vgpr0
102+
%1(s32) = COPY $vgpr1
103+
%2(s32) = COPY $vgpr2
104+
)MIR") + Twine(MIRFunc) + Twine("...\n"))
105+
.toNullTerminatedStringRef(S);
106+
}

llvm/unittests/CodeGen/GlobalISel/GISelMITest.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,12 @@ class AArch64GISelMITest : public GISelMITest {
146146
StringRef MIRFunc) const override;
147147
};
148148

149+
class AMDGPUGISelMITest : public GISelMITest {
150+
std::unique_ptr<LLVMTargetMachine> createTargetMachine() const override;
151+
void getTargetTestModuleString(SmallString<512> &S,
152+
StringRef MIRFunc) const override;
153+
};
154+
149155
#define DefineLegalizerInfo(Name, SettingUpActionsBlock) \
150156
class Name##Info : public LegalizerInfo { \
151157
public: \

llvm/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,3 +398,36 @@ TEST_F(AArch64GISelMITest, TestNumSignBitsTrunc) {
398398
EXPECT_EQ(8u, Info.computeNumSignBits(CopyTruncNeg1));
399399
EXPECT_EQ(5u, Info.computeNumSignBits(CopyTrunc7));
400400
}
401+
402+
TEST_F(AMDGPUGISelMITest, TestNumSignBitsTrunc) {
403+
StringRef MIRString =
404+
" %3:_(<4 x s32>) = G_IMPLICIT_DEF\n"
405+
" %4:_(s32) = G_IMPLICIT_DEF\n"
406+
" %5:_(s32) = G_AMDGPU_BUFFER_LOAD_UBYTE %3, %4, %4, %4, 0, 0, 0 :: (load 1)\n"
407+
" %6:_(s32) = COPY %5\n"
408+
409+
" %7:_(s32) = G_AMDGPU_BUFFER_LOAD_SBYTE %3, %4, %4, %4, 0, 0, 0 :: (load 1)\n"
410+
" %8:_(s32) = COPY %7\n"
411+
412+
" %9:_(s32) = G_AMDGPU_BUFFER_LOAD_USHORT %3, %4, %4, %4, 0, 0, 0 :: (load 2)\n"
413+
" %10:_(s32) = COPY %9\n"
414+
415+
" %11:_(s32) = G_AMDGPU_BUFFER_LOAD_SSHORT %3, %4, %4, %4, 0, 0, 0 :: (load 2)\n"
416+
" %12:_(s32) = COPY %11\n";
417+
418+
setUp(MIRString);
419+
if (!TM)
420+
return;
421+
422+
Register CopyLoadUByte = Copies[Copies.size() - 4];
423+
Register CopyLoadSByte = Copies[Copies.size() - 3];
424+
Register CopyLoadUShort = Copies[Copies.size() - 2];
425+
Register CopyLoadSShort = Copies[Copies.size() - 1];
426+
427+
GISelKnownBits Info(*MF);
428+
429+
EXPECT_EQ(24u, Info.computeNumSignBits(CopyLoadUByte));
430+
EXPECT_EQ(25u, Info.computeNumSignBits(CopyLoadSByte));
431+
EXPECT_EQ(16u, Info.computeNumSignBits(CopyLoadUShort));
432+
EXPECT_EQ(17u, Info.computeNumSignBits(CopyLoadSShort));
433+
}

0 commit comments

Comments
 (0)