[llvm] [ARM] LHS and RHS should be frozen for LowerCMP (PR #159993)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Sep 21 10:57:33 PDT 2025
https://github.com/AZero13 updated https://github.com/llvm/llvm-project/pull/159993
>From a1aa7c0f8bd772520ced378844f4cd38507269eb Mon Sep 17 00:00:00 2001
From: AZero13 <gfunni234 at gmail.com>
Date: Sun, 21 Sep 2025 13:38:48 -0400
Subject: [PATCH] [ARM] LHS and RHS should be frozen for LowerCMP
LHS and RHS are used multiple times.
---
llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp | 8 ++++----
llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp | 4 ++--
llvm/lib/Target/ARM/ARMISelLowering.cpp | 13 +++++--------
3 files changed, 11 insertions(+), 14 deletions(-)
diff --git a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
index f3e036ed1b947..3be957378286f 100644
--- a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
@@ -8582,6 +8582,8 @@ LegalizerHelper::lowerThreewayCompare(MachineInstr &MI) {
LLT DstTy = MRI.getType(Dst);
LLT SrcTy = MRI.getType(Cmp->getReg(1));
LLT CmpTy = DstTy.changeElementSize(1);
+ auto LHS = MIRBuilder.buildFreeze(SrcTy, Cmp->getLHSReg());
+ auto RHS = MIRBuilder.buildFreeze(SrcTy, Cmp->getRHSReg());
CmpInst::Predicate LTPredicate = Cmp->isSigned()
? CmpInst::Predicate::ICMP_SLT
@@ -8591,10 +8593,8 @@ LegalizerHelper::lowerThreewayCompare(MachineInstr &MI) {
: CmpInst::Predicate::ICMP_UGT;
auto Zero = MIRBuilder.buildConstant(DstTy, 0);
- auto IsGT = MIRBuilder.buildICmp(GTPredicate, CmpTy, Cmp->getLHSReg(),
- Cmp->getRHSReg());
- auto IsLT = MIRBuilder.buildICmp(LTPredicate, CmpTy, Cmp->getLHSReg(),
- Cmp->getRHSReg());
+ auto IsGT = MIRBuilder.buildICmp(GTPredicate, CmpTy, LHS, RHS);
+ auto IsLT = MIRBuilder.buildICmp(LTPredicate, CmpTy, LHS, RHS);
auto &Ctx = MIRBuilder.getMF().getFunction().getContext();
auto BC = TLI.getBooleanContents(DstTy.isVector(), /*isFP=*/false);
diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
index 80500e48351e4..02f85cfc9262e 100644
--- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -10956,8 +10956,8 @@ SDValue TargetLowering::expandAddSubSat(SDNode *Node, SelectionDAG &DAG) const {
SDValue TargetLowering::expandCMP(SDNode *Node, SelectionDAG &DAG) const {
unsigned Opcode = Node->getOpcode();
- SDValue LHS = Node->getOperand(0);
- SDValue RHS = Node->getOperand(1);
+ SDValue LHS = DAG.getFreeze(Node->getOperand(0));
+ SDValue RHS = DAG.getFreeze(Node->getOperand(1));
EVT VT = LHS.getValueType();
EVT ResVT = Node->getValueType(0);
EVT BoolVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp
index 9052cbfa89deb..01ab006d288fa 100644
--- a/llvm/lib/Target/ARM/ARMISelLowering.cpp
+++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp
@@ -10479,6 +10479,9 @@ SDValue ARMTargetLowering::LowerCMP(SDValue Op, SelectionDAG &DAG) const {
// Special case for Thumb1 UCMP only
if (!IsSigned && Subtarget->isThumb1Only()) {
+ LHS = DAG.getFreeze(LHS);
+ RHS = DAG.getFreeze(RHS);
+
// For Thumb unsigned comparison, use this sequence:
// subs r2, r0, r1 ; r2 = LHS - RHS, sets flags
// sbc r2, r2 ; r2 = r2 - r2 - !carry
@@ -10511,10 +10514,7 @@ SDValue ARMTargetLowering::LowerCMP(SDValue Op, SelectionDAG &DAG) const {
// Final subtraction: Sbc1Result - Sbc2Result (no flags needed)
SDValue Result =
DAG.getNode(ISD::SUB, dl, MVT::i32, Sbc1Result, Sbc2Result);
- if (Op.getValueType() != MVT::i32)
- Result = DAG.getSExtOrTrunc(Result, dl, Op.getValueType());
-
- return Result;
+ return DAG.getSExtOrTrunc(Result, dl, Op.getValueType());
}
// For the ARM assembly pattern:
@@ -10582,10 +10582,7 @@ SDValue ARMTargetLowering::LowerCMP(SDValue Op, SelectionDAG &DAG) const {
SDValue Result2 = DAG.getNode(ARMISD::CMOV, dl, MVT::i32, Result1, MinusOne,
LTCondValue, Flags);
- if (Op.getValueType() != MVT::i32)
- Result2 = DAG.getSExtOrTrunc(Result2, dl, Op.getValueType());
-
- return Result2;
+ return DAG.getSExtOrTrunc(Result2, dl, Op.getValueType());
}
SDValue ARMTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
More information about the llvm-commits
mailing list