mshiels@tmsoft.uucp (Michael A. Shiels) (06/13/90)
One of my co workers was trying to start using Microsoft C 6.0 but found out
that it's just like Microsfot C 5.1. You have to disable most of the
optimizations so it will generate correct code. Here's his very simple sample
code which doesn't have anything to do with loops but is broken when you specify
loop optimizations.
/**************************************************************************/
/* cl -c -Gs -Zl -FPc -Oswrl -Awfl -W4 -Fa c6badeg.c */
/* */
/* NOTE: THIS WORKS IF THE '-O...l' IS NOT INCLUDED! */
/* I PERSONALLY DON'T KNOW WHAT LOOP OPTIMIZATION HAS TO DO WITH */
/* THIS CODE. */
/* '-Oswer' DOESN'T WORK EITHER!! */
/**************************************************************************/
struct graphd {
double mins[2];
double maxs[2];
};
extern struct graphd *CurrentGraph;
void check_range(
double *val,
int range)
{
if (*val > CurrentGraph->maxs[range])
CurrentGraph->maxs[range] = *val;
if (*val < CurrentGraph->mins[range])
CurrentGraph->mins[range] = *val;
}
/**************************************************************************/
/*
; Static Name Aliases
;
TITLE c6badeg.c
.8087
C6BADEG_TEXT SEGMENT WORD PUBLIC 'CODE'
C6BADEG_TEXT ENDS
_DATA SEGMENT WORD PUBLIC 'DATA'
_DATA ENDS
CONST SEGMENT WORD PUBLIC 'CONST'
CONST ENDS
_BSS SEGMENT WORD PUBLIC 'BSS'
_BSS ENDS
DGROUP GROUP CONST, _BSS, _DATA
ASSUME DS: DGROUP
ASSUME SS: NOTHING
EXTRN __aFeldd:FAR
EXTRN __aFfcompp:FAR
EXTRN _CurrentGraph:DWORD
EXTRN __fltused:NEAR
C6BADEG_TEXT SEGMENT
ASSUME CS: C6BADEG_TEXT
; Line 1
; Line 14
C6BADEG_TEXT ENDS
CONST SEGMENT
$T20001 DW SEG _CurrentGraph
CONST ENDS
C6BADEG_TEXT SEGMENT
ASSUME CS: C6BADEG_TEXT
PUBLIC _check_range
_check_range PROC FAR
push bp
mov bp,sp
push di
push si
; val = 6
; range = 10
; Line 15
les bx,DWORD PTR [bp+6] ;val
call FAR PTR __aFeldd
mov es,WORD PTR $T20001
les bx,DWORD PTR es:_CurrentGraph
add bx,16
mov cl,3
mov si,WORD PTR [bp+10] ;range
shl si,cl
lea bx,WORD PTR [bx][si]
call FAR PTR __aFeldd
call FAR PTR __aFfcompp
jae $I106
; Line 16
mov cl,3
mov bx,WORD PTR [bp+10] ;range
shl bx,cl
mov es,WORD PTR $T20001
les si,DWORD PTR es:_CurrentGraph
mov ax,WORD PTR [bp+6] ;val
mov dx,WORD PTR [bp+8]
push ds
lea di,WORD PTR [bx+16][si]
mov si,ax
mov ds,dx
ASSUME DS: NOTHING
movsw
movsw
movsw
movsw
pop ds
ASSUME DS: DGROUP
; Line 17
$I106:
les bx,DWORD PTR [bp+6] ;val
call FAR PTR __aFeldd
mov es,WORD PTR $T20001
les bx,DWORD PTR es:_CurrentGraph
mov cl,3
mov si,WORD PTR [bp+10] ;range
shl si,cl
lea bx,WORD PTR [bx][si]
call FAR PTR __aFeldd
call FAR PTR __aFfcompp
jbe $EX105
; Line 18
mov es,WORD PTR $T20001
les bx,DWORD PTR es:_CurrentGraph
mov si,WORD PTR [bp+6] ;val
mov dx,WORD PTR [bp+8]
push ds
lea di,WORD PTR [bx][si]
mov ds,dx
ASSUME DS: NOTHING
movsw
movsw
movsw
movsw
pop ds
ASSUME DS: DGROUP
; Line 19
$EX105:
pop si
pop di
mov sp,bp
pop bp
ret
_check_range ENDP
C6BADEG_TEXT ENDS
END
*/west@turing.toronto.edu (Tom West) (06/14/90)
In article <j7c6203r7@tmsoft.uucp> mshiels@tmsoft.UUCP (Michael A. Shiels) writes: >One of my co workers was trying to start using Microsoft C 6.0 but found out >that it's just like Microsfot C 5.1. You have to disable most of the >optimizations so it will generate correct code. Here's his very simple sample >code which doesn't have anything to do with loops but is broken when you >specify loop optimizations. Unfortunately, I can confirm this. I have a bug into MS at the moment where MSC 6.0 will produce code that eventually crashes the machine. The specifics in this case are that if you eliminate the -Oe, it works, or if you eliminate the register declaration(!!) in the register long y line, it works! Strange behaviour for an option that supposedly ignores the register keyword when turned on. (Specifically, MSC 6.0 doesn't generate enough FP stack pops and eventually overflows the FP stack). This bug is into MS along with another two, but this is the only one that generates bad code. This is scary!. My project is 300k long so I *can't* exhaustively test it for code generation bugs! What am I to do? Unfortunately, I trusted new technology too much and put in features found only in 6.0. Now it looks like I'll pay for it. On the other hand, the poor tech support contact at MS is trying to do his best. It's just there isn't a hell of a lot he can do on circumstances like this. --------------------------- cl -Oe main.c --------------------------- #include <stdio.h> void TL1 (); _cdecl main() { for (;;) { long right = 2; double product = 1.0; if (right < 0) { long x; for (x = right; x <= -1; x++) product /= (double) 3.0; } else { register long y; for (y = right; y >= 1; y--) product *= (double) 3.0; }; TL1 (product); printf("%lf\n", product); } } void TL1 (value) double value; { } ---------------------------
cramer@optilink.UUCP (Clayton Cramer) (06/15/90)
In article <j7c6203r7@tmsoft.uucp>, mshiels@tmsoft.uucp (Michael A. Shiels) writes: > One of my co workers was trying to start using Microsoft C 6.0 but found out > that it's just like Microsfot C 5.1. You have to disable most of the > optimizations so it will generate correct code. Here's his very simple sample > code which doesn't have anything to do with loops but is broken when you specify > loop optimizations. I have had a similar problem, specifying the following flags: cl -Zi -AL -Gt16 -I../INCLUDE/ -c The code that I tried to compile was: RetCode = (*LFunctions[(int) *pLActions])(); pLActions++; Unless I specify -Od to disable all optimizations, pLActions is incremented BEFORE the indirection is performed. I no longer worry about benchmark comparisons of the Microsoft C compiler -- my experience is that -Od is necessary not only for debugging, but for execution as well. -- Clayton E. Cramer {pyramid,pixar,tekbspa}!optilink!cramer Pipe bomb: appropriate technology for living lightly on Mother Earth. :-) ---------------------------------------------------------------------------- Disclaimer? You must be kidding! No company would hold opinions like mine!