http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49305

Kazumoto Kojima <kkojima at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |ice-on-valid-code
             Target|                            |sh2a-*-*
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2011.06.07 14:03:19
                 CC|                            |kkojima at gcc dot gnu.org
     Ever Confirmed|0                           |1

--- Comment #1 from Kazumoto Kojima <kkojima at gcc dot gnu.org> 2011-06-07 
14:03:19 UTC ---
It seems that my recent patch

r174586 | kkojima | 2011-06-03 07:26:42 +0900 (Fri, 03 Jun 2011) | 7 lines

        * config/sh/predicates.md (general_movsrc_operand): Return 0
        for memory and memory subreg of which address is an invalid
        indexed address for QI and HImode.
        (general_movdst_operand): Likewise.

reveals a latent bug.  The insn

(insn 2358 4549 2359 471 (set (reg:SI 0 r0 [1023])
        (sign_extend:SI (mem/s:HI (plus:SI (reg:SI 2 r2)
                    (const_int 12 [0xc])) [5 fp_167(D)->_flags+0 S2 A32])))
../../../../../../newlib-1.19.0/newlib/libc/stdio/vfwscanf.c:1447 164
{*extendqisi2_compact}
     (nil))

has the pattern of *extendhisi2_compact but is strangely handled
as *extendqisi2_compact.  It looks the combined pass does this.
BTW, when looking into the PR, I've noticed that SH backend forgot
to use 32-bit mov.w instruction with 12-bit display for SH2A.
The patch below will work around this PR, though we should see
what is going on in the combined pass first.

diff -up ORIG/trunk/gcc/config/sh/sh.c trunk/gcc/config/sh/sh.c
--- ORIG/trunk/gcc/config/sh/sh.c    2011-06-02 09:41:16.000000000 +0900
+++ trunk/gcc/config/sh/sh.c    2011-06-07 20:25:49.000000000 +0900
@@ -9736,8 +9736,11 @@ sh_legitimate_index_p (enum machine_mode

       if (TARGET_SH2A)
     {
-      if (GET_MODE_SIZE (mode) == 1
-        && (unsigned) INTVAL (op) < 4096)
+      if ((GET_MODE_SIZE (mode) == 1
+           && (unsigned) INTVAL (op) < 4096)
+          || (GET_MODE_SIZE (mode) == 2
+          && (unsigned) INTVAL (op) < 8192
+          && !(INTVAL (op) & 1)))
         return true;
     }

diff -up ORIG/trunk/gcc/config/sh/sh.md trunk/gcc/config/sh/sh.md
--- ORIG/trunk/gcc/config/sh/sh.md    2010-08-28 13:32:01.000000000 +0900
+++ trunk/gcc/config/sh/sh.md    2011-06-07 20:33:58.000000000 +0900
@@ -4585,7 +4585,12 @@ label:
   "@
     exts.w    %1,%0
     mov.w    %1,%0"
-  [(set_attr "type" "arith,load")])
+  [(set_attr "type" "arith,load")
+   (set_attr_alternative "length"
+     [(const_int 2)
+       (if_then_else
+    (ne (symbol_ref "TARGET_SH2A") (const_int 0))
+    (const_int 4) (const_int 2))])])

 (define_insn "*extendhisi2_media"
   [(set (match_operand:SI 0 "register_operand" "=r,r")
@@ -5308,7 +5313,20 @@ label:
     sts    %1,%0
     lds    %1,%0
     fake    %1,%0"
-  [(set_attr "type" "pcload,move,load,move,store,move,move,pcload")])
+  [(set_attr "type" "pcload,move,load,move,store,move,move,pcload")
+   (set_attr_alternative "length"
+     [(const_int 2)
+      (const_int 2)
+      (if_then_else
+    (ne (symbol_ref "TARGET_SH2A") (const_int 0))
+    (const_int 4) (const_int 2))
+      (const_int 2)
+      (if_then_else
+    (ne (symbol_ref "TARGET_SH2A") (const_int 0))
+    (const_int 4) (const_int 2))
+      (const_int 2)
+      (const_int 2)
+      (const_int 2)])])

 (define_insn "*movhi_media"
   [(set (match_operand:HI 0 "general_movdst_operand"     "=r,r,r,r,m")

Reply via email to