[ARM64] Fix immediate cost calculation for types larger than i64.
authorJuergen Ributzka <juergen@apple.com>
Thu, 10 Apr 2014 01:36:59 +0000 (01:36 +0000)
committerJuergen Ributzka <juergen@apple.com>
Thu, 10 Apr 2014 01:36:59 +0000 (01:36 +0000)
The immediate cost calculation code was hitting an assertion in the included
test case, because APInt was still internally 128-bits. Truncating it to 64-bits
fixed the issue.

Fixes <rdar://problem/16572521>.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@205947 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM64/ARM64TargetTransformInfo.cpp
test/Transforms/ConstantHoisting/ARM64/large-immediate.ll [new file with mode: 0644]

index 8a6253d768146b18260f9259a7bbd207c4d16a78..5323b8965f474dee81828a86d56b15a64f2cd306 100644 (file)
@@ -166,7 +166,7 @@ unsigned ARM64TTI::getIntImmCost(const APInt &Imm, Type *Ty) const {
   // chunk.
   unsigned Cost = 0;
   for (unsigned ShiftVal = 0; ShiftVal < BitSize; ShiftVal += 64) {
-    APInt Tmp = ImmVal.ashr(ShiftVal).getLoBits(64);
+    APInt Tmp = ImmVal.ashr(ShiftVal).sextOrTrunc(64);
     int64_t Val = Tmp.getSExtValue();
     Cost += getIntImmCost(Val);
   }
diff --git a/test/Transforms/ConstantHoisting/ARM64/large-immediate.ll b/test/Transforms/ConstantHoisting/ARM64/large-immediate.ll
new file mode 100644 (file)
index 0000000..0965a45
--- /dev/null
@@ -0,0 +1,10 @@
+; RUN: opt -mtriple=arm64-darwin-unknown -S -consthoist < %s | FileCheck %s
+
+define i128 @test1(i128 %a) nounwind {
+; CHECK-LABEL: test1
+; CHECK: %const = bitcast i128 12297829382473034410122878 to i128
+  %1 = add i128 %a, 12297829382473034410122878
+  %2 = add i128 %1, 12297829382473034410122878
+  ret i128 %2
+}
+