[Bug c/50314] New: GCC changes order of code so it does not work as intended
NickParker at Eaton dot com
gcc-bugzilla@gcc.gnu.org
Wed Sep 7 07:33:00 GMT 2011
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50314
Bug #: 50314
Summary: GCC changes order of code so it does not work as
intended
Classification: Unclassified
Product: gcc
Version: 4.3.3
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: NickParker@Eaton.com
While timing a piece of code I discovered the following. GCC reordered my code
such that the assembler is not doing things as the C code suggests.
Regards, Nick
C CODE:
cli();
time = BGndTimerReadNowIsr();
result_u2 = MulU2U2( ZERO_DEGC_IN_DEGK, manPres_u2) / (airTemp_u2 +
ZERO_DEGC_IN_DEGK);
time = BGndTimerReadNowIsr() - time;
sei();
Note in ASM code, the timer read is called PRIOR to the division. In the C code
above this is not how the intent is. This may not be a bug, but I certainly
didnt expect GCC to break my C statements and order them as it wishes!
ASM CODE:
113 0092 F894 cli
114 ; 0 "" 2
115 .LM16:
116 /* #NOAPP */
117 0094 0E94 0000 call BGndTimerReadNowIsr
118 0098 9A83 std Y+2,r25
119 009a 8983 std Y+1,r24
120 .LM17:
121 009c 82E1 ldi r24,lo8(4370)
122 009e 91E1 ldi r25,hi8(4370)
123 00a0 69E9 ldi r22,lo8(4505)
124 00a2 71E1 ldi r23,hi8(4505)
125 00a4 0E94 0000 call MulU2U2
126 00a8 7B01 movw r14,r22
127 00aa 8C01 movw r16,r24
128 .LM18:
129 00ac 0E94 0000 call BGndTimerReadNowIsr
130 00b0 2981 ldd r18,Y+1
131 00b2 3A81 ldd r19,Y+2
132 00b4 821B sub r24,r18
133 00b6 930B sbc r25,r19
134 .LVL4:
135 00b8 9A83 std Y+2,r25
136 00ba 8983 std Y+1,r24
137 .LM19:
138 /* #APP */
139 ; 232 "tests.c" 1
140 00bc 7894 sei
141 ; 0 "" 2
142 .LM20:
143 /* #NOAPP */
144 00be 80E0 ldi r24,lo8(0)
145 .LVL5:
146 00c0 60E0 ldi r22,lo8(__c.3250)
147 00c2 70E0 ldi r23,hi8(__c.3250)
148 00c4 0E94 0000 call PutFlashString
149 .LM21:
150 00c8 80E0 ldi r24,lo8(0)
151 00ca 60E0 ldi r22,lo8(__c.3252)
152 00cc 70E0 ldi r23,hi8(__c.3252)
153 00ce 0E94 0000 call PutFlashString
154 .LM22:
155 00d2 C801 movw r24,r16
156 00d4 B701 movw r22,r14
157 00d6 22E3 ldi r18,lo8(5170)
158 00d8 34E1 ldi r19,hi8(5170)
159 00da 40E0 ldi r20,hlo8(5170)
160 00dc 50E0 ldi r21,hhi8(5170)
161 00de 0E94 0000 call __udivmodsi4
More information about the Gcc-bugs
mailing list