[LLVMdev] Proposal: add intrinsics for safe division
Eric Christopher
echristo at gmail.com
Fri Apr 25 11:47:45 PDT 2014
On Fri, Apr 25, 2014 at 11:15 AM, Eric Christopher <echristo at gmail.com> wrote:
> On Fri, Apr 25, 2014 at 10:48 AM, Reid Kleckner <rnk at google.com> wrote:
>> On Fri, Apr 25, 2014 at 10:19 AM, Filip Pizlo <fpizlo at apple.com> wrote:
>>>
>>> The sdiv operation in LLVM IR only makes sense for C and its very direct
>>> relatives. The amount of control flow necessary to represent a safe
>>> division for any other language is ghastly. (a/b) becomes something like (b
>>> != 0 ? ((a != INT_MIN || b != -1) ? a / b : INT_MIN) : 0). It's more useful
>>> to the optimizer to see this as the single operation that it really is.
>>
>> This argument makes sense to me. It would be hard for the arm64 backend to
>> pattern match all this control flow back into a single instruction after
>> optimizations.
>
> No objections on this point here either - I agree that this makes
> things more verbose for generating IR and that pattern matching it
> back might be difficult (CVP should be able to do it, however...)
>
As an example of a language that has similar but different semantics
for divide I give you Go:
http://golang.org/ref/spec#Arithmetic_operators
Required to trap in the runtime on divide by zero, but required to
return min for type in min/-1.
Thoughts?
-eric
>>
>> Are there ISAs out there that produce different results without trapping for
>> these boundary conditions? Should we leave the quotient result unspecified
>> in the b == 0 || (a == INT_MIN && B == -1) cases? If we do that, we require
>> frontends to check the "overflow" bit if they want deterministic
>> cross-platform behavior.
>
> Agreed, perhaps we want to say "undefined" or "returns the same value"
> or are there other semantics?
>
> -eric
More information about the llvm-dev
mailing list