[PATCH] D30355: [ARM] don't transform an add(ext Cond), C to select unless there's a setcc of the condition

Sanjay Patel via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Feb 27 13:42:46 PST 2017


This revision was automatically updated to reflect the committed changes.
Closed by commit rL296389: [ARM] don't transform an add(ext Cond), C to select unless there's a setcc of… (authored by spatel).

Changed prior to commit:
  https://reviews.llvm.org/D30355?vs=89892&id=89926#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D30355

Files:
  llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp
  llvm/trunk/test/CodeGen/ARM/arm-and-tst-peephole.ll
  llvm/trunk/test/CodeGen/ARM/select_const.ll


Index: llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp
===================================================================
--- llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp
+++ llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp
@@ -9163,7 +9163,7 @@
     SDLoc dl(N);
     EVT VT = N->getValueType(0);
     CC = N->getOperand(0);
-    if (CC.getValueType() != MVT::i1)
+    if (CC.getValueType() != MVT::i1 || CC.getOpcode() != ISD::SETCC)
       return false;
     Invert = !AllOnes;
     if (AllOnes)
Index: llvm/trunk/test/CodeGen/ARM/arm-and-tst-peephole.ll
===================================================================
--- llvm/trunk/test/CodeGen/ARM/arm-and-tst-peephole.ll
+++ llvm/trunk/test/CodeGen/ARM/arm-and-tst-peephole.ll
@@ -140,7 +140,7 @@
 ; folding of unrelated tests (in this case, a TST against r1 was eliminated in
 ; favour of an AND of r0).
 
-define i32 @test_tst_assessment(i1 %lhs, i1 %rhs) {
+define i32 @test_tst_assessment(i32 %a, i32 %b) {
 ; ARM-LABEL: test_tst_assessment:
 ; ARM:       @ BB#0:
 ; ARM-NEXT:    and r0, r0, #1
@@ -150,11 +150,13 @@
 ;
 ; THUMB-LABEL: test_tst_assessment:
 ; THUMB:       @ BB#0:
-; THUMB-NEXT:    movs r2, #1
-; THUMB-NEXT:    ands r2, r0
-; THUMB-NEXT:    subs r0, r2, #1
+; THUMB-NEXT:    push {r0}
+; THUMB-NEXT:    pop {r2}
+; THUMB-NEXT:    movs r0, #1
+; THUMB-NEXT:    ands r0, r2
+; THUMB-NEXT:    subs r2, r0, #1
 ; THUMB-NEXT:    lsls r1, r1, #31
-; THUMB-NEXT:    bne .LBB2_2
+; THUMB-NEXT:    beq .LBB2_2
 ; THUMB-NEXT:  @ BB#1:
 ; THUMB-NEXT:    push {r2}
 ; THUMB-NEXT:    pop {r0}
@@ -176,10 +178,12 @@
 ; V8-NEXT:    it ne
 ; V8-NEXT:    subne r0, #1
 ; V8-NEXT:    bx lr
-  %lhs32 = zext i1 %lhs to i32
-  %rhs32 = zext i1 %rhs to i32
-  %diff = sub nsw i32 %lhs32, %rhs32
-  ret i32 %diff
+  %and1 = and i32 %a, 1
+  %sub = sub i32 %and1, 1
+  %and2 = and i32 %b, 1
+  %cmp = icmp eq i32 %and2, 0
+  %sel = select i1 %cmp, i32 %and1, i32 %sub
+  ret i32 %sel
 }
 
 !1 = !{!"branch_weights", i32 1, i32 1, i32 3, i32 2 }
Index: llvm/trunk/test/CodeGen/ARM/select_const.ll
===================================================================
--- llvm/trunk/test/CodeGen/ARM/select_const.ll
+++ llvm/trunk/test/CodeGen/ARM/select_const.ll
@@ -98,9 +98,8 @@
 define i32 @select_0_or_neg1_alt(i1 %cond) {
 ; CHECK-LABEL: select_0_or_neg1_alt:
 ; CHECK:       @ BB#0:
-; CHECK-NEXT:    mov r1, #1
-; CHECK-NEXT:    bic r0, r1, r0
-; CHECK-NEXT:    rsb r0, r0, #0
+; CHECK-NEXT:    and r0, r0, #1
+; CHECK-NEXT:    sub r0, r0, #1
 ; CHECK-NEXT:    mov pc, lr
   %z = zext i1 %cond to i32
   %add = add i32 %z, -1
@@ -110,8 +109,7 @@
 define i32 @select_0_or_neg1_alt_zeroext(i1 zeroext %cond) {
 ; CHECK-LABEL: select_0_or_neg1_alt_zeroext:
 ; CHECK:       @ BB#0:
-; CHECK-NEXT:    eor r0, r0, #1
-; CHECK-NEXT:    rsb r0, r0, #0
+; CHECK-NEXT:    sub r0, r0, #1
 ; CHECK-NEXT:    mov pc, lr
   %z = zext i1 %cond to i32
   %add = add i32 %z, -1


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D30355.89926.patch
Type: text/x-patch
Size: 2921 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170227/759ef7d9/attachment.bin>


More information about the llvm-commits mailing list