The below program and resulting code demonstrates: - volatile variables are needlessly initilized through a temporary, rather than being initialized directly. - volatile variable function arguments aren't passed direclty, but needlessly use an intermediate temporary variable. - normal variable function arguments with a volatile variable target seems to inhibits the recognition of word-wide move's for normal variable argument passing, which are recognized otherwise
main.c int main (void) { long lx, ly = 3; volatile long lv = 5; long long llx, lly = 6; volatile long long llv = 7; lv = lx * ly; lv = lv * lv; llv = llx * lly; llv = llv * llv; return lx + ly + llx + lly; } main.lst 1 .file "main.c" 2 .arch atmega64 3 __SREG__ = 0x3f 4 __SP_H__ = 0x3e 5 __SP_L__ = 0x3d 6 __tmp_reg__ = 0 7 __zero_reg__ = 1 8 .global __do_copy_data 9 .global __do_clear_bss 12 .text 13 .Ltext0: 37 .global main 39 main: 1:main.c **** int main (void) { 41 .LM1: 42 /* prologue: frame size=32 */ 43 0000 C0E0 ldi r28,lo8(__stack - 32) 44 0002 D0E0 ldi r29,hi8(__stack - 32) 45 0004 DEBF out __SP_H__,r29 46 0006 CDBF out __SP_L__,r28 47 /* prologue end (size=4) */ 48 0008 198A std Y+17,__zero_reg__ 49 000a 1A8A std Y+18,__zero_reg__ 2:main.c **** 3:main.c **** long lx, ly = 3; 4:main.c **** volatile long lv = 5; 51 .LM2: 52 000c 85E0 ldi r24,lo8(5) 53 000e 90E0 ldi r25,hi8(5) 54 0010 A0E0 ldi r26,hlo8(5) 55 0012 B0E0 ldi r27,hhi8(5) 56 0014 8983 std Y+1,r24 57 0016 9A83 std Y+2,r25 58 0018 AB83 std Y+3,r26 59 001a BC83 std Y+4,r27 5:main.c **** 6:main.c **** long long llx, lly = 6; 61 .LM3: 62 001c 26E0 ldi r18,lo8(6) 63 001e 298F std Y+25,r18 64 0020 1A8E std Y+26,__zero_reg__ 7:main.c **** volatile long long llv = 7; 66 .LM4: 67 0022 87E0 ldi r24,lo8(7) 68 0024 8D83 std Y+5,r24 69 0026 1E82 std Y+6,__zero_reg__ 70 0028 1F82 std Y+7,__zero_reg__ 71 002a 1886 std Y+8,__zero_reg__ 72 002c 1986 std Y+9,__zero_reg__ 73 002e 1A86 std Y+10,__zero_reg__ 74 0030 1B86 std Y+11,__zero_reg__ 75 0032 1C86 std Y+12,__zero_reg__ 8:main.c **** 9:main.c **** lv = lx * ly; 77 .LM5: 78 0034 6D85 ldd r22,Y+13 79 0036 7E85 ldd r23,Y+14 80 0038 8F85 ldd r24,Y+15 81 003a 9889 ldd r25,Y+16 82 003c 23E0 ldi r18,lo8(3) 83 003e 30E0 ldi r19,hi8(3) 84 0040 40E0 ldi r20,hlo8(3) 85 0042 50E0 ldi r21,hhi8(3) 86 0044 0E94 0000 call __mulsi3 87 0048 DC01 movw r26,r24 88 004a CB01 movw r24,r22 89 004c 8983 std Y+1,r24 90 004e 9A83 std Y+2,r25 91 0050 AB83 std Y+3,r26 92 0052 BC83 std Y+4,r27 10:main.c **** lv = lv * lv; 94 .LM6: 95 0054 8981 ldd r24,Y+1 96 0056 9A81 ldd r25,Y+2 97 0058 AB81 ldd r26,Y+3 98 005a BC81 ldd r27,Y+4 99 005c 2981 ldd r18,Y+1 100 005e 3A81 ldd r19,Y+2 101 0060 4B81 ldd r20,Y+3 102 0062 5C81 ldd r21,Y+4 103 0064 BC01 movw r22,r24 104 0066 CD01 movw r24,r26 105 0068 0E94 0000 call __mulsi3 106 006c DC01 movw r26,r24 107 006e CB01 movw r24,r22 108 0070 8983 std Y+1,r24 109 0072 9A83 std Y+2,r25 110 0074 AB83 std Y+3,r26 111 0076 BC83 std Y+4,r27 11:main.c **** 12:main.c **** llv = llx * lly; 113 .LM7: 114 0078 A98C ldd r10,Y+25 115 007a BA8C ldd r11,Y+26 116 007c CB2C mov r12,r11 117 007e DB2C mov r13,r11 118 0080 EB2C mov r14,r11 119 0082 FB2C mov r15,r11 120 0084 0B2D mov r16,r11 121 0086 1B2D mov r17,r11 122 0088 2B2D mov r18,r11 123 008a 3B2D mov r19,r11 124 008c 4B2D mov r20,r11 125 008e 5B2D mov r21,r11 126 0090 6B2D mov r22,r11 127 0092 7B2D mov r23,r11 128 0094 8B2D mov r24,r11 129 0096 9B2D mov r25,r11 130 0098 0E94 0000 call __muldi3 131 009c 2D83 std Y+5,r18 132 009e 3E83 std Y+6,r19 133 00a0 4F83 std Y+7,r20 134 00a2 5887 std Y+8,r21 135 00a4 6987 std Y+9,r22 136 00a6 7A87 std Y+10,r23 137 00a8 8B87 std Y+11,r24 138 00aa 9C87 std Y+12,r25 13:main.c **** llv = llv * llv; 140 .LM8: 141 00ac 2D80 ldd r2,Y+5 142 00ae 3E80 ldd r3,Y+6 143 00b0 4F80 ldd r4,Y+7 144 00b2 5884 ldd r5,Y+8 145 00b4 6984 ldd r6,Y+9 146 00b6 7A84 ldd r7,Y+10 147 00b8 8B84 ldd r8,Y+11 148 00ba 9C84 ldd r9,Y+12 149 00bc 2D81 ldd r18,Y+5 150 00be 3E81 ldd r19,Y+6 151 00c0 4F81 ldd r20,Y+7 152 00c2 5885 ldd r21,Y+8 153 00c4 6985 ldd r22,Y+9 154 00c6 7A85 ldd r23,Y+10 155 00c8 8B85 ldd r24,Y+11 156 00ca 9C85 ldd r25,Y+12 157 00cc A22E mov r10,r18 158 00ce B32E mov r11,r19 159 00d0 C42E mov r12,r20 160 00d2 D52E mov r13,r21 161 00d4 E62E mov r14,r22 162 00d6 F72E mov r15,r23 163 00d8 082F mov r16,r24 164 00da 192F mov r17,r25 165 00dc 222D mov r18,r2 166 00de 332D mov r19,r3 167 00e0 442D mov r20,r4 168 00e2 552D mov r21,r5 169 00e4 662D mov r22,r6 170 00e6 772D mov r23,r7 171 00e8 882D mov r24,r8 172 00ea 992D mov r25,r9 173 00ec 0E94 0000 call __muldi3 174 00f0 2D83 std Y+5,r18 175 00f2 3E83 std Y+6,r19 176 00f4 4F83 std Y+7,r20 177 00f6 5887 std Y+8,r21 178 00f8 6987 std Y+9,r22 179 00fa 7A87 std Y+10,r23 180 00fc 8B87 std Y+11,r24 181 00fe 9C87 std Y+12,r25 14:main.c **** 15:main.c **** return lx + ly + llx + lly; 183 .LM9: 184 0100 8D85 ldd r24,Y+13 185 0102 9E85 ldd r25,Y+14 186 0104 0396 adiw r24,3 187 0106 2989 ldd r18,Y+17 188 0108 3A89 ldd r19,Y+18 189 010a 820F add r24,r18 190 010c 931F adc r25,r19 16:main.c **** } 192 .LM10: 193 010e 298D ldd r18,Y+25 194 0110 3A8D ldd r19,Y+26 195 0112 820F add r24,r18 196 0114 931F adc r25,r19 197 /* epilogue: frame size=32 */ 198 0116 0C94 0000 jmp exit 199 /* epilogue end (size=2) */ 200 /* function main size 141 (135) */ 209 .Lscope0: 211 .text 213 Letext: 214 /* File "main.c": code 141 = 0x008d ( 135), prologues 4, epilogues 2 */ DEFINED SYMBOLS *ABS*:00000000 main.c *ABS*:0000003f __SREG__ *ABS*:0000003e __SP_H__ *ABS*:0000003d __SP_L__ *ABS*:00000000 __tmp_reg__ *ABS*:00000001 __zero_reg__ /var/tmp//ccNIsAYP.s:39 .text:00000000 main /var/tmp//ccNIsAYP.s:213 .text:0000011a Letext UNDEFINED SYMBOLS __do_copy_data __do_clear_bss __stack __mulsi3 __muldi3 exit -- Summary: missed volatile variable optimizations Product: gcc Version: 3.4.3 Status: UNCONFIRMED Severity: normal Priority: P2 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: schlie at comcast dot net CC: gcc-bugs at gcc dot gnu dot org GCC host triplet: ppc GCC target triplet: avr http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18617