[llvm-branch-commits] [llvm] CodeGen: Fix MachineCSE PRE insert point with SUCC_ARGS (PR #218895)
Matt Arsenault via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Aug 26 06:50:17 PDT 2026
https://github.com/arsenm updated https://github.com/llvm/llvm-project/pull/218895
>From 4028c1696d88ea6fbad69898f0826f3f933daae3 Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Tue, 18 Aug 2026 22:13:49 +0200
Subject: [PATCH] CodeGen: Fix MachineCSE PRE insert point with SUCC_ARGS
Hoist to getBlockEndInsertPt() instead of getFirstTerminator(), so a hoisted
instruction lands before the SUCC_ARGS cluster rather than inside it.
Co-Authored-By: Claude <noreply at anthropic.com> (Claude Opus 4.8)
---
llvm/lib/CodeGen/MachineCSE.cpp | 2 +-
.../PowerPC/machine-cse-pre-succ-args.mir | 99 +++++++++++++++++++
2 files changed, 100 insertions(+), 1 deletion(-)
create mode 100644 llvm/test/CodeGen/PowerPC/machine-cse-pre-succ-args.mir
diff --git a/llvm/lib/CodeGen/MachineCSE.cpp b/llvm/lib/CodeGen/MachineCSE.cpp
index 2ac740856c439..3e57f635c515f 100644
--- a/llvm/lib/CodeGen/MachineCSE.cpp
+++ b/llvm/lib/CodeGen/MachineCSE.cpp
@@ -872,7 +872,7 @@ bool MachineCSEImpl::ProcessBlockPRE(MachineDominatorTree *DT,
if (!isProfitableToCSE(NewReg, VReg, CMBB, &MI))
continue;
MachineInstr &NewMI =
- TII->duplicate(*CMBB, CMBB->getFirstTerminator(), MI);
+ TII->duplicate(*CMBB, CMBB->getBlockEndInsertPt(), MI);
// When hoisting, make sure we don't carry the debug location of
// the original instruction, as that's not correct and can cause
diff --git a/llvm/test/CodeGen/PowerPC/machine-cse-pre-succ-args.mir b/llvm/test/CodeGen/PowerPC/machine-cse-pre-succ-args.mir
new file mode 100644
index 0000000000000..a4baba760e1d2
--- /dev/null
+++ b/llvm/test/CodeGen/PowerPC/machine-cse-pre-succ-args.mir
@@ -0,0 +1,99 @@
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6
+# RUN: llc %s -o - -mtriple=powerpc-unknown-unknown -run-pass=machine-cse | FileCheck %s
+
+# MachineCSE PRE hoists the redundant FDIV into bb.1, which must land before the
+# SUCC_ARGS cluster rather than inside it.
+
+--- |
+ define void @can_pre() {
+ entry:
+ br label %for.body
+ for.body:
+ br i1 poison, label %if.then, label %if.else
+ if.then:
+ br label %if.end
+ if.else:
+ br label %if.end
+ if.end:
+ br label %for.body
+ }
+...
+---
+name: can_pre
+tracksRegLiveness: true
+usesBlockArgs: true
+body: |
+ ; CHECK-LABEL: name: can_pre
+ ; CHECK: bb.0.entry:
+ ; CHECK-NEXT: successors: %bb.1(0x80000000)
+ ; CHECK-NEXT: liveins: $r1, $f1, $f2
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:gprc = COPY $r1
+ ; CHECK-NEXT: [[COPY1:%[0-9]+]]:f8rc = COPY $f1
+ ; CHECK-NEXT: [[COPY2:%[0-9]+]]:f8rc = COPY $f2
+ ; CHECK-NEXT: SUCC_ARGS %bb.1, [[COPY1]]
+ ; CHECK-NEXT: B %bb.1
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: bb.1.for.body:
+ ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.3(0x40000000)
+ ; CHECK-NEXT: arguments: %3
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: $cr0 = CMPLWI [[COPY]], 0
+ ; CHECK-NEXT: [[FDIV:%[0-9]+]]:f8rc = nofpexcept FDIV [[COPY1]], [[COPY2]], implicit $rm
+ ; CHECK-NEXT: SUCC_ARGS %bb.4, %3:f8rc
+ ; CHECK-NEXT: BCC 44, $cr0, %bb.2
+ ; CHECK-NEXT: B %bb.3
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: bb.2.if.then:
+ ; CHECK-NEXT: successors: %bb.4(0x80000000)
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: SUCC_ARGS %bb.4, [[FDIV]]
+ ; CHECK-NEXT: B %bb.4
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: bb.3.if.else:
+ ; CHECK-NEXT: successors: %bb.4(0x80000000)
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: SUCC_ARGS %bb.4, [[FDIV]]
+ ; CHECK-NEXT: B %bb.4
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: bb.4.if.end:
+ ; CHECK-NEXT: successors: %bb.1(0x80000000)
+ ; CHECK-NEXT: arguments: %6
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: SUCC_ARGS %bb.1, %6:f8rc
+ ; CHECK-NEXT: B %bb.1
+ bb.0.entry:
+ successors: %bb.1
+ liveins: $r1, $f1, $f2
+ %2:gprc = COPY $r1
+ %4:f8rc = COPY $f1
+ %5:f8rc = COPY $f2
+ SUCC_ARGS %bb.1, %4
+ B %bb.1
+
+ bb.1.for.body:
+ successors: %bb.2, %bb.3
+ arguments: %6:f8rc
+ $cr0 = CMPLWI %2, 0
+ SUCC_ARGS %bb.4, %6
+ BCC 44, $cr0, %bb.2
+ B %bb.3
+
+ bb.2.if.then:
+ successors: %bb.4
+ %0:f8rc = nofpexcept FDIV %4, %5, implicit $rm
+ SUCC_ARGS %bb.4, %0
+ B %bb.4
+
+ bb.3.if.else:
+ successors: %bb.4
+ %1:f8rc = nofpexcept FDIV %4, %5, implicit $rm
+ SUCC_ARGS %bb.4, %1
+ B %bb.4
+
+ bb.4.if.end:
+ successors: %bb.1
+ arguments: %7:f8rc
+ SUCC_ARGS %bb.1, %7
+ B %bb.1
+...
More information about the llvm-branch-commits
mailing list