Question about __builtin_add_overflow and friends

Scotty sbauer@eng.utah.edu
Thu Apr 23 16:33:00 GMT 2015



On 04/23/2015 09:47 AM, Martin Sebor wrote:
> On 04/22/2015 11:42 PM, Scotty wrote:
>> This link https://gcc.gnu.org/onlinedocs/gcc/Integer-Overflow-Builtins.html says "As the addition is performed in infinite signed precision, these built-in functions have fully defined behavior for all argument values. "
>>
>> I'm curious if these types of builtins are well defined for things like the following:
>>
>> int a, b;
>> a = 5;
>> b = 10;
>> __builtin_add_overflow(a,b,&a);
> 
> Note that in cases like this one where the operands values are
> known to the compiler the entire computation is optimized into
> a straight assignment (i.e., the addition and the overflow
> checking is done during compilation).
> 
>>
>> Notice the re-use of the variable a. I'm wondering if there is a sequencing issue and we need to use a third variable for the storage or if this is fine as well.
> 
> The text in the manual seems fairly clear that the computation
> is performed on the promoted operands (i.e., not on the operands
> themselves) and that the result is stored in the destination after
> the computation.
> 
> Compiling an example program and examining the debug dumps from
> the compiler output with the -fdump-tree-all option or the
> generated assembly bears this out. The operands are copied into
> temporaries (registers) first, the computation is done on those,
> and when its complete the result is cast to the destination type
> (if necessary) and copied into the destination location.
> 
> I think the concern might perhaps be justified if the computation
> were to be done in software, but since it's done in hardware (and
> thus on copies of the operands) there is no issue.

Thank you this is exactly what I was looking for. 
 
> Martin
> 



More information about the Gcc-help mailing list