[llvm-commits] [llvm] r59756 - /llvm/trunk/include/llvm/Intrinsics.td
Bill Wendling
isanbard at gmail.com
Fri Nov 21 14:10:56 PST 2008
On Nov 21, 2008, at 8:54 AM, Chris Lattner wrote:
> On Nov 21, 2008, at 5:56 AM, Duncan Sands wrote:
>
>>> Even if it does,
>>> transforming it the ADDC / ADDO + check probably requires quite a
>>> bit
>>> of work in dag combine. We'd also like to support it in fast-isel. I
>>> think the intrinsics are needed, at least in the short term.
>>
>> Indeed, for the above i33 code you don't get a simple use of the
>> carry
>> flag on x86. I'm sure you used to, so I guess something changed. In
>> any case the fact that you don't get a carry anymore at least proves
>> the
>> fragility of expecting codegen to reliably use a carry! As you
>> say, to
>> make sure this happens consistently requires some work. That said,
>> boosting
>> the power of integer codegen is a win for everyone, while using an
>> intrinsic
>> for overflow only helps those who use it.
>
> I completely agree that improving general integer codegen is useful.
> However, LLVM has long needed the ability to reason about integer
> overflow in general, and I don't think that i33 will solve all the
> problems :). How do you do a signed add/sub, unsigned/signed mul,
> etc?
>
I had an idea over lunch which may or may not be good. Here it is
though.
What if we add a new LLVM instruction, called, say, "flag". It would
be similar to the icmp instruction, but unary instead of binary. It
would take a mnemonic operator for a flag and an arithmetic expression
as its arguments. Here's an example:
%sum = add i32 %v1, %v2
%of = flag of i32 %sum
br i1 %of, label %overflow, label %normal
Here, the "flag" command is checking to see if the addition
overflowed. We can also have underflow, carry, zero, etc. flags
returned. The code generator can then lower these calls like it does
now.
Benefits:
- It explicitly models checking for overflow, underflow, etc.
without needing to use large integer bit widths or doing messy
arithmetic that complicates the DAG combiner.
- It's extensible. I.e., new flags can be tested easily without
drastically
changing to the IR.
- It's easy for code gen to know what's happening here so it can try
to produce good code.
Drawbacks:
- Code motion can mess up the flags. For instance, another arithmetic
expression could be shoved in between the "add" and "flag"
instructions
here, thus making a save of the flag necessary (because the hardware
flag would be changed by the moved arithmetic expression). However,
I think that all of the other proposed ideas suffer from this same
problem.
- All of the passes will have to learn about this new instruction.
Comments?
-bw
More information about the llvm-commits
mailing list