[PATCH, alpha]: Fix reload_out<mode>_aligned insn pattern

Uros Bizjak ubizjak@gmail.com
Tue Feb 10 18:00:00 GMT 2015


Hello!

gfortran.dg/char_length_15.f90 FAILs on non-BWX alpha due to invalid
propagation of memory address into reload_out<mode>_aligned insn
pattern.

We start with:

*** char_length_15.f90.228r.reload:

(insn 577 456 460 14 (parallel [
            (set (mem/c:QI (plus:DI (reg:DI 6 $6 [358])
                        (const_int 8 [0x8])) [0  S1 A32])
                (reg:QI 8 $8))
            (clobber (reg:SI 3 $3))
            (clobber (reg:SI 4 $4))
        ]) /space/homedirs/uros/gcc-svn/trunk/gcc/testsuite/gfortran.dg/char_length_15.f90:30
243 {reload_outqi_aligned}
     (nil))

Postreload pass propagates address involving clobbered reg $4:

*** char_length_15.f90.229r.postreload:

(insn 577 456 460 14 (parallel [
            (set (mem/c:QI (plus:DI (reg:DI 4 $4 [357])
                        (const_int 12 [0xc])) [0  S1 A32])
                (reg:QI 8 $8))
            (clobber (reg:SI 3 $3))
            (clobber (reg:SI 4 $4))
        ]) /space/homedirs/uros/gcc-svn/trunk/gcc/testsuite/gfortran.dg/char_length_15.f90:30
243 {reload_outqi_aligned}
     (nil))

And this pattern is split in a post-reload splitter to:

*** char_length_15.f90.231r.split2:

(insn 578 456 579 14 (set (reg:SI 3 $3)
        (mem/c:SI (plus:DI (reg:DI 4 $4 [357])
                (const_int 12 [0xc])) [0  S4 A32]))
/space/homedirs/uros/gcc-svn/trunk/gcc/testsuite/gfortran.dg/char_length_15.f90:30
229 {*movsi}
     (nil))
(insn 579 578 580 14 (set (reg:DI 3 $3)
        (and:DI (reg:DI 3 $3)
            (const_int -256 [0xffffffffffffff00])))
/space/homedirs/uros/gcc-svn/trunk/gcc/testsuite/gfortran.dg/char_length_15.f90:30
48 {anddi3}
     (nil))
(insn 580 579 581 14 (set (reg:DI 4 $4)
        (ashift:DI (zero_extend:DI (reg:QI 8 $8))
            (const_int 0 [0])))
/space/homedirs/uros/gcc-svn/trunk/gcc/testsuite/gfortran.dg/char_length_15.f90:30
86 {insbl_const}
     (nil))
(insn 581 580 582 14 (set (reg:DI 4 $4)
        (ior:DI (reg:DI 4 $4)
            (reg:DI 3 $3)))
/space/homedirs/uros/gcc-svn/trunk/gcc/testsuite/gfortran.dg/char_length_15.f90:30
58 {iordi3}
     (nil))
(insn 582 581 460 14 (set (mem/c:SI (plus:DI (reg:DI 4 $4 [357])
                (const_int 12 [0xc])) [0  S4 A32])
        (reg:SI 4 $4))
/space/homedirs/uros/gcc-svn/trunk/gcc/testsuite/gfortran.dg/char_length_15.f90:30
229 {*movsi}
     (nil))


(insn 582) uses the address that involves the register $4, clobbered
in (insn 580) and (insn 581).

Declaring operands 2 and 3 in reload_out<mode>_aligned insn pattern as
earlyclobber operands solves this issue.

2015-02-10  Uros Bizjak  <ubizjak@gmail.com>

    * config/alpha/alpha.md (reload_out<mode>_aligned): Make operands 2
    and 3 earlyclobber operands.

Patch was bootstrapped and regression tested on alpha-linux-gnu. Patch
was committed to mainline and will be backported to release branches.

Uros.
-------------- next part --------------
Index: config/alpha/alpha.md
===================================================================
--- config/alpha/alpha.md	(revision 220566)
+++ config/alpha/alpha.md	(working copy)
@@ -4496,8 +4496,8 @@
 (define_insn_and_split "reload_out<mode>_aligned"
   [(set (match_operand:I12MODE 0 "memory_operand" "=m")
         (match_operand:I12MODE 1 "register_operand" "r"))
-   (clobber (match_operand:SI 2 "register_operand" "=r"))
-   (clobber (match_operand:SI 3 "register_operand" "=r"))]
+   (clobber (match_operand:SI 2 "register_operand" "=&r"))
+   (clobber (match_operand:SI 3 "register_operand" "=&r"))]
   "!TARGET_BWX && (reload_in_progress || reload_completed)"
   "#"
   "!TARGET_BWX && reload_completed"


More information about the Gcc-patches mailing list