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
makefile
Description: Binary data
math.c
Description: Binary data
math.lst
Description: Binary data
test.c
Description: Binary data
testing.h
Description: Binary data