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