[llvm] [AMDGPU][CodeGen] Fix `EXPENSIVE_CHECKS` for multi-def rematerialization (PR #214484)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 6 06:02:47 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-amdgpu
Author: Lucas Ramirez (lucas-rami)
<details>
<summary>Changes</summary>
After #<!-- -->197580 registers may have multiple definitions. The `EXPENSIVE_CHECK` was not updated to reflect that.
---
Full diff: https://github.com/llvm/llvm-project/pull/214484.diff
1 Files Affected:
- (modified) llvm/lib/Target/AMDGPU/GCNSchedStrategy.cpp (+26-21)
``````````diff
diff --git a/llvm/lib/Target/AMDGPU/GCNSchedStrategy.cpp b/llvm/lib/Target/AMDGPU/GCNSchedStrategy.cpp
index 884bf32e064d1..2701a71b77b87 100644
--- a/llvm/lib/Target/AMDGPU/GCNSchedStrategy.cpp
+++ b/llvm/lib/Target/AMDGPU/GCNSchedStrategy.cpp
@@ -1643,29 +1643,34 @@ bool PreRARematStage::initGCNSchedStage() {
#ifdef EXPENSIVE_CHECKS
// All uses are known to be available / live at the remat point. Thus,
// the uses should already be live in to the using region.
- for (MachineOperand &MO : Reg.DefMI->operands()) {
- if (!MO.isReg() || !MO.getReg() || !MO.readsReg())
- continue;
+ for (const MachineInstr *DefMI : Reg.Defs) {
+ for (const MachineOperand &MO : DefMI->operands()) {
+ // Exclude the defined register. We are rematerializing all
+ // instructions defining it so we don't care that its value is
+ // available at the remat point.
+ if (!MO.isReg() || !MO.getReg() || !MO.readsReg() || MO.isDef())
+ continue;
- Register UseReg = MO.getReg();
- if (!UseReg.isVirtual())
- continue;
+ Register UseReg = MO.getReg();
+ if (!UseReg.isVirtual())
+ continue;
- LiveInterval &LI = DAG.LIS->getInterval(UseReg);
- LaneBitmask LM = DAG.MRI.getMaxLaneMaskForVReg(MO.getReg());
- if (LI.hasSubRanges() && MO.getSubReg())
- LM = DAG.TRI->getSubRegIndexLaneMask(MO.getSubReg());
-
- const unsigned UseRegion = Reg.Uses.begin()->first;
- LaneBitmask LiveInMask = DAG.LiveIns[UseRegion].at(UseReg);
- LaneBitmask UncoveredLanes = LM & ~(LiveInMask & LM);
- // If this register has lanes not covered by the LiveIns, be sure they
- // do not map to any subrange. ref:
- // machine-scheduler-sink-trivial-remats.mir::omitted_subrange
- if (UncoveredLanes.any()) {
- assert(LI.hasSubRanges());
- for (LiveInterval::SubRange &SR : LI.subranges())
- assert((SR.LaneMask & UncoveredLanes).none());
+ LiveInterval &LI = DAG.LIS->getInterval(UseReg);
+ LaneBitmask LM = DAG.MRI.getMaxLaneMaskForVReg(MO.getReg());
+ if (LI.hasSubRanges() && MO.getSubReg())
+ LM = DAG.TRI->getSubRegIndexLaneMask(MO.getSubReg());
+
+ const unsigned UseRegion = Reg.Uses.begin()->first;
+ LaneBitmask LiveInMask = DAG.LiveIns[UseRegion].at(UseReg);
+ LaneBitmask UncoveredLanes = LM & ~(LiveInMask & LM);
+ // If this register has lanes not covered by the LiveIns, be sure they
+ // do not map to any subrange. ref:
+ // machine-scheduler-sink-trivial-remats.mir::omitted_subrange
+ if (UncoveredLanes.any()) {
+ assert(LI.hasSubRanges());
+ for (LiveInterval::SubRange &SR : LI.subranges())
+ assert((SR.LaneMask & UncoveredLanes).none());
+ }
}
}
#endif
``````````
</details>
https://github.com/llvm/llvm-project/pull/214484
More information about the llvm-commits
mailing list