From 09c10d86a80302cad0ee84ae77f586d026ce21e7 Mon Sep 17 00:00:00 2001 From: Eli Friedman <efriedma@codeaurora.org> Date: Fri, 8 Jun 2018 21:16:56 +0000 Subject: [PATCH] [ARM] Allow CMPZ transforms even if the input has multiple uses. It looks like this got left in by accident in r289794; I can't think of any reason this check would be necessary. (Maybe it was meant to be a check that the AND has one use? But we check that a few lines earlier.) Differential Revision: https://reviews.llvm.org/D47921 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334322 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/ARM/ARMISelDAGToDAG.cpp | 2 +- test/CodeGen/ARM/and-cmpz.ll | 18 ++++++++++++++++++ test/CodeGen/ARM/load_i1_select.ll | 2 +- test/CodeGen/Thumb/thumb-shrink-wrapping.ll | 4 ++-- 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/lib/Target/ARM/ARMISelDAGToDAG.cpp b/lib/Target/ARM/ARMISelDAGToDAG.cpp index fa41f880e3a..1a0ffe4e176 100644 --- a/lib/Target/ARM/ARMISelDAGToDAG.cpp +++ b/lib/Target/ARM/ARMISelDAGToDAG.cpp @@ -2459,7 +2459,7 @@ void ARMDAGToDAGISel::SelectCMPZ(SDNode *N, bool &SwitchEQNEToPLMI) { SDValue X = And.getOperand(0); auto C = dyn_cast<ConstantSDNode>(And.getOperand(1)); - if (!C || !X->hasOneUse()) + if (!C) return; auto Range = getContiguousRangeOfSetBits(C->getAPIntValue()); if (!Range) diff --git a/test/CodeGen/ARM/and-cmpz.ll b/test/CodeGen/ARM/and-cmpz.ll index 809dc6cc6ba..6cc3d39b58c 100644 --- a/test/CodeGen/ARM/and-cmpz.ll +++ b/test/CodeGen/ARM/and-cmpz.ll @@ -18,6 +18,24 @@ false: ret i32 2 } +; CHECK-LABEL: single_bit_multi_use: +; CHECK: lsls r0, r0, #23 +; T2-NEXT: mov +; T2-NEXT: it +; T1-NEXT: bmi +define i32 @single_bit_multi_use(i32 %p, i32* %z) { + store i32 %p, i32* %z + %a = and i32 %p, 256 + %b = icmp eq i32 %a, 0 + br i1 %b, label %true, label %false + +true: + ret i32 1 + +false: + ret i32 2 +} + ; CHECK-LABEL: multi_bit_lsb_ubfx: ; CHECK: lsls r0, r0, #24 ; T2-NEXT: mov diff --git a/test/CodeGen/ARM/load_i1_select.ll b/test/CodeGen/ARM/load_i1_select.ll index 48cd4eae58f..459b121ce1d 100644 --- a/test/CodeGen/ARM/load_i1_select.ll +++ b/test/CodeGen/ARM/load_i1_select.ll @@ -8,7 +8,7 @@ target triple = "thumbv7-apple-ios0.0.0" ; CHECK-LABEL: foo: ; CHECK: ldrb r[[R0:[0-9]+]], [r0] -; CHECK: tst.w r[[R0]], #1 +; CHECK: lsls r{{[0-9]+}}, r[[R0]], #31 define void @foo(i8* %call, double* %p) nounwind { entry: %tmp2 = load i8, i8* %call diff --git a/test/CodeGen/Thumb/thumb-shrink-wrapping.ll b/test/CodeGen/Thumb/thumb-shrink-wrapping.ll index 5d93f30f417..d334706c8e8 100644 --- a/test/CodeGen/Thumb/thumb-shrink-wrapping.ll +++ b/test/CodeGen/Thumb/thumb-shrink-wrapping.ll @@ -646,12 +646,12 @@ define i1 @beq_to_bx(i32* %y, i32 %head) { ; CHECK-NEXT: beq [[EXIT_LABEL:LBB[0-9_]+]] ; ENABLE: push {r4, lr} -; CHECK: tst r3, r4 +; CHECK: lsls r4, r3, #30 ; ENABLE-NEXT: ldr [[POP:r[4567]]], [sp, #4] ; ENABLE-NEXT: mov lr, [[POP]] ; ENABLE-NEXT: pop {[[POP]]} ; ENABLE-NEXT: add sp, #4 -; CHECK-NEXT: beq [[EXIT_LABEL]] +; CHECK-NEXT: bpl [[EXIT_LABEL]] ; CHECK: str r1, [r2] ; CHECK: str r3, [r2] -- GitLab