[llvm-dev] How to add optimizations to InstCombine correctly?

Haidl, Michael via llvm-dev llvm-dev at lists.llvm.org
Wed Sep 13 22:06:56 PDT 2017


Hi Craig,

thanks for digging into this. So InstCombine is the wrong place for 
fixing PR34474. Can you give me a hint where such an optimization should 
go into CodeGen? I am not really familiar with stuff that happens after 
the MidLevel.

Cheers,
Michael

Am 13.09.2017 um 19:21 schrieb Craig Topper:
> And that is less instructions. So from InstCombine's perspective the 
> multiply is the correct answer. I think this transformation is better 
> left to codegen where we know whether multiply or shift is truly better.
> 
> ~Craig
> 
> On Wed, Sep 13, 2017 at 10:18 AM, Craig Topper <craig.topper at gmail.com 
> <mailto:craig.topper at gmail.com>> wrote:
> 
>     There is in fact a transform out there somewhere that reverses yours.
> 
>     define i64 @foo(i64 %a) {
>        %b = shl i64 %a, 5
>        %c = add i64 %b, %a
>        ret i64 %c
>     }
> 
>     becomes
> 
>     define i64 @foo(i64 %a) {
> 
>     %c = mul i64 %a, 33
> 
>     ret i64 %c
> 
>     }
> 
> 
>     ~Craig
> 
>     On Wed, Sep 13, 2017 at 10:11 AM, Craig Topper
>     <craig.topper at gmail.com <mailto:craig.topper at gmail.com>> wrote:
> 
>         Your code seems fine. InstCombine can infinite loop if some
>         other transform is reversing your transform. Can you send the
>         whole patch and a test case?
> 
>         ~Craig
> 
>         On Wed, Sep 13, 2017 at 10:01 AM, Haidl, Michael via llvm-dev
>         <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
> 
>             Hi,
> 
>             I am working on PR34474 and try to add a new optimization to
>             InstCombine. Like in other parts of the visitMul function I
>             add a Shl
>             through the IR builder and create a new BinaryOp which I
>             return from
>             visitMul. If I understand correctly the new BinaryOp
>             returned from
>             visitMul should replace the original Instruction in the
>             Worklist.
>             However, I end up in an infinite loop and the Instruction I
>             try to
>             replace gets scheduled again and again. What is wrong in my
>             code?
> 
>             // Replace X * (2^C+/-1) with (X << C) -/+ X
>             APInt Plus1 = *IVal + 1;
>             APInt Minus1 = *IVal - 1;
>             int isPow2 = Plus1.isPowerOf2() ? 1 : Minus1.isPowerOf2() ?
>             -1 : 0;
> 
>             if (isPow2) {
>                 APInt &Pow2 = isPow2 > 0 ? Plus1 : Minus1;
>                 Value *Shl = Builder.CreateShl(Op0, Pow2.logBase2());
>                 return BinaryOperator::Create(isPow2 > 0 ?
>             BinaryOperator::Sub :
>             BinaryOperator::Add, Shl, Op0);
>             }
> 
>             Thanks,
>             Michael
>             _______________________________________________
>             LLVM Developers mailing list
>             llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
>             http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>             <http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev>
> 
> 
> 
> 


More information about the llvm-dev mailing list