diff options
-rw-r--r-- | llvm/lib/Target/AArch64/AArch64ISelLowering.cpp | 4 | ||||
-rw-r--r-- | llvm/test/CodeGen/AArch64/neg-imm.ll | 46 |
2 files changed, 2 insertions, 48 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp index 1b7365474b7..faff086cc05 100644 --- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -7276,14 +7276,14 @@ EVT AArch64TargetLowering::getOptimalMemOpType(uint64_t Size, unsigned DstAlign, // 12-bit optionally shifted immediates are legal for adds. bool AArch64TargetLowering::isLegalAddImmediate(int64_t Immed) const { - // Same encoding for add/sub, just flip the sign. - Immed = std::abs(Immed); return ((Immed >> 12) == 0 || ((Immed & 0xfff) == 0 && Immed >> 24 == 0)); } // Integer comparisons are implemented with ADDS/SUBS, so the range of valid // immediates is the same as for an add or a sub. bool AArch64TargetLowering::isLegalICmpImmediate(int64_t Immed) const { + if (Immed < 0) + Immed *= -1; return isLegalAddImmediate(Immed); } diff --git a/llvm/test/CodeGen/AArch64/neg-imm.ll b/llvm/test/CodeGen/AArch64/neg-imm.ll deleted file mode 100644 index 3ef0392397b..00000000000 --- a/llvm/test/CodeGen/AArch64/neg-imm.ll +++ /dev/null @@ -1,46 +0,0 @@ -; RUN: llc -mtriple=aarch64-linux-gnu -verify-machineinstrs -o - %s | FileCheck %s -; LSR used to pick a sub-optimal solution due to the target responding -; conservatively to isLegalAddImmediate for negative values. - -declare void @foo(i32) - -define void @test(i32 %px) { -; CHECK-LABEL: test: -; CHECK: // %entry -; CHECK: subs -; CHECK-NEXT: csel -entry: - %sub = add nsw i32 %px, -1 - %cmp = icmp slt i32 %px, 1 - %.sub = select i1 %cmp, i32 0, i32 %sub - br label %for.body - -for.body: -; CHECK: // %for.body -; CHECK: cmp -; CHECK-NEXT: b.eq -; CHECK: // %if.then3 - %x.015 = phi i32 [ %inc, %for.inc ], [ %.sub, %entry ] - %cmp2 = icmp eq i32 %x.015, %px - br i1 %cmp2, label %for.inc, label %if.then3 - -if.then3: - tail call void @foo(i32 %x.015) - br label %for.inc - -for.inc: -; CHECK: // %for.inc -; CHECK: add -; CHECK-NEXT: cmp -; CHECK: b.le -; CHECK: // %for.cond.cleanup - %inc = add nsw i32 %x.015, 1 - %cmp1 = icmp sgt i32 %x.015, %px - br i1 %cmp1, label %for.cond.cleanup.loopexit, label %for.body - -for.cond.cleanup.loopexit: - br label %for.cond.cleanup - -for.cond.cleanup: - ret void -} |