[Bug c/18617] New: missed volatile variable optimizations
schlie at comcast dot net
gcc-bugzilla@gcc.gnu.org
Mon Nov 22 23:48:00 GMT 2004
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
More information about the Gcc-bugs
mailing list