avr-gcc-list
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [avr-gcc-list] [patch] #27663: missed-optimization transforming abyt


From: Weddington, Eric
Subject: RE: [avr-gcc-list] [patch] #27663: missed-optimization transforming abyte array to unsigned long
Date: Wed, 28 Jan 2009 12:14:05 -0700

 

> -----Original Message-----
> From: 
> address@hidden 
> [mailto:address@hidden
> org] On Behalf Of Georg-Johann Lay
> Sent: Wednesday, January 28, 2009 11:51 AM
> To: address@hidden
> Subject: [avr-gcc-list] [patch] #27663: missed-optimization 
> transforming abyte array to unsigned long
> 
> Hi, 
> 
> this patch soves the missed-optimization reported in
> 
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27663
> 
> to a certain degree. It works atop of the adjust_len insn attribute.
> 
> With this patch it is the same trouble as with the 1-bit 
> optimization stuff: Every single case of some algebra is 
> handled by some insn. This can tune the code in some very 
> specual situation, but there are thousands of other 
> expressions out in the world...
> 
> 
> BTW: How can I generate a patch against the mentioned 
> "adjust_len insn attribute"?. I think that would be more handy?
> 


This line should not be removed:

@@ -1,4 +1,3 @@
-;; -*- Mode: Scheme -*-
 ;;   Machine description for GNU compiler,
 ;;   for ATMEL AVR micro controllers.
 ;;   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008


Most of this patch has to do with using the "adjust_len" attribute and would be 
better off in the adjust_len patch:


@@ -116,6 +115,13 @@
                       (const_int 2))]
         (const_int 2)))
 
+;; Some complex insns don't need length adjustment and thererfore,
+;; the length of these insns must not be altered.
+;; It is easier to state this in an insn attribute
+;; than to clutter up code in avr.c:adjust_insn_length()
+(define_attr "adjust_len" "yes,no"
+  (const_string "no"))
+
 ;; Define mode iterator
 (define_mode_iterator QISI [(QI "") (HI "") (SI "")])

@@ -240,7 +246,8 @@
     || register_operand (operands[1], QImode) || const0_rtx == operands[1])"
   "* return output_movqi (insn, operands, NULL);"
   [(set_attr "length" "1,1,5,5,1,1,4")
-   (set_attr "cc" "none,none,clobber,clobber,none,none,clobber")])
+   (set_attr "cc" "none,none,clobber,clobber,none,none,clobber")
+   (set_attr "adjust_len" "yes,yes,yes,yes,yes,yes,yes")])
 
 ;; This is used in peephole2 to optimize loading immediate constants
 ;; if a scratch register from LD_REGS happens to be available.
@@ -290,7 +297,8 @@
     || (register_operand (operands[0], HImode) && 
stack_register_operand(operands[1], HImode)))"
   "* return output_movhi (insn, operands, NULL);"
   [(set_attr "length" "5,2")
-   (set_attr "cc" "none,none")])
+   (set_attr "cc" "none,none")
+   (set_attr "adjust_len" "yes,yes")])
 
 (define_insn "movhi_sp_r_irq_off"
   [(set (match_operand:HI 0 "stack_register_operand" "=q")
@@ -332,7 +340,8 @@
   "reload_completed"
   "* return output_reload_inhi (insn, operands, NULL);"
   [(set_attr "length" "4")
-   (set_attr "cc" "none")])
+   (set_attr "cc" "none")
+   (set_attr "adjust_len" "yes")])
 
 (define_insn "*movhi"
   [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,m,d,*r,q,r")
@@ -341,7 +350,8 @@
     || register_operand (operands[1],HImode) || const0_rtx == operands[1])"
   "* return output_movhi (insn, operands, NULL);"
   [(set_attr "length" "2,6,7,2,6,5,2")
-   (set_attr "cc" "none,clobber,clobber,none,clobber,none,none")])
+   (set_attr "cc" "none,clobber,clobber,none,clobber,none,none")   
+   (set_attr "adjust_len" "yes,yes,yes,yes,yes,yes,yes")])
 
 (define_peephole2 ; movw
   [(set (match_operand:QI 0 "even_register_operand" "")
@@ -409,8 +419,8 @@
   "reload_completed"
   "* return output_reload_insisf (insn, operands, NULL);"
   [(set_attr "length" "8")
-   (set_attr "cc" "none")])
-
+   (set_attr "cc" "none")
+   (set_attr "adjust_len" "yes")])
 
 (define_insn "*movsi"
   [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,r,Qm,!d,r")
@@ -419,7 +429,8 @@
     || register_operand (operands[1],SImode) || const0_rtx == operands[1])"
   "* return output_movsisf (insn, operands, NULL);"
   [(set_attr "length" "4,4,8,9,4,10")
-   (set_attr "cc" "none,set_zn,clobber,clobber,none,clobber")])
+   (set_attr "cc" "none,set_zn,clobber,clobber,none,clobber")
+   (set_attr "adjust_len" "yes,yes,yes,yes,yes,yes")])
 
 ;; fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
 ;; move floating point numbers (32 bit)
