https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120032

Feng Xue <fxue at os dot amperecomputing.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |fxue at os dot 
amperecomputing.com

--- Comment #8 from Feng Xue <fxue at os dot amperecomputing.com> ---
1. Absorbing 31 substract constant into the array, pattern match fails.

  static const unsigned int DeBruijnClz[32] = {31, 22, 30, 21, 18, 10, 29, 2,
                                               20, 17, 15, 13,  9,  6, 28,  1,
                                               23, 19, 11,  3, 16, 14,  7, 24,
                                               12,  4,  8, 25,  5, 26, 27,  0};
        val |= val >> 1;
        val |= val >> 2;
        val |= val >> 4;
        val |= val >> 8;
        val |= val >> 16;
        return DeBruijnClz[(val * 0x07C4ACDDU) >> 27];

2. Use a value who has same LSB as "val" (other bits are zero) via expression
(val - (val >> 1)), pattern match fails.

  static const unsigned int DeBruijnClz[32] = {0,  1, 10,  2, 11, 14, 22,  3,
                                               30, 12, 15, 17, 19, 23, 26,  4,
                                               31,  9, 13, 21, 29, 16, 18, 25,
                                               8, 20, 28, 24,  7, 27,  6,  5};
        val |= val >> 1;
        val |= val >> 2;
        val |= val >> 4;
        val |= val >> 8;
        val |= val >> 16;
        return 31 - DeBruijnClz[((val - (val >> 1)) * 0x07C4ACDDU) >> 27];

Reply via email to