[Bug target/100694] PPC: initialization of __int128 is very inefficient

guihaoc at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Mon Jul 25 08:22:08 GMT 2022


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

HaoChen Gui <guihaoc at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |guihaoc at gcc dot gnu.org

--- Comment #5 from HaoChen Gui <guihaoc at gcc dot gnu.org> ---
(In reply to Segher Boessenkool from comment #4)
> On aarch64 we have (in expand):
> 
> ;; i_4 = i_3 << 64;
> 
> (insn 10 9 11 (set (subreg:DI (reg/v:TI 94 [ i ]) 8)
>         (subreg:DI (reg/v:TI 93 [ i ]) 0)) "100694.c":4:6 -1
>      (nil))
> 
> (insn 11 10 0 (set (subreg:DI (reg/v:TI 94 [ i ]) 0)
>         (const_int 0 [0])) "100694.c":4:6 -1
>      (nil))
> 
> But on rs6000 we get:
> 
> ;; i_4 = i_3 << 64;
> 
> (insn 10 9 11 (set (subreg:DI (reg/v:TI 119 [ i ]) 0)
>         (ashift:DI (subreg:DI (reg/v:TI 118 [ i ]) 8)
>             (const_int 0 [0]))) "100694.c":4:6 -1
>      (nil))
> 
> (insn 11 10 0 (set (subreg:DI (reg/v:TI 119 [ i ]) 8)
>         (const_int 0 [0])) "100694.c":4:6 -1
>      (nil))
> 
> What the what.

On rs6000, the insn 10 is optimized at forward propagation pass.
test.c.261r.fwprop1:
(insn 10 5 11 2 (set (subreg:DI (reg/v:TI 119 [ i ]) 8)
        (reg/v:DI 122 [ hi ])) "test.c":4:6 670 {*movdi_internal64}
     (expr_list:REG_DEAD (reg:DI 126 [ i ])

Seems aarch64 optimizes it at expand pass.

Now the problem is "ior" operation is done with TImode on rs6000 while it is
done with two subreg:DI on aarch64.  The subreg pass can decomposes the
register which is always used by subreg. If the ior is done with two subreg:DI
on rs6000, it can be optimized by subreg pass. 

on rs6000:
(insn 14 13 15 2 (set (reg:TI 125 [ i ])
        (ior:TI (reg:TI 124 [ lo ])
            (reg/v:TI 119 [ i ]))) "test.c":5:6 494 {*boolti3_internal}

on aarch64
(insn 21 20 22 2 (set (reg:DI 100)
        (ior:DI (subreg:DI (reg:TI 99) 0)
            (subreg:DI (reg/v:TI 94 [ i ]) 0))) "/app/example.c":5:6 521
{iordi3}
(insn 23 22 24 2 (set (reg:DI 101)
        (ior:DI (subreg:DI (reg:TI 99) 8)
            (subreg:DI (reg/v:TI 94 [ i ]) 8))) "/app/example.c":5:6 521
{iordi3}


More information about the Gcc-bugs mailing list