@@ -445,7 +456,8 @@
    || register_operand (operands[1], SFmode)"
   "* return output_movsisf (insn, operands, NULL);"
   [(set_attr "length" "4,4,8,9,4,10")
-   (set_attr "cc" "none,set_zn,clobber,clobber,none,clobber")])
+   (set_attr "cc" "none,set_zn,clobber,clobber,none,clobber")
+   (set_attr "adjust_len" "yes,yes,yes,yes,yes,yes")])
 
 ;;=========================================================================
 ;; move string (like memcpy)
@@ -1227,7 +1239,8 @@
           AS1 (clr,%B0));
 }"
   [(set_attr "length" "2,2,3")
-   (set_attr "cc" "set_n,clobber,set_n")])
+   (set_attr "cc" "set_n,clobber,set_n")
+   (set_attr "adjust_len" "no,yes,no")])
 
 (define_insn "andsi3"
   [(set (match_operand:SI 0 "register_operand" "=r,d")
@@ -1263,7 +1276,8 @@
   return \"bug\";
 }"
   [(set_attr "length" "4,4")
-   (set_attr "cc" "set_n,clobber")])
+   (set_attr "cc" "set_n,clobber")
+   (set_attr "adjust_len" "no,yes")])
 
 (define_peephole2 ; andi
   [(set (match_operand:QI 0 "d_register_operand" "")
@@ -1314,7 +1328,8 @@
           AS2 (ori,%B0,hi8(%2)));
 }"  
   [(set_attr "length" "2,2")
-   (set_attr "cc" "set_n,clobber")])
+   (set_attr "cc" "set_n,clobber")
+   (set_attr "adjust_len" "no,yes")])
 
 (define_insn "*iorhi3_clobber"
   [(set (match_operand:HI 0 "register_operand" "=r,r")
@@ -1358,7 +1373,8 @@
          AS2 (ori, %D0,hhi8(%2)));
 }"
   [(set_attr "length" "4,4")
-   (set_attr "cc" "set_n,clobber")])
+   (set_attr "cc" "set_n,clobber")
+   (set_attr "adjust_len" "no,yes")])
 
 (define_insn "*iorsi3_clobber"
   [(set (match_operand:SI 0 "register_operand"        "=r,r")
@@ -1618,7 +1634,8 @@
   ""
   "* return ashlqi3_out (insn, operands, NULL);"
   [(set_attr "length" "5,0,1,2,4,6,9")
-   (set_attr "cc" "clobber,none,set_czn,set_czn,set_czn,set_czn,clobber")])
+   (set_attr "cc" "clobber,none,set_czn,set_czn,set_czn,set_czn,clobber")
+   (set_attr "adjust_len" "yes,yes,yes,yes,yes,yes,yes")])
 
 (define_insn "ashlhi3"
   [(set (match_operand:HI 0 "register_operand"           "=r,r,r,r,r,r,r")
@@ -1627,7 +1644,8 @@
   ""
   "* return ashlhi3_out (insn, operands, NULL);"
   [(set_attr "length" "6,0,2,2,4,10,10")
-   (set_attr "cc" "clobber,none,set_n,clobber,set_n,clobber,clobber")])
+   (set_attr "cc" "clobber,none,set_n,clobber,set_n,clobber,clobber")
+   (set_attr "adjust_len" "yes,yes,yes,yes,yes,yes,yes")])
 
 (define_insn "ashlsi3"
   [(set (match_operand:SI 0 "register_operand"           "=r,r,r,r,r,r,r")
@@ -1636,7 +1654,8 @@
   ""
   "* return ashlsi3_out (insn, operands, NULL);"
   [(set_attr "length" "8,0,4,4,8,10,12")
-   (set_attr "cc" "clobber,none,set_n,clobber,set_n,clobber,clobber")])
+   (set_attr "cc" "clobber,none,set_n,clobber,set_n,clobber,clobber")
+   (set_attr "adjust_len" "yes,yes,yes,yes,yes,yes,yes")])
 
 ;; Optimize if a scratch register from LD_REGS happens to be available.
 
