diff options
author | David Green <david.green@arm.com> | 2018-02-22 09:38:57 +0000 |
---|---|---|
committer | David Green <david.green@arm.com> | 2018-02-22 09:38:57 +0000 |
commit | 01e0f25a9f950edc1c3324100e7143b07bef12a0 (patch) | |
tree | 5255b05ba844b67aa26475781ad0b1fbaba94748 | |
parent | 61ccaf6ddd923e80358b96d59e78f9475a1ed065 (diff) | |
download | bcm5719-llvm-01e0f25a9f950edc1c3324100e7143b07bef12a0.tar.gz bcm5719-llvm-01e0f25a9f950edc1c3324100e7143b07bef12a0.zip |
[ARM] Fix issue with large xor constants.
Fixup to rL325573 for large xor constants.
Thanks to Eli Friedman for the catch.
Differential revision: https://reviews.llvm.org/D43549
llvm-svn: 325761
-rw-r--r-- | llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp | 7 | ||||
-rw-r--r-- | llvm/test/CodeGen/Thumb/mvn.ll | 29 |
2 files changed, 31 insertions, 5 deletions
diff --git a/llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp b/llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp index 95481e042b9..1e6db8960a2 100644 --- a/llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp +++ b/llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp @@ -127,11 +127,8 @@ int ARMTTIImpl::getIntImmCost(unsigned Opcode, unsigned Idx, const APInt &Imm, } // xor a, -1 can always be folded to MVN - if (Opcode == Instruction::Xor) { - int64_t NegImm = Imm.getSExtValue(); - if (NegImm == -1) - return 0; - } + if (Opcode == Instruction::Xor && Imm.isAllOnesValue()) + return 0; return getIntImmCost(Imm, Ty); } diff --git a/llvm/test/CodeGen/Thumb/mvn.ll b/llvm/test/CodeGen/Thumb/mvn.ll index b556a5aa5a6..1e16effc259 100644 --- a/llvm/test/CodeGen/Thumb/mvn.ll +++ b/llvm/test/CodeGen/Thumb/mvn.ll @@ -191,3 +191,32 @@ for.cond.cleanup: ret void } + +define void @test128(i128* %a) { +; CHECK-LABEL: test128: +; CHECK: ldr r1, [r0, #4] +; CHECK-NEXT: ldr r2, .LCPI8_0 +; CHECK-NEXT: eors r2, r1 +; CHECK-NEXT: str r2, [r0, #4] +; CHECK-NEXT: ldr r1, [r0] +; CHECK-NEXT: ldr r2, .LCPI8_1 +; CHECK-NEXT: eors r2, r1 +; CHECK-NEXT: str r2, [r0] +; CHECK-NEXT: ldr r1, [r0, #8] +; CHECK-NEXT: ldr r2, .LCPI8_2 +; CHECK-NEXT: eors r2, r1 +; CHECK-NEXT: str r2, [r0, #8] +; CHECK-NEXT: bx lr +; CHECK-NEXT: .p2align 2 +; CHECK-NEXT: .LCPI8_0: +; CHECK-NEXT: .long 4075008415 +; CHECK-NEXT: .LCPI8_1: +; CHECK-NEXT: .long 2080661269 +; CHECK-NEXT: .LCPI8_2: +; CHECK-NEXT: .long 6692605 + %x = load i128, i128* %a + %xn = xor i128 %x, 123456789123456789123456789 + store i128 %xn, i128* %a + ret void +} + |