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

Haidl, Michael via llvm-dev llvm-dev at lists.llvm.org
Thu Sep 14 00:12:33 PDT 2017


Hi Craig,

until Simon answers, I have implemented the opt in DAGCombiner. How do I 
test this change to avoid regressions?

Cheers,
Michael

Am 14.09.2017 um 07:23 schrieb Craig Topper:
> Probably in visitMUL in DAGCombiner.cpp to be target independent. Or in 
> LowerMUL in X86ISelLowering.cpp to be X86 specific.
> 
> Adding Simon. Simon, which were you thinking?
> 
> ~Craig
> 
> On Wed, Sep 13, 2017 at 10:06 PM, Haidl, Michael 
> <michael.haidl at uni-muenster.de <mailto:michael.haidl at uni-muenster.de>> 
> wrote:
> 
>     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>
>     > <mailto: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>
>     <mailto: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>
>     <mailto: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>
>     <mailto: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>
>      >           
>       <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