On 5/8/19 6:28 AM, Richard Biener wrote:
> On Wed, May 8, 2019 at 12:09 PM JunMa <ju...@linux.alibaba.com> wrote:
>>
>> Hi
>>
>> As PR90106 (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90106),
>> when gcc meets builtin function call like:
>>
>>    y = sqrt (x);
>>
>> The cdce pass tries to transform the call into an internal function
>> call and conditionally executes call with a simple range check on the
>> arguments which can detect most cases and the errno does not need
>> to be set. It looks like:
>>
>>    y = IFN_SQRT (x);
>>    if (__builtin_isless (x, 0))
>>      sqrt (x);
>>
>> However, If the call is in tail position, for example:
>>
>>    y =  sqrt (x);
>>    return y;
>>
>> will become:
>>
>>    y = IFN_SQRT (x);
>>    if (__builtin_isless (x, 0))
>>      sqrt (x);
>>    return y;
>>
>> This transformation breaks tailcall pattern, and prevents
>> later tailcall optimizations.
>>
>> So This patch transform builtin call with return value into
>> if-then-else part, which looks like:
>>
>>    y =  sqrt (x);
>>     ==>
>>    if (__builtin_isless (x, 0))
>>      y = sqrt (x);
>>    else
>>      y = IFN_SQRT (x);
>>
>> BTW, y = sqrt (x) can also transform like:
>>
>>    y = IFN_SQRT (x);
>>    if (__builtin_isless (x, 0))
>>      y = sqrt (x);
>>
>> We don‘t choose this pattern because it emits worse assemble
>> code(more move instruction and use more registers) in x86_64.
>>
>> Bootstrapped/regtested on x86_64-linux, ok for trunk?
> 
> OK.
JunMa -- do you have a copyright assignment on file and write access to
the repository?  If not we should take care of that before proceeding
further.

Jeff

Reply via email to