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

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Priority|P3                          |P1
                 CC|                            |vmakarov at gcc dot gnu.org

--- Comment #7 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Looks like a RA bug to me.
At least in *.ira we have above the test for the second printf:
(insn 171 170 316 24 (set (reg/v:QI 122 [ x ])
        (not:QI (subreg:QI (reg:SI 201) 0))) pr69377.c:64 504 {*one_cmplqi2_1}
     (expr_list:REG_DEAD (reg:SI 201)
        (nil)))
(insn 316 171 172 24 (set (reg:HI 224 [ u.3_64 ])  
        (mem/c:HI (symbol_ref:SI ("u") [flags 0x2]  <var_decl 0x7fefb81f2120
u>) [2 u+0 S2 A16])) 88 {*movhi_internal}
     (nil))
(insn 172 316 173 24 (set (reg:CCGC 17 flags)
        (compare:CCGC (reg/v:QI 156 [ x ])
            (reg/v:QI 122 [ x ]))) pr69377.c:65 5 {*cmpqi_1}
     (expr_list:REG_DEAD (reg/v:QI 156 [ x ])
        (nil)))
(jump_insn 173 172 174 24 (set (pc)
        (if_then_else (le (reg:CCGC 17 flags)
                (const_int 0 [0]))
            (label_ref:SI 180)
            (pc))) pr69377.c:65 633 {*jcc_1}
     (expr_list:REG_DEAD (reg:CCGC 17 flags)
        (int_list:REG_BR_PROB 7100 (nil)))
 -> 180)
but *.reload turns it into:
(insn 457 170 171 26 (set (reg/v:QI 0 ax [orig:122 x ] [122])
        (reg:QI 1 dx [201])) pr69377.c:64 89 {*movqi_internal}
     (nil))
(insn 171 457 458 26 (set (reg/v:QI 0 ax [orig:122 x ] [122])
        (not:QI (reg/v:QI 0 ax [orig:122 x ] [122]))) pr69377.c:64 504
{*one_cmplqi2_1}
     (nil))
(insn 458 171 509 26 (set (reg/v:QI 1 dx [orig:156 x ] [156])
        (reg/v:QI 0 ax [orig:122 x ] [122])) pr69377.c:64 89 {*movqi_internal}
     (nil))
(insn 509 458 316 26 (set (mem/c:QI (plus:SI (reg/f:SI 7 sp)
                (const_int 8 [0x8])) [5 %sfp+-24 S1 A32])   
        (reg/v:QI 1 dx [orig:156 x ] [156])) pr69377.c:64 89 {*movqi_internal}
     (nil))
(insn 316 509 499 26 (set (reg:HI 0 ax [orig:224 u.3_64 ] [224])
        (mem/c:HI (symbol_ref:SI ("u") [flags 0x2]  <var_decl 0x7fefb81f2120
u>) [2 u+0 S2 A16])) 88 {*movhi_internal}
     (nil))
(insn 499 316 172 26 (set (reg/v:QI 3 bx [orig:156 x ] [156])
        (reg/v:QI 1 dx [orig:156 x ] [156])) pr69377.c:65 89 {*movqi_internal}
     (nil))
(insn 172 499 173 26 (set (reg:CCGC 17 flags)
        (compare:CCGC (reg/v:QI 3 bx [orig:156 x ] [156])
            (reg/v:QI 3 bx [orig:156 x ] [156]))) pr69377.c:65 5 {*cmpqi_1}
     (nil))
(jump_insn 173 172 174 26 (set (pc)
        (if_then_else (le (reg:CCGC 17 flags)
                (const_int 0 [0]))
            (label_ref:SI 180)
            (pc))) pr69377.c:65 633 {*jcc_1}
     (int_list:REG_BR_PROB 7100 (nil))
 -> 180)
Thus in the end we compare a QImode register with itself, while the source has:
            c = x;
            z = -y;
            t1 = (j && y << c) + k || x;
            x = ~(u % p);
            if (x < c)
and thus we want to compare the older value of x with completely different
value.

Reply via email to