@@ -1693,7 +1712,8 @@
   "reload_completed"
   "* return ashlhi3_out (insn, operands, NULL);"
   [(set_attr "length" "0,2,2,4,10")
-   (set_attr "cc" "none,set_n,clobber,set_n,clobber")])
+   (set_attr "cc" "none,set_n,clobber,set_n,clobber")
+   (set_attr "adjust_len" "yes,yes,yes,yes,yes")])
 
 (define_peephole2
   [(match_scratch:QI 3 "d")
@@ -1713,7 +1733,8 @@
   "reload_completed"
   "* return ashlsi3_out (insn, operands, NULL);"
   [(set_attr "length" "0,4,4,10")
-   (set_attr "cc" "none,set_n,clobber,clobber")])
+   (set_attr "cc" "none,set_n,clobber,clobber")
+   (set_attr "adjust_len" "yes,yes,yes,yes")])
 
 ;; >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >>
 ;; arithmetic shift right
@@ -1725,7 +1746,8 @@
   ""
   "* return ashrqi3_out (insn, operands, NULL);"
   [(set_attr "length" "5,0,1,2,5,9")
-   (set_attr "cc" "clobber,none,clobber,clobber,clobber,clobber")])
+   (set_attr "cc" "clobber,none,clobber,clobber,clobber,clobber")
+   (set_attr "adjust_len" "yes,yes,yes,yes,yes,yes")])
 
 (define_insn "ashrhi3"
   [(set (match_operand:HI 0 "register_operand"             "=r,r,r,r,r,r,r")
@@ -1734,7 +1756,8 @@
   ""
   "* return ashrhi3_out (insn, operands, NULL);"
   [(set_attr "length" "6,0,2,4,4,10,10")
-   (set_attr "cc" "clobber,none,clobber,set_n,clobber,clobber,clobber")])
+   (set_attr "cc" "clobber,none,clobber,set_n,clobber,clobber,clobber")
+   (set_attr "adjust_len" "yes,yes,yes,yes,yes,yes,yes")])
 
 (define_insn "ashrsi3"
   [(set (match_operand:SI 0 "register_operand"             "=r,r,r,r,r,r,r")
@@ -1743,7 +1766,8 @@
   ""
   "* return ashrsi3_out (insn, operands, NULL);"
   [(set_attr "length" "8,0,4,6,8,10,12")
-   (set_attr "cc" "clobber,none,clobber,set_n,clobber,clobber,clobber")])
+   (set_attr "cc" "clobber,none,clobber,set_n,clobber,clobber,clobber")
+   (set_attr "adjust_len" "yes,yes,yes,yes,yes,yes,yes")])
 
 ;; Optimize if a scratch register from LD_REGS happens to be available.
 
@@ -1765,7 +1789,8 @@
   "reload_completed"
   "* return ashrhi3_out (insn, operands, NULL);"
   [(set_attr "length" "0,2,4,4,10")
-   (set_attr "cc" "none,clobber,set_n,clobber,clobber")])
+   (set_attr "cc" "none,clobber,set_n,clobber,clobber")
+   (set_attr "adjust_len" "yes,yes,yes,yes,yes")])
 
 (define_peephole2
   [(match_scratch:QI 3 "d")
@@ -1785,7 +1810,8 @@
   "reload_completed"
   "* return ashrsi3_out (insn, operands, NULL);"
   [(set_attr "length" "0,4,4,10")
-   (set_attr "cc" "none,clobber,set_n,clobber")])
+   (set_attr "cc" "none,clobber,set_n,clobber")
+   (set_attr "adjust_len" "yes,yes,yes,yes")])
 
 ;; >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >>
 ;; logical shift right
