[ARM] Fix for MVE i128 vector icmp costs.
authorDavid Green <david.green@arm.com>
Fri, 14 Oct 2022 17:49:25 +0000 (18:49 +0100)
committerDavid Green <david.green@arm.com>
Fri, 14 Oct 2022 17:49:25 +0000 (18:49 +0100)
We were hitting an assert as the legalied type needn't be a vector.

Fixes #58364

llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp
llvm/test/Analysis/CostModel/ARM/mve-cmp.ll

index 6ea6073..06cbe34 100644 (file)
@@ -1034,7 +1034,7 @@ InstructionCost ARMTTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
     // split, we may need an expensive shuffle to get two in sync. This has the
     // effect of making larger than legal compares (v8i32 for example)
     // expensive.
-    if (LT.second.getVectorNumElements() > 2) {
+    if (LT.second.isVector() && LT.second.getVectorNumElements() > 2) {
       if (LT.first > 1)
         return LT.first * BaseCost +
                BaseT::getScalarizationOverhead(VecCondTy, true, false);
index 1f9eac6..fa1cf17 100644 (file)
@@ -22,6 +22,8 @@ define void @icmp() {
 ; CHECK-NEXT:  Cost Model: Found an estimated cost of 36 for instruction: %v2i64 = icmp slt <2 x i64> undef, undef
 ; CHECK-NEXT:  Cost Model: Found an estimated cost of 72 for instruction: %v4i64 = icmp slt <4 x i64> undef, undef
 ; CHECK-NEXT:  Cost Model: Found an estimated cost of 144 for instruction: %v8i64 = icmp slt <8 x i64> undef, undef
+; CHECK-NEXT:  Cost Model: Found an estimated cost of 68 for instruction: %v2i128 = icmp slt <2 x i128> undef, undef
+; CHECK-NEXT:  Cost Model: Found an estimated cost of 136 for instruction: %v4i128 = icmp slt <4 x i128> undef, undef
 ; CHECK-NEXT:  Cost Model: Found an estimated cost of 0 for instruction: ret void
 ;
   %v2i8 = icmp slt <2 x i8> undef, undef
@@ -44,6 +46,9 @@ define void @icmp() {
   %v4i64 = icmp slt <4 x i64> undef, undef
   %v8i64 = icmp slt <8 x i64> undef, undef
 
+  %v2i128 = icmp slt <2 x i128> undef, undef
+  %v4i128 = icmp slt <4 x i128> undef, undef
+
   ret void
 }