<div dir="ltr">Probably in visitMUL in DAGCombiner.cpp to be target independent. Or in LowerMUL in X86ISelLowering.cpp to be X86 specific.<div><br></div><div>Adding Simon. Simon, which were you thinking?</div></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature" data-smartmail="gmail_signature">~Craig</div></div>
<br><div class="gmail_quote">On Wed, Sep 13, 2017 at 10:06 PM, Haidl, Michael <span dir="ltr"><<a href="mailto:michael.haidl@uni-muenster.de" target="_blank">michael.haidl@uni-muenster.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Craig,<br>
<br>
thanks for digging into this. So InstCombine is the wrong place for<br>
fixing PR34474. Can you give me a hint where such an optimization should<br>
go into CodeGen? I am not really familiar with stuff that happens after<br>
the MidLevel.<br>
<br>
Cheers,<br>
Michael<br>
<span class=""><br>
Am 13.09.2017 um 19:21 schrieb Craig Topper:<br>
> And that is less instructions. So from InstCombine's perspective the<br>
> multiply is the correct answer. I think this transformation is better<br>
> left to codegen where we know whether multiply or shift is truly better.<br>
><br>
> ~Craig<br>
><br>
> On Wed, Sep 13, 2017 at 10:18 AM, Craig Topper <<a href="mailto:craig.topper@gmail.com">craig.topper@gmail.com</a><br>
</span><span class="">> <mailto:<a href="mailto:craig.topper@gmail.com">craig.topper@gmail.com</a><wbr>>> wrote:<br>
><br>
>     There is in fact a transform out there somewhere that reverses yours.<br>
><br>
>     define i64 @foo(i64 %a) {<br>
>        %b = shl i64 %a, 5<br>
>        %c = add i64 %b, %a<br>
>        ret i64 %c<br>
>     }<br>
><br>
>     becomes<br>
><br>
>     define i64 @foo(i64 %a) {<br>
><br>
>     %c = mul i64 %a, 33<br>
><br>
>     ret i64 %c<br>
><br>
>     }<br>
><br>
><br>
>     ~Craig<br>
><br>
>     On Wed, Sep 13, 2017 at 10:11 AM, Craig Topper<br>
</span><span class="">>     <<a href="mailto:craig.topper@gmail.com">craig.topper@gmail.com</a> <mailto:<a href="mailto:craig.topper@gmail.com">craig.topper@gmail.com</a><wbr>>> wrote:<br>
><br>
>         Your code seems fine. InstCombine can infinite loop if some<br>
>         other transform is reversing your transform. Can you send the<br>
>         whole patch and a test case?<br>
><br>
>         ~Craig<br>
><br>
>         On Wed, Sep 13, 2017 at 10:01 AM, Haidl, Michael via llvm-dev<br>
</span><div><div class="h5">>         <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a> <mailto:<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.<wbr>org</a>>> wrote:<br>
><br>
>             Hi,<br>
><br>
>             I am working on PR34474 and try to add a new optimization to<br>
>             InstCombine. Like in other parts of the visitMul function I<br>
>             add a Shl<br>
>             through the IR builder and create a new BinaryOp which I<br>
>             return from<br>
>             visitMul. If I understand correctly the new BinaryOp<br>
>             returned from<br>
>             visitMul should replace the original Instruction in the<br>
>             Worklist.<br>
>             However, I end up in an infinite loop and the Instruction I<br>
>             try to<br>
>             replace gets scheduled again and again. What is wrong in my<br>
>             code?<br>
><br>
>             // Replace X * (2^C+/-1) with (X << C) -/+ X<br>
>             APInt Plus1 = *IVal + 1;<br>
>             APInt Minus1 = *IVal - 1;<br>
>             int isPow2 = Plus1.isPowerOf2() ? 1 : Minus1.isPowerOf2() ?<br>
>             -1 : 0;<br>
><br>
>             if (isPow2) {<br>
>                 APInt &Pow2 = isPow2 > 0 ? Plus1 : Minus1;<br>
>                 Value *Shl = Builder.CreateShl(Op0, Pow2.logBase2());<br>
>                 return BinaryOperator::Create(isPow2 > 0 ?<br>
>             BinaryOperator::Sub :<br>
>             BinaryOperator::Add, Shl, Op0);<br>
>             }<br>
><br>
>             Thanks,<br>
>             Michael<br>
>             ______________________________<wbr>_________________<br>
>             LLVM Developers mailing list<br>
</div></div>>             <a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a> <mailto:<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.<wbr>org</a>><br>
>             <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><br>
>             <<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-<wbr>bin/mailman/listinfo/llvm-dev</a>><br>
><br>
><br>
><br>
><br>
</blockquote></div><br></div>