[llvm] [PowerPC] Extend select_cc lhs, 0, 1, 0, cc optimization to PowerPC 64 (PR #206281)

via llvm-commits llvm-commits at lists.llvm.org
Sat Jun 27 12:32:38 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-powerpc

Author: AZero13 (AZero13)

<details>
<summary>Changes</summary>



---
Full diff: https://github.com/llvm/llvm-project/pull/206281.diff


2 Files Affected:

- (modified) llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp (+15-7) 
- (modified) llvm/test/CodeGen/PowerPC/ppc-crbits-onoff.ll (+4-9) 


``````````diff
diff --git a/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp b/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
index 016c547821f7a..dfa95fa87ee0a 100644
--- a/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
+++ b/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
@@ -5891,16 +5891,24 @@ void PPCDAGToDAGISel::Select(SDNode *N) {
       }
     }
 
-    // Handle the setcc cases here.  select_cc lhs, 0, 1, 0, cc
-    if (!isPPC64 && isNullConstant(N->getOperand(1)) &&
+    // Handle the setcc cases here.  select_cc lhs, 0, 1, 0, setne
+    // Compute (lhs != 0) as: addic tmp, lhs, -1; subfe res, tmp, lhs
+    if (isNullConstant(N->getOperand(1)) &&
         isOneConstant(N->getOperand(2)) && isNullConstant(N->getOperand(3)) &&
         CC == ISD::SETNE &&
-        // FIXME: Implement this optzn for PPC64.
-        N->getValueType(0) == MVT::i32) {
+        N->getOperand(0).getValueType() == N->getValueType(0) &&
+        (N->getValueType(0) == MVT::i32 ||
+         (isPPC64 && N->getValueType(0) == MVT::i64))) {
+      bool Is64Bit = N->getValueType(0) == MVT::i64;
+      unsigned AddicOpc = Is64Bit ? PPC::ADDIC8 : PPC::ADDIC;
+      unsigned SubfeOpc = Is64Bit ? PPC::SUBFE8 : PPC::SUBFE;
+      MVT VT = Is64Bit ? MVT::i64 : MVT::i32;
+      SDValue ImmOp = Is64Bit ? getI64Imm(~0ULL, dl) : getI32Imm(~0U, dl);
+
       SDNode *Tmp =
-          CurDAG->getMachineNode(PPC::ADDIC, dl, MVT::i32, MVT::Glue,
-                                 N->getOperand(0), getI32Imm(~0U, dl));
-      CurDAG->SelectNodeTo(N, PPC::SUBFE, MVT::i32, SDValue(Tmp, 0),
+          CurDAG->getMachineNode(AddicOpc, dl, VT, MVT::Glue,
+                                 N->getOperand(0), ImmOp);
+      CurDAG->SelectNodeTo(N, SubfeOpc, VT, SDValue(Tmp, 0),
                            N->getOperand(0), SDValue(Tmp, 1));
       return;
     }
diff --git a/llvm/test/CodeGen/PowerPC/ppc-crbits-onoff.ll b/llvm/test/CodeGen/PowerPC/ppc-crbits-onoff.ll
index 49a5687afe4c8..74424f2fc63e6 100644
--- a/llvm/test/CodeGen/PowerPC/ppc-crbits-onoff.ll
+++ b/llvm/test/CodeGen/PowerPC/ppc-crbits-onoff.ll
@@ -9,22 +9,17 @@ define signext i32 @crbitsoff(i32 signext %v1, i32 signext %v2) #0 {
 ; CHECK-LABEL: crbitsoff:
 ; CHECK:       # %bb.0: # %entry
 ; CHECK-NEXT:    cntlzw 4, 4
-; CHECK-NEXT:    cmplwi 3, 0
-; CHECK-NEXT:    li 3, 1
-; CHECK-NEXT:    iseleq 3, 0, 3
+; CHECK-NEXT:    addic 5, 3, -1
+; CHECK-NEXT:    subfe 3, 5, 3
 ; CHECK-NEXT:    rlwinm 4, 4, 27, 5, 31
 ; CHECK-NEXT:    and 3, 3, 4
 ; CHECK-NEXT:    blr
 ;
 ; CHECK-NO-ISEL-LABEL: crbitsoff:
 ; CHECK-NO-ISEL:       # %bb.0: # %entry
-; CHECK-NO-ISEL-NEXT:    cmplwi 3, 0
-; CHECK-NO-ISEL-NEXT:    li 3, 1
-; CHECK-NO-ISEL-NEXT:    bne 0, .LBB0_2
-; CHECK-NO-ISEL-NEXT:  # %bb.1: # %entry
-; CHECK-NO-ISEL-NEXT:    li 3, 0
-; CHECK-NO-ISEL-NEXT:  .LBB0_2: # %entry
 ; CHECK-NO-ISEL-NEXT:    cntlzw 4, 4
+; CHECK-NO-ISEL-NEXT:    addic 5, 3, -1
+; CHECK-NO-ISEL-NEXT:    subfe 3, 5, 3
 ; CHECK-NO-ISEL-NEXT:    rlwinm 4, 4, 27, 5, 31
 ; CHECK-NO-ISEL-NEXT:    and 3, 3, 4
 ; CHECK-NO-ISEL-NEXT:    blr

``````````

</details>


https://github.com/llvm/llvm-project/pull/206281


More information about the llvm-commits mailing list