[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