diff --git a/llvm/include/llvm/CodeGen/BasicTTIImpl.h b/llvm/include/llvm/CodeGen/BasicTTIImpl.h index fcc8202f3bd873..9b116a8c65544a 100644 --- a/llvm/include/llvm/CodeGen/BasicTTIImpl.h +++ b/llvm/include/llvm/CodeGen/BasicTTIImpl.h @@ -1214,7 +1214,7 @@ class BasicTTIImplBase : public TargetTransformInfoImplCRTPBase { // // TODO: Note that legalization can turn masked loads/stores into unmasked // (legalized) loads/stores. This can be reflected in the cost. - if (VecTySize > VecTyLTSize) { + if (Cost.isValid() && VecTySize > VecTyLTSize) { // The number of loads of a legal type it will take to represent a load // of the unlegalized vector type. unsigned NumLegalInsts = divideCeil(VecTySize, VecTyLTSize); @@ -1231,7 +1231,8 @@ class BasicTTIImplBase : public TargetTransformInfoImplCRTPBase { // Scale the cost of the load by the fraction of legal instructions that // will be used. - Cost *= UsedInsts.count() / NumLegalInsts; + Cost = divideCeil(UsedInsts.count() * Cost.getValue().getValue(), + NumLegalInsts); } // Then plus the cost of interleave operation. diff --git a/llvm/test/Transforms/LoopVectorize/AArch64/interleaved_cost.ll b/llvm/test/Transforms/LoopVectorize/AArch64/interleaved_cost.ll index 54ee8fc6e73fd3..2b28a8ecf21296 100644 --- a/llvm/test/Transforms/LoopVectorize/AArch64/interleaved_cost.ll +++ b/llvm/test/Transforms/LoopVectorize/AArch64/interleaved_cost.ll @@ -168,7 +168,7 @@ entry: ; gaps. ; ; VF_2-LABEL: Checking a loop in "i64_factor_8" -; VF_2: Found an estimated cost of 6 for VF 2 For instruction: %tmp2 = load i64, i64* %tmp0, align 8 +; VF_2: Found an estimated cost of 10 for VF 2 For instruction: %tmp2 = load i64, i64* %tmp0, align 8 ; VF_2-NEXT: Found an estimated cost of 0 for VF 2 For instruction: %tmp3 = load i64, i64* %tmp1, align 8 ; VF_2-NEXT: Found an estimated cost of 7 for VF 2 For instruction: store i64 0, i64* %tmp0, align 8 ; VF_2-NEXT: Found an estimated cost of 7 for VF 2 For instruction: store i64 0, i64* %tmp1, align 8