[PATCH] D16383: Change ConstantFoldInstOperands to take Instruction instead of opcode and type. NFC.
Manuel Jacob via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 9 15:05:46 PST 2016
On 2016-01-26 07:20, Daniel Berlin wrote:
> On Mon, Jan 25, 2016 at 7:04 PM, Manuel Jacob <me at manueljacob.de>
> wrote:
>
>> mjacob added a comment.
>>
>> In http://reviews.llvm.org/D16383#335626, @dberlin wrote:
>>
>> > Hi Manuel,
>> >
>> > Things like NewGVN don't always have instruction *'s to hand to
>> ConstantFoldInstOperands.
>> >
>> > For example, we create an expression that stores operands and opcodes
>> and such (like GVN does!)
>> >
>> > Before, we could pass the opcode and operands, and that worked great.
>> >
>> > Now you've made it take the Instruction.
>>
>>
>> Sorry for making difficulties.\
>>
>
> It happens :)
>
>
>>
>> > I don't see how this makes anything related to opaque pointers easier,
>> maybe you could enlighten me?
>>
>>
>> The problem is getelementptr. With opaque pointers, we must have the
>> instruction to get the source element type. Currently this is possible
>> by
>> getting the pointee type of the first (pointer) operand of the GEP.
>> This
>> won't be possibly with opaque pointers.
>>
>>
> But it's also not possible for comparisons, so it's just "another thing
> that it doesn't work on". That's fine :)
>
>> Additionally, i can't see how use cases like mine are supposed to
>> function - i have what was an instruction, but is now an operation and
>> some
>> operands.
>>
>> > I want to see if it will fold to a constant.
>>
>> >
>>
>> > What API am i expected to use to do so?
>>
>> >
>>
>> > Note also that the InstOperands API was *explicitly* designed to not
>> require an instruction, to support the above use case. This was the
>> difference between ConstantFoldInst and ConstantFoldInstOperands. It
>> happens most users can pass it instructions, but that doesn't , IMHO
>> make a
>> lot of sense.
>>
>>
>> ConstantFoldInstOperands constant folds the given instruction **but
>> with
>> the specified operands**. If I understand correctly, you still have
>> the
>> instruction available.
>>
>>
> I do *not* have the instruction available.
> I have it's opcode, operands, type, etc.
> (For geps, i have the source element type as well ).
> But i don't have the original instruction, and in fact, there isn't
> alwas
> a mapping
Looking at commit 9a08577cb28fabfb4aa8509f73fc4411aba1f81b in your
gvn-rewrite fork, adapting your code seemed to be straightforward. I'm
happy to re-add the form taking opcode and result type to not hinder
your ongoing work, but please don't complain if I restart the discussion
after you have upstreamed the new GVN pass. ;)
>> I want to request that you provide some way to not require the
>> instruction, as the current API does (and many users use!), so that
>> folks
>> can use this without creating fake instructions to do so.
>>
>>
>> The problem with such an API is that it doesn't work with
>> getelementptr
>> (and not with comparison instructions, as it was not possible before
>> this
>> patch). I think that most use cases are covered by already existing
>> functions.
>>
>>
> Sure, but constantfoldinstoperands handled dispatching to those
> functions,
> otherwise, you have to write and update a dispatch function constantly.
>
> 1. The user wants to fold an instruction but with other operands (e.g.
>> because they were constant-folded by the user).
>> ConstantFoldInstOperands
>> should work here.
>
> What if i want to fold a generic operation without having to worry
> about
> whether it is specifically a binary op, cast, etc.
>
> You've basically pushed all that logic/work into the callers, where it
> will
> be duplicated.
This is exactly what I wanted to avoid with this change. Instead of
pushing the checks for GEPs to the caller (as it's already necessary for
comparisons) I changed the interface to take an instruction, which made
sense for all in-tree users, and I have not yet seen out-of-tree code
where this is currently a problem.
-Manuel
> 2. The user wants to fold a binary operation or cast. I added functions
> for
>> this in http://reviews.llvm.org/rL258389 and
>> http://reviews.llvm.org/rL258390.
>>
>> There is no API for the case when the user has a random instruction
>> opcode
>> but no instruction. I don't think that adding a function for this case
>> which however doesn't work with getelementptr and compares is very
>> helpful
>> in this case.
>>
>
> I'm going to pretty strongly disagree. Not everything in LLVM
> necessarily
> has an instruction associated with it yet.
>
> Things like PRE, etc, often have a bunch of operands an opcode, and
> want to
> know what will happen. Before you rpatch, this was easy.
>
> Now, it's literally impossible to get *any* results (instead of just
> "give
> me the results you can").
>
> That seems like a pretty bad API regression.
More information about the llvm-commits
mailing list