Don't assert in BasicTTI::getMemoryOpCost for non-simple types
authorHal Finkel <hfinkel@anl.gov>
Mon, 14 Apr 2014 05:59:09 +0000 (05:59 +0000)
committerHal Finkel <hfinkel@anl.gov>
Mon, 14 Apr 2014 05:59:09 +0000 (05:59 +0000)
BasicTTI::getMemoryOpCost must explicitly check for non-simple types; setting
AllowUnknown=true with TLI->getSimpleValueType is not sufficient because, for
example, non-power-of-two vector types return non-simple EVTs (not MVT::Other).

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

lib/CodeGen/BasicTargetTransformInfo.cpp
test/Analysis/CostModel/PowerPC/load_store.ll

index 26bc6218c27cff6b3cabb5a81e444e00db5ead51..ecb403a4b6da5ee208e1dc90aa1314a241648760 100644 (file)
@@ -424,12 +424,14 @@ unsigned BasicTTI::getMemoryOpCost(unsigned Opcode, Type *Src,
     // This is a vector load that legalizes to a larger type than the vector
     // itself. Unless the corresponding extending load or truncating store is
     // legal, then this will scalarize.
-    TargetLowering::LegalizeAction LA;
-    MVT MemVT = getTLI()->getSimpleValueType(Src, true);
-    if (Opcode == Instruction::Store)
-      LA = getTLI()->getTruncStoreAction(LT.second, MemVT);
-    else
-      LA = getTLI()->getLoadExtAction(ISD::EXTLOAD, MemVT);
+    TargetLowering::LegalizeAction LA = TargetLowering::Expand;
+    EVT MemVT = getTLI()->getValueType(Src, true);
+    if (MemVT.isSimple() && MemVT != MVT::Other) {
+      if (Opcode == Instruction::Store)
+        LA = getTLI()->getTruncStoreAction(LT.second, MemVT.getSimpleVT());
+      else
+        LA = getTLI()->getLoadExtAction(ISD::EXTLOAD, MemVT.getSimpleVT());
+    }
 
     if (LA != TargetLowering::Legal && LA != TargetLowering::Custom) {
       // This is a vector load/store for some illegal type that is scalarized.
index 40862780faf0860bb5e23454ada37e97080491eb..368f0a73489b7ac6ce20bf4c9fe15c12281a0fff 100644 (file)
@@ -37,6 +37,9 @@ define i32 @loads(i32 %arg) {
   ; CHECK: cost of 1 {{.*}} load
   load <4 x i32>* undef, align 4
 
+  ; CHECK: cost of 46 {{.*}} load
+  load <3 x float>* undef, align 1
+
   ret i32 undef
 }