[llvm-bugs] [Bug 33486] New: [AArch64] Missed CMN opportunities

via llvm-bugs llvm-bugs at lists.llvm.org
Fri Jun 16 11:49:50 PDT 2017


https://bugs.llvm.org/show_bug.cgi?id=33486

            Bug ID: 33486
           Summary: [AArch64] Missed CMN opportunities
           Product: libraries
           Version: trunk
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: Backend: AArch64
          Assignee: unassignedbugs at nondot.org
          Reporter: mcrosier at codeaurora.org
                CC: llvm-bugs at lists.llvm.org

Tests:
bool test1(int a, int b) { return (a + b) == 0; }
bool test2(int a, int b) { return (a + b) != 0; }

Clang currently generates:
test1:                                  // @test1
// BB#0:                                // %entry
        neg      w8, w1
        cmp             w8, w0
        cset     w0, eq
        ret
test2:                                  // @test2
// BB#0:                                // %entry
        neg      w8, w1
        cmp             w8, w0
        cset     w0, ne
        ret

However, we should generate:
test1:                                  // @test1
// BB#0:                                // %entry
        cmn             w0, w1
        cset     w0, eq
        ret
test2:                                  // @test2
// BB#0:                                // %entry
        cmn             w0, w1
        cset     w0, ne
        ret

Reassociation will canonicalizes to these tests to 0-x == y and 0-x != y.  And
then for X86 a DAG combine will covert these back to x+y == 0 and x+y != 0,
respectively.

Here's a patch for AArch64 that is a straight cut and paste from X86 to
AArch64:
diff --git a/lib/Target/AArch64/AArch64ISelLowering.cpp
b/lib/Target/AArch64/AArch64ISelLowering.cpp
index 083ca21..8286838 100644
--- a/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -545,6 +545,7 @@ AArch64TargetLowering::AArch64TargetLowering(const
TargetMachine &TM,

   setTargetDAGCombine(ISD::MUL);

+  setTargetDAGCombine(ISD::SETCC);
   setTargetDAGCombine(ISD::SELECT);
   setTargetDAGCombine(ISD::VSELECT);

@@ -10204,6 +10205,34 @@ static SDValue performNVCASTCombine(SDNode *N) {
   return SDValue();
 }

+static SDValue performSetCCCombine(SDNode *N, SelectionDAG &DAG) {
+  ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(2))->get();
+  if (CC != ISD::SETNE && CC != ISD::SETEQ)
+    return SDValue();
+
+  EVT VT = N->getValueType(0);
+  SDValue LHS = N->getOperand(0);
+  SDValue RHS = N->getOperand(1);
+
+  SDLoc DL(N);
+  EVT OpVT = LHS.getValueType();
+  // 0-x == y --> x+y == 0
+  // 0-x != y --> x+y != 0
+  if (LHS.getOpcode() == ISD::SUB && isNullConstant(LHS.getOperand(0)) &&
+    LHS.hasOneUse()) {
+  SDValue Add = DAG.getNode(ISD::ADD, DL, OpVT, RHS, LHS.getOperand(1));
+  return DAG.getSetCC(DL, VT, Add, DAG.getConstant(0, DL, OpVT), CC);
+  }
+  // x == 0-y --> x+y == 0
+  // x != 0-y --> x+y != 0
+  if (RHS.getOpcode() == ISD::SUB && isNullConstant(RHS.getOperand(0)) &&
+    RHS.hasOneUse()) {
+    SDValue Add = DAG.getNode(ISD::ADD, DL, OpVT, LHS, RHS.getOperand(1));
+    return DAG.getSetCC(DL, VT, Add, DAG.getConstant(0, DL, OpVT), CC);
+  }
+  return SDValue();
+}
+
 SDValue AArch64TargetLowering::PerformDAGCombine(SDNode *N,
                                                  DAGCombinerInfo &DCI) const {
   SelectionDAG &DAG = DCI.DAG;
@@ -10249,6 +10278,8 @@ SDValue AArch64TargetLowering::PerformDAGCombine(SDNode
*N,
     break;
   case ISD::STORE:
     return performSTORECombine(N, DCI, DAG, Subtarget);
+  case ISD::SETCC:
+    return performSetCCCombine(N, DAG);
   case AArch64ISD::BRCOND:
     return performBRCONDCombine(N, DCI, DAG);
   case AArch64ISD::TBNZ:


The above patch will fix the problem, but I'm not sure it's the best solution
and it doesn't impact any of the workloads I care about.  Therefore, I'm not
interested in pursuing this further, but figured I'd file a bug..

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20170616/3b342964/attachment.html>


More information about the llvm-bugs mailing list