-
Notifications
You must be signed in to change notification settings - Fork 13.7k
[DirectX] initialize registers properties by calling addRegisterClass and computeRegisterProperties #128818
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
… and computeRegisterProperties This fixes llvm#126784 for the DirectX backend. This bug was marked critical for DX so it is going to go in first. At least one register class needs to be added via addRegisterClass for RegClassForVT to be valid. Further for costing information used by loop unroll and other optimizations to be valid we need to call computeRegisterProperties. This change does both of these. The test cases confirm that we can fetch costing information off of `getRegisterInfo` and that `DirectXTargetLowering` maps i32 typed registers to DXILClassRegClass.
@llvm/pr-subscribers-backend-directx Author: Farzon Lotfi (farzonl) ChangesThis fixes #126784 for the DirectX backend. The test cases confirm that we can fetch costing information off of Full diff: https://github.com/llvm/llvm-project/pull/128818.diff 3 Files Affected:
diff --git a/llvm/lib/Target/DirectX/DirectXTargetMachine.cpp b/llvm/lib/Target/DirectX/DirectXTargetMachine.cpp
index a76c07f784177..dda650b0f6e15 100644
--- a/llvm/lib/Target/DirectX/DirectXTargetMachine.cpp
+++ b/llvm/lib/Target/DirectX/DirectXTargetMachine.cpp
@@ -187,4 +187,7 @@ DirectXTargetMachine::getTargetTransformInfo(const Function &F) const {
DirectXTargetLowering::DirectXTargetLowering(const DirectXTargetMachine &TM,
const DirectXSubtarget &STI)
- : TargetLowering(TM) {}
+ : TargetLowering(TM) {
+ addRegisterClass(MVT::i32, &dxil::DXILClassRegClass);
+ computeRegisterProperties(STI.getRegisterInfo());
+}
diff --git a/llvm/unittests/Target/DirectX/CMakeLists.txt b/llvm/unittests/Target/DirectX/CMakeLists.txt
index fd0d5a0dd52c1..5087727ff9800 100644
--- a/llvm/unittests/Target/DirectX/CMakeLists.txt
+++ b/llvm/unittests/Target/DirectX/CMakeLists.txt
@@ -16,4 +16,5 @@ add_llvm_target_unittest(DirectXTests
CBufferDataLayoutTests.cpp
PointerTypeAnalysisTests.cpp
UniqueResourceFromUseTests.cpp
+ RegisterCostTests.cpp
)
diff --git a/llvm/unittests/Target/DirectX/RegisterCostTests.cpp b/llvm/unittests/Target/DirectX/RegisterCostTests.cpp
new file mode 100644
index 0000000000000..ebf740ed73e98
--- /dev/null
+++ b/llvm/unittests/Target/DirectX/RegisterCostTests.cpp
@@ -0,0 +1,65 @@
+//===- llvm/unittests/Target/DirectX/RegisterCostTests.cpp ----------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "DirectXInstrInfo.h"
+#include "DirectXTargetLowering.h"
+#include "DirectXTargetMachine.h"
+#include "TargetInfo/DirectXTargetInfo.h"
+#include "llvm/IR/DerivedTypes.h"
+#include "llvm/IR/Function.h"
+#include "llvm/MC/MCTargetOptions.h"
+#include "llvm/MC/TargetRegistry.h"
+#include "llvm/Support/TargetSelect.h"
+
+#include "gtest/gtest.h"
+
+using namespace llvm;
+using namespace llvm::dxil;
+
+namespace {
+class RegisterCostTests : public testing::Test {
+protected:
+ DirectXInstrInfo DXInstInfo;
+ DirectXRegisterInfo RI;
+ DirectXTargetLowering *DL;
+
+ virtual void SetUp() {
+ LLVMInitializeDirectXTargetMC();
+ Target T = getTheDirectXTarget();
+ RegisterTargetMachine<DirectXTargetMachine> X(T);
+ Triple TT("dxil-pc-shadermodel6.3-library");
+ StringRef CPU = "";
+ StringRef FS = "";
+ DirectXTargetMachine TM(T, TT, CPU, FS, TargetOptions(), Reloc::Static,
+ CodeModel::Small, CodeGenOptLevel::Default, false);
+ LLVMContext Context;
+ Function *F =
+ Function::Create(FunctionType::get(Type::getVoidTy(Context), false),
+ Function::ExternalLinkage, 0);
+ DL = new DirectXTargetLowering(TM, *TM.getSubtargetImpl(*F));
+ delete F;
+ }
+ virtual void TearDown() { delete DL; }
+};
+
+TEST_F(RegisterCostTests, TestRepRegClassForVTSet) {
+ const TargetRegisterClass *RC = DL->getRepRegClassFor(MVT::i32);
+ EXPECT_EQ(&dxil::DXILClassRegClass, RC);
+}
+
+TEST_F(RegisterCostTests, TestTrivialCopyCostGetter) {
+
+ const TargetRegisterClass *RC = DXInstInfo.getRegisterInfo().getRegClass(0);
+ unsigned Cost = RC->getCopyCost();
+ EXPECT_EQ(1u, Cost);
+
+ RC = RI.getRegClass(0);
+ Cost = RC->getCopyCost();
+ EXPECT_EQ(1u, Cost);
+}
+} // namespace
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
|
||
TEST_F(RegisterCostTests, TestTrivialCopyCostGetter) { | ||
|
||
const TargetRegisterClass *RC = DXInstInfo.getRegisterInfo().getRegClass(0); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
DirectXTargetLowering
does not expose DirectXRegisterInfo
so just testing it seperately to confirm we can fetch costing data off of it.
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/146/builds/2371 Here is the relevant piece of the build log for the reference
|
… and computeRegisterProperties (llvm#128818) This fixes llvm#126784 for the DirectX backend. This bug was marked critical for DX so it is going to go in first. At least one register class needs to be added via `addRegisterClass` for `RegClassForVT` to be valid. Further for costing information used by loop unroll and other optimizations to be valid we need to call `computeRegisterProperties`. This change does both of these. The test cases confirm that we can fetch costing information off of `getRegisterInfo` and that `DirectXTargetLowering` maps `i32` typed registers to `DXILClassRegClass`.
This fixes #126784 for the DirectX backend.
This bug was marked critical for DX so it is going to go in first. At least one register class needs to be added via
addRegisterClass
forRegClassForVT
to be valid.Further for costing information used by loop unroll and other optimizations to be valid we need to call
computeRegisterProperties
. This change does both of these.The test cases confirm that we can fetch costing information off of
getRegisterInfo
and thatDirectXTargetLowering
mapsi32
typed registers toDXILClassRegClass
.