[LLVMdev] 65bit integer math
Dan Gohman
gohman at apple.com
Tue Oct 13 10:06:23 PDT 2009
On Oct 12, 2009, at 9:42 PM, Jeffrey Yasskin wrote:
> On Mon, Oct 12, 2009 at 8:22 PM, Eli Friedman
> <eli.friedman at gmail.com> wrote:
>> On Mon, Oct 12, 2009 at 6:15 PM, Villmow, Micah <Micah.Villmow at amd.com
>> > wrote:
>>> I have a test case(attached as fc_long.ll) that when run through the
>>> optimizer produces 65bit integer math(fc_long-opt.ll).
>>>
>>>
>>>
>>> Now I understand that llvm can have any length integer, but I
>>> consider
>>> turning a 64bit mul into multiple 65 bit instructions to be a ‘bad’
>>> optimization. This eventually expands to a 128bit multiply call
>>> (__multi3)
>>> which I have absolutely no interest in supporting. So I’m
>>> wondering what
>>> optimization might be the culprit here so I can disable it in this
>>> situation.
>>
>> I'm pretty sure this is the fault of one of the loop passes (I forget
>> which one off the top of my head). It's worth noting that the
>> optimizer manages to eliminate the loop; computing the exit value of
>> one of the loop variables uses the wide multiply.
>
> It's -indvars. I ran mem2reg, instcombine, and simplifycfg on your
> input and got the attached file. I thought I could add "nuw nsw" to
> the arithmetic inside the loop to say that i65 is unnecessary, but
> that doesn't cause indvars to leave the arithmetic at i64. Is that a
> bug in indvars, or in SCEV, or is this just a natural limitation of
> SCEV?
LLVM's ScalarEvolution's handling of non-linear recurrences has much
room
for improvement. The problem Micah describes sounds like the one
in lib/Analysis/README.txt.
Dan
More information about the llvm-dev
mailing list