I have discovered code which optimizes improperly.  Attached are multiple
versions of the code.  The code is incorrect if any level of optimization is
on (-O1 -O2 -O3 or -Os).  test.c is compileable under gcc and msp430-gcc.
When targeted at i386 the source generates valid code with both -D_WORK_
(the _WORK_ define switches from a valid to invalid version when compiled)
and with out (in fact it creates the same code).  Also attached is math.c
which contains the problematic code with minimal support code so that a
minimal object can be created.  math.c also is the same as the preprocessed
code of math.c.  

When compiled for the MSP target it uses msp430 simulator to assess the
validity of the code.  When the dysfunctional code is compiled it creates a
jl instruction in place of a jn instruction after the if statement (see
attached math.lst).  

I have included a make file to make viewing the bug easier.  All you need is
the simulator in your path and it will make the code and run the test cases.

About the code:
The attached code (in math.c) increments the upper nibble of temp1 by 3 then

examines the upper nibble of temp1 to see if it is >= 8.  If it is then
do nothing, otherwise
undo the increment by decrementing the upper nibble by 3.

The assembly generated performs the inc by 3 then checks the n and v flags
with the jl instruction to determine when to jump.  because only the last
bit is being checked it is only appropriate to check the n flag -- as the
result of the last arithmetic instr is inconsequential (aside from the
content of bit 7).

If any more info is needed please mail me or the list.  And I'll send it
ASAP.

-Chris Takahashi

Attachment: makefile
Description: Binary data

Attachment: math.c
Description: Binary data

Attachment: math.lst
Description: Binary data

Attachment: test.c
Description: Binary data

Attachment: testing.h
Description: Binary data

Reply via email to