@@ -1833,7 +1859,8 @@
   ""
   "* return lshrqi3_out (insn, operands, NULL);"
   [(set_attr "length" "5,0,1,2,4,6,9")
-   (set_attr "cc" "clobber,none,set_czn,set_czn,set_czn,set_czn,clobber")])
+   (set_attr "cc" "clobber,none,set_czn,set_czn,set_czn,set_czn,clobber")
+   (set_attr "adjust_len" "yes,yes,yes,yes,yes,yes,yes")])
 
 (define_insn "lshrhi3"
   [(set (match_operand:HI 0 "register_operand"             "=r,r,r,r,r,r,r")
@@ -1842,7 +1869,8 @@
   ""
   "* return lshrhi3_out (insn, operands, NULL);"
   [(set_attr "length" "6,0,2,2,4,10,10")
-   (set_attr "cc" "clobber,none,clobber,clobber,clobber,clobber,clobber")])
+   (set_attr "cc" "clobber,none,clobber,clobber,clobber,clobber,clobber")
+   (set_attr "adjust_len" "yes,yes,yes,yes,yes,yes,yes")])
 
 (define_insn "lshrsi3"
   [(set (match_operand:SI 0 "register_operand"             "=r,r,r,r,r,r,r")
@@ -1851,7 +1879,8 @@
   ""
   "* return lshrsi3_out (insn, operands, NULL);"
   [(set_attr "length" "8,0,4,4,8,10,12")
-   (set_attr "cc" "clobber,none,clobber,clobber,clobber,clobber,clobber")])
+   (set_attr "cc" "clobber,none,clobber,clobber,clobber,clobber,clobber")
+   (set_attr "adjust_len" "yes,yes,yes,yes,yes,yes,yes")])
 
 ;; Optimize if a scratch register from LD_REGS happens to be available.
 
@@ -1908,7 +1937,8 @@
   "reload_completed"
   "* return lshrhi3_out (insn, operands, NULL);"
   [(set_attr "length" "0,2,2,4,10")
-   (set_attr "cc" "none,clobber,clobber,clobber,clobber")])
+   (set_attr "cc" "none,clobber,clobber,clobber,clobber")
+   (set_attr "adjust_len" "yes,yes,yes,yes,yes")])
 
 (define_peephole2
   [(match_scratch:QI 3 "d")
@@ -1928,7 +1958,8 @@
   "reload_completed"
   "* return lshrsi3_out (insn, operands, NULL);"
   [(set_attr "length" "0,4,4,10")
-   (set_attr "cc" "none,clobber,clobber,clobber")])
+   (set_attr "cc" "none,clobber,clobber,clobber")
+   (set_attr "adjust_len" "yes,yes,yes,yes")])
 
 ;; abs(x) abs(x) abs(x) abs(x) abs(x) abs(x) abs(x) abs(x) abs(x) abs(x) abs(x)
 ;; abs
@@ -2188,7 +2219,8 @@
   ""
   "* return out_tsthi (insn,NULL);"
 [(set_attr "cc" "compare,compare")
- (set_attr "length" "1,2")])
+ (set_attr "length" "1,2")
+   (set_attr "adjust_len" "yes,yes")])
 
 (define_insn "*reversed_tsthi"
   [(set (cc0)
@@ -2206,7 +2238,8 @@
   ""
   "* return out_tstsi (insn,NULL);"
   [(set_attr "cc" "compare")
-   (set_attr "length" "4")])
+   (set_attr "length" "4")
+   (set_attr "adjust_len" "yes")])
 
 (define_insn "*reversed_tstsi"
   [(set (cc0)


-------------------------------

It would be better if the patch just contained the bug fix which is contained 
in the last hunk.

Eric Weddington




reply via email to

[Prev in Thread] Current Thread [Next in Thread]