[llvm-dev] multiprecision add/sub
Bagel via llvm-dev
llvm-dev at lists.llvm.org
Tue Mar 14 10:38:50 PDT 2017
My use case is multi-precision arithmetic which is key to efficient
implementation of public-key encryption. Take the follow routine:
void addm(unsigned *x, unsigned *y, unsigned *z, unsigned n)
{ unsigned carryin;
unsigned carryout = 0;
unsigned i;
for (i=0; i<n; i++)
{ carryin = carryout;
z[i] = __builtin_addc(x[i], y[i], carryin, &carryout);
}
}
If one looks at the clang IR generated, there are *four* instances of
"llvm.uadd.with.overflow" in the loop. Somehow this has to be optimized to a
*single* machine instruction add-with-carry.
This isn't currently done (the code for x86-64 is horrible). I think
optimization would be much more simple if the four "llvm.uadd.with.overflow"
were replaced with a single "llvm.addc".
On 03/14/2017 08:45 AM, Nemanja Ivanovic wrote:
> Sorry for the delay in responding.
> The use case is basically for being able to emit instructions that correspond
> to these nodes. For example on Power, we use these instructions that set and
> use the Carry bit for comparisons without using compare instructions.
> One example where we would be able to make use of these would be in
> https://reviews.llvm.org/D28637.
>
> On Tue, Mar 7, 2017 at 7:56 AM, Mehdi Amini <mehdi.amini at apple.com
> <mailto:mehdi.amini at apple.com>> wrote:
>
>
>> On Feb 21, 2017, at 9:54 PM, Nemanja Ivanovic via llvm-dev
>> <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
>>
>> I believe that providing additional intrinsics that would directly
>> produce the ISD::ADDC/ISD::SUBC nodes would provide the additional
>> advantage of being able to directly produce these nodes for code that
>> doesn't have anything to do with multiprecision addition/subtraction. I
>> am not aware of any way currently available to produce IR that will
>> generate these nodes directly.
>
> But what is the use case? What IR pattern it would replace?
>
> —
> Mehdi
>
>
>
>
>>
>> On Fri, Feb 17, 2017 at 8:52 PM, Bagel via llvm-dev
>> <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
>>
>> On 02/16/2017 12:08 PM, Stephen Canon wrote:
>> >> On Feb 16, 2017, at 9:12 AM, Bagel <bagel99 at gmail.com <mailto:bagel99 at gmail.com>
>> >> <mailto:bagel99 at gmail.com <mailto:bagel99 at gmail.com>>> wrote:
>> >>
>> >> I figured that the optimization of this would bedifficult (else it would
>> >> have already been done :-))
>> >
>> > Don’t make this assumption. There’s lots of opportunities for optimization
>> > scattered around. Some of them are left because they’re genuinely difficult,
>> > but most either simply haven’t been noticed by anyone, or are known but simply
>> > haven’t been done because no one has pushed for them (I’m fairly sure that this
>> > particular optimization falls into that category—folks have known the codegen
>> > wasn't great since these intrinsics were added, but no one has really
>> > complained about it, so people have worked on higher-impact stuff).
>>
>> But I am still curious as to whether the optimization is architecture
>> independent or must be done again for each backend?
>>
>> bagel
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>> <http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev>
>>
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>> <http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev>
>
>
More information about the llvm-dev
mailing list