<div dir="ltr">Sorry for the breakage. I just returned from vacation and will take a look. Thanks for the test case.<div><br></div><div>-- Matt</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, May 26, 2017 at 11:22 PM, Yung, Douglas via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Matthew,<br>
<br>
Your commit seems to have caused a crash in one of our internal code bases. I have filed the details in PR33193. Can you take a look?<br>
<br>
Douglas Yung<br>
<div><div class="h5"><br>
> -----Original Message-----<br>
> From: llvm-commits [mailto:<a href="mailto:llvm-commits-bounces@lists.llvm.org">llvm-commits-bounces@<wbr>lists.llvm.org</a>] On Behalf Of<br>
> Matthew Simpson via llvm-commits<br>
> Sent: Wednesday, May 24, 2017 8:26<br>
> To: <a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
> Subject: [llvm] r303763 - [LV] Update type in cost model for scalarization<br>
><br>
> Author: mssimpso<br>
> Date: Wed May 24 10:26:15 2017<br>
> New Revision: 303763<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=303763&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=303763&view=rev</a><br>
> Log:<br>
> [LV] Update type in cost model for scalarization<br>
><br>
> For non-uniform instructions marked for scalarization, we should update<br>
> `VectorTy` when computing instruction costs to reflect the scalar type. In<br>
> addition to determining instruction costs, this type is also used to signal<br>
> that all instructions in the loop will be scalarized. This currently affects<br>
> memory instructions and non-pointer induction variables and their updates. (We<br>
> also mark GEPs scalar after vectorization, but their cost is computed together<br>
> with memory instructions.) For scalarized induction updates, this patch also<br>
> scales the scalar cost by the vectorization factor, corresponding to each<br>
> induction step.<br>
><br>
> Added:<br>
>     llvm/trunk/test/Transforms/<wbr>LoopVectorize/AArch64/no_<wbr>vector_instructions.ll<br>
> Modified:<br>
>     llvm/trunk/lib/Transforms/<wbr>Vectorize/LoopVectorize.cpp<br>
><br>
> Modified: llvm/trunk/lib/Transforms/<wbr>Vectorize/LoopVectorize.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-</a><br>
> project/llvm/trunk/lib/<wbr>Transforms/Vectorize/<wbr>LoopVectorize.cpp?rev=303763&<wbr>r1=30<br>
> 3762&r2=303763&view=diff<br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- llvm/trunk/lib/Transforms/<wbr>Vectorize/LoopVectorize.cpp (original)<br>
> +++ llvm/trunk/lib/Transforms/<wbr>Vectorize/LoopVectorize.cpp Wed May 24<br>
</div></div>> +++ 10:26:15 2017<br>
<span class="">> @@ -7173,7 +7173,7 @@ LoopVectorizationCostModel::<wbr>getInstructi<br>
>    // Note: Even if all instructions are scalarized, return true if any memory<br>
>    // accesses appear in the loop to get benefits from address folding etc.<br>
>    bool TypeNotScalarized =<br>
> -      VF > 1 && !VectorTy->isVoidTy() && TTI.getNumberOfParts(VectorTy) < VF;<br>
> +      VF > 1 && VectorTy->isVectorTy() &&<br>
</span>> + TTI.getNumberOfParts(VectorTy) < VF;<br>
<span class="">>    return VectorizationCostTy(C, TypeNotScalarized);  }<br>
><br>
> @@ -7312,7 +7312,7 @@ unsigned LoopVectorizationCostModel::<wbr>get<br>
>    Type *RetTy = I->getType();<br>
>    if (canTruncateToMinimalBitwidth(<wbr>I, VF))<br>
>      RetTy = IntegerType::get(RetTy-><wbr>getContext(), MinBWs[I]);<br>
> -  VectorTy = ToVectorTy(RetTy, VF);<br>
> +  VectorTy = isScalarAfterVectorization(I, VF) ? RetTy :<br>
</span>> + ToVectorTy(RetTy, VF);<br>
<span class="">>    auto SE = PSE.getSE();<br>
><br>
>    // TODO: We need to estimate the cost of intrinsic calls.<br>
> @@ -7445,9 +7445,10 @@ unsigned LoopVectorizationCostModel::<wbr>get<br>
>      } else if (Legal->isUniform(Op2)) {<br>
>        Op2VK = TargetTransformInfo::OK_<wbr>UniformValue;<br>
>      }<br>
> -    SmallVector<const Value *, 4> Operands(I->operand_values());<br>
> -    return TTI.getArithmeticInstrCost(I-><wbr>getOpcode(), VectorTy, Op1VK,<br>
> -                                      Op2VK, Op1VP, Op2VP, Operands);<br>
> +    SmallVector<const Value *, 4> Operands(I->operand_values());<br>
> +    unsigned N = isScalarAfterVectorization(I, VF) ? VF : 1;<br>
> +    return N * TTI.getArithmeticInstrCost(I-><wbr>getOpcode(), VectorTy, Op1VK,<br>
> +                                          Op2VK, Op1VP, Op2VP,<br>
</span>> + Operands);<br>
<div><div class="h5">>    }<br>
>    case Instruction::Select: {<br>
>      SelectInst *SI = cast<SelectInst>(I); @@ -7470,7 +7471,15 @@ unsigned<br>
> LoopVectorizationCostModel::<wbr>get<br>
>    }<br>
>    case Instruction::Store:<br>
>    case Instruction::Load: {<br>
> -    VectorTy = ToVectorTy(<wbr>getMemInstValueType(I), VF);<br>
> +    unsigned Width = VF;<br>
> +    if (Width > 1) {<br>
> +      InstWidening Decision = getWideningDecision(I, Width);<br>
> +      assert(Decision != CM_Unknown &&<br>
> +             "CM decision should be taken at this point");<br>
> +      if (Decision == CM_Scalarize)<br>
> +        Width = 1;<br>
> +    }<br>
> +    VectorTy = ToVectorTy(<wbr>getMemInstValueType(I), Width);<br>
>      return getMemoryInstructionCost(I, VF);<br>
>    }<br>
>    case Instruction::ZExt:<br>
><br>
> Added:<br>
> llvm/trunk/test/Transforms/<wbr>LoopVectorize/AArch64/no_<wbr>vector_instructions.ll<br>
> URL: <a href="http://llvm.org/viewvc/llvm-" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-</a><br>
> project/llvm/trunk/test/<wbr>Transforms/LoopVectorize/<wbr>AArch64/no_vector_instruction<br>
> s.ll?rev=303763&view=auto<br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- llvm/trunk/test/Transforms/<wbr>LoopVectorize/AArch64/no_<wbr>vector_instructions.ll<br>
> (added)<br>
> +++ llvm/trunk/test/Transforms/<wbr>LoopVectorize/AArch64/no_<wbr>vector_instructi<br>
</div></div>> +++ ons.ll Wed May 24 10:26:15 2017<br>
<span class="">> @@ -0,0 +1,26 @@<br>
> +; REQUIRES: asserts<br>
> +; RUN: opt < %s -loop-vectorize -force-vector-interleave=1 -S<br>
</span>> +-debug-only=loop-vectorize 2>&1 | FileCheck %s<br>
<div class="HOEnZb"><div class="h5">> +<br>
> +target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:<wbr>64-i128:128-n32:64-S128"<br>
> +target triple = "aarch64--linux-gnu"<br>
> +<br>
> +; CHECK-LABEL: all_scalar<br>
> +; CHECK:       LV: Found scalar instruction: %i.next = add nuw nsw i64 %i, 2<br>
> +; CHECK:       LV: Found an estimated cost of 2 for VF 2 For instruction:<br>
> %i.next = add nuw nsw i64 %i, 2<br>
> +; CHECK:       LV: Not considering vector loop of width 2 because it will not<br>
> generate any vector instructions<br>
> +;<br>
> +define void @all_scalar(i64* %a, i64 %n) {<br>
> +entry:<br>
> +  br label %for.body<br>
> +<br>
> +for.body:<br>
> +  %i = phi i64 [ 0, %entry ], [ %i.next, %for.body ]<br>
> +  %tmp0 = getelementptr i64, i64* %a, i64 %i<br>
> +  store i64 0, i64* %tmp0, align 1<br>
> +  %i.next = add nuw nsw i64 %i, 2<br>
> +  %cond = icmp eq i64 %i.next, %n<br>
> +  br i1 %cond, label %for.end, label %for.body<br>
> +<br>
> +for.end:<br>
> +  ret void<br>
> +}<br>
><br>
><br>
> ______________________________<wbr>_________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</div></div></blockquote></div><br></div>