[llvm] 4d06623 - recalculate the live interval of the defined register of xvmaddmdp in the VSX FMA mutation pass. (#116071)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Dec 10 08:21:19 PST 2024
Author: zhijian lin
Date: 2024-12-10T11:21:15-05:00
New Revision: 4d06623b28ab373cd5438fda6c79cf62fc53ace0
URL: https://github.com/llvm/llvm-project/commit/4d06623b28ab373cd5438fda6c79cf62fc53ace0
DIFF: https://github.com/llvm/llvm-project/commit/4d06623b28ab373cd5438fda6c79cf62fc53ace0.diff
LOG: recalculate the live interval of the defined register of xvmaddmdp in the VSX FMA mutation pass. (#116071)
The patch fix https://github.com/llvm/llvm-project/issues/116061
The root cause of the assertion is that the FMA mutation pass does not
update the subranges of the live interval for the defined register of
the modified instruction .
it recalculate the live interval of the defined register of xvmaddmdp in
the VSX FMA mutation pass.
Added:
llvm/test/CodeGen/PowerPC/pr116071.ll
Modified:
llvm/lib/Target/PowerPC/PPCVSXFMAMutate.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/PowerPC/PPCVSXFMAMutate.cpp b/llvm/lib/Target/PowerPC/PPCVSXFMAMutate.cpp
index 174d78e6fc963e..f900996ef6397a 100644
--- a/llvm/lib/Target/PowerPC/PPCVSXFMAMutate.cpp
+++ b/llvm/lib/Target/PowerPC/PPCVSXFMAMutate.cpp
@@ -288,21 +288,11 @@ namespace {
UseMO.substVirtReg(KilledProdReg, KilledProdSubReg, *TRI);
}
- // Extend the live intervals of the killed product operand to hold the
- // fma result.
+ // Recalculate the live intervals of the killed product operand.
+ LIS->removeInterval(KilledProdReg);
+ LiveInterval &NewFMAInt =
+ LIS->createAndComputeVirtRegInterval(KilledProdReg);
- LiveInterval &NewFMAInt = LIS->getInterval(KilledProdReg);
- for (auto &AI : FMAInt) {
- // Don't add the segment that corresponds to the original copy.
- if (AI.valno == AddendValNo)
- continue;
-
- VNInfo *NewFMAValNo =
- NewFMAInt.getNextValue(AI.start, LIS->getVNInfoAllocator());
-
- NewFMAInt.addSegment(
- LiveInterval::Segment(AI.start, AI.end, NewFMAValNo));
- }
LLVM_DEBUG(dbgs() << " extended: " << NewFMAInt << '\n');
// Extend the live interval of the addend source (it might end at the
diff --git a/llvm/test/CodeGen/PowerPC/pr116071.ll b/llvm/test/CodeGen/PowerPC/pr116071.ll
new file mode 100644
index 00000000000000..29f11fc1d3a630
--- /dev/null
+++ b/llvm/test/CodeGen/PowerPC/pr116071.ll
@@ -0,0 +1,26 @@
+; RUN: llc -disable-ppc-vsx-fma-mutation=false -mcpu=pwr10 -verify-machineinstrs \
+; RUN: -ppc-asm-full-reg-names -mtriple powerpc64-ibm-aix7.2.0.0 < %s | FileCheck %s
+
+target datalayout = "E-m:a-Fi64-i64:64-n32:64-S128-v256:256:256-v512:512:512"
+
+define void @initial(<2 x double> %0){
+entry:
+ %1 = fmul <2 x double> %0, zeroinitializer
+ br label %for.cond251.preheader.lr.ph
+
+for.cond251.preheader.lr.ph: ; preds = %for.cond251.preheader.lr.ph, %entry
+ %2 = phi double [ %3, %for.cond251.preheader.lr.ph ], [ 0.000000e+00, %entry ]
+ %3 = phi double [ %7, %for.cond251.preheader.lr.ph ], [ 0.000000e+00, %entry ]
+ %add737 = fadd double %3, %2
+ %4 = insertelement <2 x double> zeroinitializer, double %add737, i64 0
+ %5 = fmul contract <2 x double> %4, zeroinitializer
+ %6 = fadd contract <2 x double> %1, %5
+ %7 = extractelement <2 x double> %6, i64 0
+ br label %for.cond251.preheader.lr.ph
+}
+
+; CHECK: xsadddp f4, f3, f4
+; CHECK-NEXT: xxmrghd vs5, vs4, vs2
+; CHECK-NEXT: fmr f4, f3
+; CHECK-NEXT: xvmaddmdp vs5, vs0, vs1
+; CHECK-NEXT: fmr f3, f5
More information about the llvm-commits
mailing list