[llvm] recalculate the live interval of the defined register of xvmaddmdp in the VSX FMA mutation pass. (PR #116071)

zhijian lin via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 13 08:01:33 PST 2024


https://github.com/diggerlin updated https://github.com/llvm/llvm-project/pull/116071

>From c1a8a3179b07854e58c45e5e6e0a42448c4e5347 Mon Sep 17 00:00:00 2001
From: zhijian <zhijian at ca.ibm.com>
Date: Wed, 13 Nov 2024 16:09:31 +0000
Subject: [PATCH 1/2] recalculate the live interval of the  defined register of
  xvmaddmdp in the VSX FMA mutation

---
 llvm/lib/Target/PowerPC/PPCVSXFMAMutate.cpp | 18 ++++----------
 llvm/test/CodeGen/PowerPC/issue116061.ll    | 26 +++++++++++++++++++++
 2 files changed, 30 insertions(+), 14 deletions(-)
 create mode 100644 llvm/test/CodeGen/PowerPC/issue116061.ll

diff --git a/llvm/lib/Target/PowerPC/PPCVSXFMAMutate.cpp b/llvm/lib/Target/PowerPC/PPCVSXFMAMutate.cpp
index 4b4e47e9532a87..c1f4069e7ac829 100644
--- a/llvm/lib/Target/PowerPC/PPCVSXFMAMutate.cpp
+++ b/llvm/lib/Target/PowerPC/PPCVSXFMAMutate.cpp
@@ -293,21 +293,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/issue116061.ll b/llvm/test/CodeGen/PowerPC/issue116061.ll
new file mode 100644
index 00000000000000..29f11fc1d3a630
--- /dev/null
+++ b/llvm/test/CodeGen/PowerPC/issue116061.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

>From 6f1428d97c4a7beacda8f0aa240d19ff821174af Mon Sep 17 00:00:00 2001
From: zhijian <zhijian at ca.ibm.com>
Date: Wed, 13 Nov 2024 16:14:36 +0000
Subject: [PATCH 2/2] change test case name

---
 llvm/test/CodeGen/PowerPC/{issue116061.ll => pr116071.ll} | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename llvm/test/CodeGen/PowerPC/{issue116061.ll => pr116071.ll} (100%)

diff --git a/llvm/test/CodeGen/PowerPC/issue116061.ll b/llvm/test/CodeGen/PowerPC/pr116071.ll
similarity index 100%
rename from llvm/test/CodeGen/PowerPC/issue116061.ll
rename to llvm/test/CodeGen/PowerPC/pr116071.ll



More information about the llvm-commits mailing list