[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

Benjamin Kramer benny.kra at googlemail.com
Tue Jun 26 00:23:45 PDT 2012


On 26.06.2012, at 09:13, Duncan Sands <baldrick at free.fr> 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
>
> thanks for explaining.  You should really add a testcase testing this: the one
> in the patch just seems to check invoke of undef and invoke of null.  (The lack
> of a testcase was the reason I wasn't sure what you were doing).
>
>>> 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.
>
>>> Finally, doing thus funky intrinsic thing seems a bizarre approach to me,
>>> there has to be a better way.
>>>
>>> I think plenty of people made these remarks already, but I didn't notice
>>> you answering those objections - maybe I just missed it?
>>
>> So let first explain why I proposed this approach. Instcombine cannot modify the
>> CFG, but removing an invoke instruction modifies the CFG.  The problem now is
>> what do I do if I want to remove an invoke statement in instcombine?  You may
>> say you don't.  But then you cannot optimize a bunch of things, including the
>> elimination of useless 'new' calls as I described above.
>> So then I came with the idea of inserting a dummy no-op intrinsic, which will be
>> removed by SimplifyCFG.
>
> The fact you have to jump through hoops in instcombine to do this just tells me
> that you shouldn't be doing it in instcombine.  Please do it somewhere else.
> SimplifyLibCalls would be logical, since this is really a libcall optimization,
> other there is SimplifyCFG.  There's also PruneEH!

SimplifyLibCalls was split out of instcombine so it can be disabled
when targeting a freestanding environment. The targetlibraryinfo
infrastructure fixed this problem and a long-term goal is to merge the
pass back into instcombine. Changing the CFG inside simplifylibcalls
would make this much harder.

- Ben



More information about the llvm-commits mailing list