[llvm-branch-commits] [llvm] SystemZ: Don't convert AND to RISBG if CC is live (PR #229063)
Matt Arsenault via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Oct 5 10:49:04 PDT 2026
https://github.com/arsenm updated https://github.com/llvm/llvm-project/pull/229063
>From f52f9915aa7cb44ff2a93be5a2cdc916d8fa3ec1 Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Mon, 5 Oct 2026 14:01:49 +0200
Subject: [PATCH] SystemZ: Don't convert AND to RISBG if CC is live
The RISBG-type replacements either don't define CC or set it with
different semantics, so the conversion dropped or clobbered a CC value
that was still used.
Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
---
llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp | 2 +
.../twoaddr-risbg-cc-liveintervals.mir | 59 +++++++++++++++++++
2 files changed, 61 insertions(+)
diff --git a/llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp b/llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp
index bef2937bf1ba4..fd7160a00ff83 100644
--- a/llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp
+++ b/llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp
@@ -1089,6 +1089,8 @@ SystemZInstrInfo::convertToThreeAddress(MachineInstr &MI,
// Try to convert an AND into an RISBG-type instruction.
// TODO: It might be beneficial to select RISBG and shorten to AND instead.
if (LogicOp And = interpretAndImmediate(MI.getOpcode())) {
+ if (!MI.registerDefIsDead(SystemZ::CC, /*TRI=*/nullptr))
+ return nullptr;
uint64_t Imm = MI.getOperand(2).getImm() << And.ImmLSB;
// AND IMMEDIATE leaves the other bits of the register unchanged.
Imm |= allOnes(And.RegSize) & ~(allOnes(And.ImmSize) << And.ImmLSB);
diff --git a/llvm/test/CodeGen/SystemZ/twoaddr-risbg-cc-liveintervals.mir b/llvm/test/CodeGen/SystemZ/twoaddr-risbg-cc-liveintervals.mir
index 4e789263173d6..575dd2a0760a9 100644
--- a/llvm/test/CodeGen/SystemZ/twoaddr-risbg-cc-liveintervals.mir
+++ b/llvm/test/CodeGen/SystemZ/twoaddr-risbg-cc-liveintervals.mir
@@ -88,3 +88,62 @@ body: |
$r3d = COPY %1
Return implicit $r2d, implicit $r3d
...
+
+# Don't convert if CC is live out of the AND.
+---
+name: and_32_live_cc
+tracksRegLiveness: true
+body: |
+ bb.0:
+ liveins: $r2d, $r3l, $r4l, $r5l
+
+ ; Z196-LABEL: name: and_32_live_cc
+ ; Z196: liveins: $r2d, $r3l, $r4l, $r5l
+ ; Z196-NEXT: {{ $}}
+ ; Z196-NEXT: [[COPY:%[0-9]+]]:gr64bit = COPY $r2d
+ ; Z196-NEXT: [[COPY1:%[0-9]+]]:grx32bit = COPY $r3l
+ ; Z196-NEXT: [[COPY2:%[0-9]+]]:gr32bit = COPY $r4l
+ ; Z196-NEXT: [[COPY3:%[0-9]+]]:gr32bit = COPY $r5l
+ ; Z196-NEXT: dead [[LOCGR:%[0-9]+]]:gr64bit = LOCGR undef [[LOCGR]], [[COPY]], 15, 8, implicit undef $cc
+ ; Z196-NEXT: [[COPY4:%[0-9]+]]:gr64bit = COPY [[COPY]]
+ ; Z196-NEXT: dead [[COPY4:%[0-9]+]]:gr64bit = LOCGR [[COPY4]], undef %5:gr64bit, 15, 8, implicit undef $cc
+ ; Z196-NEXT: [[COPY5:%[0-9]+]]:grx32bit = COPY [[COPY1]]
+ ; Z196-NEXT: [[COPY5:%[0-9]+]]:grx32bit = NIFMux [[COPY5]], 1, implicit-def $cc
+ ; Z196-NEXT: [[COPY6:%[0-9]+]]:gr32bit = COPY [[COPY2]]
+ ; Z196-NEXT: [[COPY6:%[0-9]+]]:gr32bit = LOCR [[COPY6]], [[COPY3]], 15, 8, implicit $cc
+ ; Z196-NEXT: $r2l = COPY [[COPY5]]
+ ; Z196-NEXT: $r3l = COPY [[COPY1]]
+ ; Z196-NEXT: $r4l = COPY [[COPY6]]
+ ; Z196-NEXT: Return implicit $r2l, implicit $r3l, implicit $r4l
+ ;
+ ; ZEC12-LABEL: name: and_32_live_cc
+ ; ZEC12: liveins: $r2d, $r3l, $r4l, $r5l
+ ; ZEC12-NEXT: {{ $}}
+ ; ZEC12-NEXT: [[COPY:%[0-9]+]]:gr64bit = COPY $r2d
+ ; ZEC12-NEXT: [[COPY1:%[0-9]+]]:grx32bit = COPY $r3l
+ ; ZEC12-NEXT: [[COPY2:%[0-9]+]]:gr32bit = COPY $r4l
+ ; ZEC12-NEXT: [[COPY3:%[0-9]+]]:gr32bit = COPY $r5l
+ ; ZEC12-NEXT: dead [[LOCGR:%[0-9]+]]:gr64bit = LOCGR undef [[LOCGR]], [[COPY]], 15, 8, implicit undef $cc
+ ; ZEC12-NEXT: [[COPY4:%[0-9]+]]:gr64bit = COPY [[COPY]]
+ ; ZEC12-NEXT: dead [[COPY4:%[0-9]+]]:gr64bit = LOCGR [[COPY4]], undef %5:gr64bit, 15, 8, implicit undef $cc
+ ; ZEC12-NEXT: [[COPY5:%[0-9]+]]:grx32bit = COPY [[COPY1]]
+ ; ZEC12-NEXT: [[COPY5:%[0-9]+]]:grx32bit = NIFMux [[COPY5]], 1, implicit-def $cc
+ ; ZEC12-NEXT: [[COPY6:%[0-9]+]]:gr32bit = COPY [[COPY2]]
+ ; ZEC12-NEXT: [[COPY6:%[0-9]+]]:gr32bit = LOCR [[COPY6]], [[COPY3]], 15, 8, implicit $cc
+ ; ZEC12-NEXT: $r2l = COPY [[COPY5]]
+ ; ZEC12-NEXT: $r3l = COPY [[COPY1]]
+ ; ZEC12-NEXT: $r4l = COPY [[COPY6]]
+ ; ZEC12-NEXT: Return implicit $r2l, implicit $r3l, implicit $r4l
+ %0:gr64bit = COPY $r2d
+ %1:grx32bit = COPY $r3l
+ %2:gr32bit = COPY $r4l
+ %3:gr32bit = COPY $r5l
+ %4:gr64bit = LOCGR %0, undef %5:gr64bit, 15, 8, implicit undef $cc
+ %6:gr64bit = LOCGR undef %5, %0, 15, 8, implicit undef $cc
+ %7:grx32bit = NIFMux %1, 1, implicit-def $cc
+ %8:gr32bit = LOCR %2, %3, 15, 8, implicit killed $cc
+ $r2l = COPY %7
+ $r3l = COPY %1
+ $r4l = COPY %8
+ Return implicit $r2l, implicit $r3l, implicit $r4l
+...
More information about the llvm-branch-commits
mailing list