]> granicus.if.org Git - llvm/commitdiff
[ARM] Fix 28282: cost computation for constant hoisting
authorWeiming Zhao <weimingz@codeaurora.org>
Tue, 28 Jun 2016 22:30:45 +0000 (22:30 +0000)
committerWeiming Zhao <weimingz@codeaurora.org>
Tue, 28 Jun 2016 22:30:45 +0000 (22:30 +0000)
Summary:
This fixes bug: https://llvm.org/bugs/show_bug.cgi?id=28282

Currently the cost model of constant hoisting checks the bit width of the data type of the constants.
However, the actual immediate value is small enough and not need to be hoisted.
This patch checks for the actual bit width needed for the constant.

Reviewers: t.p.northover, rengolin

Subscribers: aemerson, rengolin, llvm-commits

Differential Revision: http://reviews.llvm.org/D21668

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

lib/Target/ARM/ARMTargetTransformInfo.cpp
test/Transforms/ConstantHoisting/ARM/bad-cases.ll

index aaec3107aece244ded82b1a71d60ed596437ee36..ddb5d2877801816903222792f3956a7512d51583 100644 (file)
@@ -19,7 +19,7 @@ int ARMTTIImpl::getIntImmCost(const APInt &Imm, Type *Ty) {
   assert(Ty->isIntegerTy());
 
  unsigned Bits = Ty->getPrimitiveSizeInBits();
- if (Bits == 0 || Bits > 64)
+ if (Bits == 0 || Imm.getActiveBits() >= 64)
    return 4;
 
   int64_t SImmVal = Imm.getSExtValue();
index 8fa78e3d69b4a7e0dca4d060cac3fd759e75d4e1..ffcfb2e56c95d5b3a712b31ce08070a5d09335e0 100644 (file)
@@ -90,3 +90,20 @@ loop:
 end:
   ret void
 }
+
+;PR 28282: even when data type is larger than 64-bit, the bit width of the
+;constant operand could be smaller than 64-bit. In this case, there is no
+;benefit to hoist the constant.
+define i32 @struct_type_test(i96 %a0, i96 %a1) {
+;CHECK-LABEL: @struct_type_test
+entry:
+;CHECK-NOT: %const = bitcast i96 32 to i96
+;CHECK: lshr0 = lshr i96 %a0, 32
+  %lshr0 = lshr i96 %a0, 32
+  %cast0 = trunc i96 %lshr0 to i32
+;CHECK: lshr1 = lshr i96 %a1, 32
+  %lshr1 = lshr i96 %a1, 32
+  %cast1 = trunc i96 %lshr1 to i32
+  %ret = add i32 %cast0, %cast1
+  ret i32 %ret
+}