[llvm] r206100 - [ARM64] Fix the cost model for cheap large constants.

Juergen Ributzka juergen at apple.com
Fri Apr 11 19:36:28 PDT 2014


Author: ributzka
Date: Fri Apr 11 21:36:28 2014
New Revision: 206100

URL: http://llvm.org/viewvc/llvm-project?rev=206100&view=rev
Log:
[ARM64] Fix the cost model for cheap large constants.

Originally the cost model would give up for large constants and just return the
maximum cost. This is not what we want for constant hoisting, because some of
these constants are large in bitwidth, but are still cheap to materialize.

This commit fixes the cost model to either return TCC_Free if the cost cannot be
determined, or accurately calculate the cost even for large constants
(bitwidth > 128).

This fixes <rdar://problem/16591573>.

Modified:
    llvm/trunk/lib/Target/ARM64/ARM64TargetTransformInfo.cpp
    llvm/trunk/test/Transforms/ConstantHoisting/ARM64/large-immediate.ll

Modified: llvm/trunk/lib/Target/ARM64/ARM64TargetTransformInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM64/ARM64TargetTransformInfo.cpp?rev=206100&r1=206099&r2=206100&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM64/ARM64TargetTransformInfo.cpp (original)
+++ llvm/trunk/lib/Target/ARM64/ARM64TargetTransformInfo.cpp Fri Apr 11 21:36:28 2014
@@ -154,7 +154,7 @@ unsigned ARM64TTI::getIntImmCost(const A
   assert(Ty->isIntegerTy());
 
   unsigned BitSize = Ty->getPrimitiveSizeInBits();
-  if (BitSize == 0 || BitSize > 128)
+  if (BitSize == 0)
     return ~0U;
 
   // Sign-extend all constants to a multiple of 64-bit.
@@ -179,8 +179,10 @@ unsigned ARM64TTI::getIntImmCost(unsigne
   assert(Ty->isIntegerTy());
 
   unsigned BitSize = Ty->getPrimitiveSizeInBits();
-  if (BitSize == 0 || BitSize > 128)
-    return ~0U;
+  // There is no cost model for constants with a bit size of 0. Return TCC_Free
+  // here, so that constant hoisting will ignore this constant.
+  if (BitSize == 0)
+    return TCC_Free;
 
   unsigned ImmIdx = ~0U;
   switch (Opcode) {
@@ -238,8 +240,10 @@ unsigned ARM64TTI::getIntImmCost(Intrins
   assert(Ty->isIntegerTy());
 
   unsigned BitSize = Ty->getPrimitiveSizeInBits();
-  if (BitSize == 0 || BitSize > 128)
-    return ~0U;
+  // There is no cost model for constants with a bit size of 0. Return TCC_Free
+  // here, so that constant hoisting will ignore this constant.
+  if (BitSize == 0)
+    return TCC_Free;
 
   switch (IID) {
   default:

Modified: llvm/trunk/test/Transforms/ConstantHoisting/ARM64/large-immediate.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ConstantHoisting/ARM64/large-immediate.ll?rev=206100&r1=206099&r2=206100&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/ConstantHoisting/ARM64/large-immediate.ll (original)
+++ llvm/trunk/test/Transforms/ConstantHoisting/ARM64/large-immediate.ll Fri Apr 11 21:36:28 2014
@@ -8,3 +8,11 @@ define i128 @test1(i128 %a) nounwind {
   ret i128 %2
 }
 
+; Check that we don't hoist large, but cheap constants
+define i512 @test2(i512 %a) nounwind {
+; CHECK-LABEL: test2
+; CHECK-NOT: %const = bitcast i512 7 to i512
+  %1 = and i512 %a, 7
+  %2 = or i512 %1, 7
+  ret i512 %2
+}





More information about the llvm-commits mailing list