[llvm-commits] [llvm] r159146 - in /llvm/trunk: lib/Transforms/InstCombine/InstructionCombining.cpp lib/Transforms/Scalar/SimplifyCFGPass.cpp lib/VMCore/Verifier.cpp test/Transforms/InstCombine/objsize-64.ll test/Transforms/SimplifyCFG/invoke.ll

Nuno Lopes nunoplopes at sapo.pt
Thu Jun 28 09:44:27 PDT 2012


Quoting Chris Lattner <clattner at apple.com>:

> On Jun 26, 2012, at 12:12 AM, Duncan Sands wrote:
>> Hi Nuno,
>>
>>>>>  - instcombine:  invoke new  -> invoke expect(0, 0)  (an arbitrary NOOP
>>>>> intrinsic;  only done if the allocated memory is unused, of course)
>>>>
>>>> What is this about?  If you are saying that malloc is nounwind,  
>>>> why aren't you
>>>> marking it nounwind in SimplifyLibCalls.
>>>
>>> What the code is doing is deleting sequences like:
>>> p = new foo;
>>> .. no real uses of p..
>>> delete p; // optional
>
> I think this sort of thing is an important case that instcombine  
> *should* be able to optimize.  It is sad that we can't do this  
> today.  However, I also don't like Nuno's first try at this. :)
>
>>>> In any case, by removing the restriction that you can't do invoke on an
>>>> intrinsic you are making a major (historically speaking change).   
>>>> It should
>>>> thus be done as part of a different commit, and accompanied with  
>>>> a bunch of
>>>> tests checking that codegen doesn't crash if you try to codegen code that
>>>> does invoke of an intrinsic.
>>
>> You didn't address this point.
>
> This is also the part I don't like.  After thinking about this a  
> bit, the only way I can see to sanely handle this is to have  
> instcombine zap the alloc/delete pair.  Since it can't (and we don't  
> want it to) modify the CFG, I think that it is reasonable for  
> instcombine to zap the alloc by changing the invoke to call a noop  
> intrinsic.
>
> That said, I don't agree that all intrinsics should be valid in an  
> invoke, and I don't agree that the expect intrinsic should be used  
> for this purpose.  Nuno, in  separate patches, how about you do the  
> following:
>
> 1. Introduce an new llvm.undef.result intrinsics, which can be used  
> with arbitrary arguments and return value.  It is fully defined to  
> ignore its argument and return undef.  Codegen should be enhanced to  
> handle it by lowering it to nothing (the results would be lowered to  
> IMPLICIT_DEFs if not dead).
>
> 2. Enhance the verifier etc to allow llvm.undef.result *only* to be  
> used in an invoke instruction.  All the other intrinsics should not  
> be allowed there.  Make sure (i.e. add a test) that codegen handles  
> the intrinsic if it gets to codegen in an invoke.
>
> 3. Teach simplifycfg to zap invoke llvm.undef.result.
>
> 4. Enhance instcombine to do the optimization by "zapping" the alloc  
> by replacing it with an llvm.undef.result.
>
> I'm not super thrilled with the name "llvm.undef.result", but I  
> don't like the name "llvm.noop" (which could be reasonably expected  
> to generate a hardware nop instruction) and don't want to call it  
> "llvm.undef" because it will be confusing and because it is  
> perfectly well defined as an operation, it just produces an  
> undefined result.
>
> Does this seem reasonable?
>
> As a side note, the real villain here is the invoke instruction.   
> Someday we should really kill it  
> (http://nondot.org/sabre/LLVMNotes/ExceptionHandlingChanges.txt) :)
>
> -Chris


Sounds good to me. Start working on it now!
Nuno



More information about the llvm-commits mailing list