[patch,avr,committed] Small improvement loading 16-bit values.

Georg-Johann Lay avr@gjlay.de
Mon Nov 28 09:40:00 GMT 2016


http://gcc.gnu.org/r242909

This patch adds treatment of reg_unused_after for *(X+const) that only 
restores X if X is known to be used.

Applied as obvious.

Johann


	* config/avr/avr.c (out_movhi_r_mr) [REG_X + PLUS]: Only SBIW if
	X is not unused after.

Index: config/avr/avr.c
===================================================================
--- config/avr/avr.c    (revision 242908)
+++ config/avr/avr.c    (revision 242909)
@@ -4028,16 +4028,22 @@ out_movhi_r_mr (rtx_insn *insn, rtx op[]
           optimization options.  */

        if (reg_base == REG_X)
-        return reg_base == reg_dest
-          ? avr_asm_len ("adiw r26,%o1"      CR_TAB
-                         "ld __tmp_reg__,X+" CR_TAB
-                         "ld %B0,X"          CR_TAB
-                         "mov %A0,__tmp_reg__", op, plen, -4)
+        {
+          if (reg_base == reg_dest)
+            return avr_asm_len ("adiw r26,%o1"      CR_TAB
+                                "ld __tmp_reg__,X+" CR_TAB
+                                "ld %B0,X"          CR_TAB
+                                "mov %A0,__tmp_reg__", op, plen, -4);

-          : avr_asm_len ("adiw r26,%o1" CR_TAB
-                         "ld %A0,X+"    CR_TAB
-                         "ld %B0,X"     CR_TAB
-                         "sbiw r26,%o1+1", op, plen, -4);
+          avr_asm_len ("adiw r26,%o1" CR_TAB
+                       "ld %A0,X+"    CR_TAB
+                       "ld %B0,X", op, plen, -3);
+
+          if (!reg_unused_after (insn, XEXP (base, 0)))
+            avr_asm_len ("sbiw r26,%o1+1", op, plen, 1);
+
+          return "";
+        }

        return reg_base == reg_dest
          ? avr_asm_len ("ldd __tmp_reg__,%A1" CR_TAB



More information about the Gcc-patches mailing list