Subject: Re: -O2 vax compiler bug?
To: Chuck Cranor <chuck@research.att.com>
From: Matt Thomas <matt@3am-software.com>
List: tech-toolchain
Date: 02/21/2002 11:46:48
At 05:21 PM 9/10/2001 -0400, Chuck Cranor wrote:
>hi-
>
> while attempting to compile a -current vax, i discovered
>that the /bin/cp command no longer works. i boiled it down
>to the code segment included below. it fails with both 1.5.2
>and -current.
>
> can anyone fix it? my vax needs a working /bin/cp.
>
>
>
>the difference between the working -O version and the broken
>-O2 version is:
>
>vax[45]> diff utils-o.s utils-o2.s
>19c19
>< movab -96(fp),r0
>---
> > movab -96(fp),r1
>25c25
>< tstl 56(r0)
>---
> > movl 56(r1),r0
>28c28
>< tstl 52(r0)
>---
> > movl 52(r1),r0
>30c30
>< cmpl 52(r0),$8388608
>---
> > cmpl r0,$8388608
>vax[46]>
>
>
>the problem is with changing the tstl's into movl's and the effect
>on the condition codes. the web pages below claim that tstl clears
>both "C" and "V" condition codes, while "movl" clears "V" but
>preserves "C"
>
>(see:
>http://www.openvms.compaq.com:8000/73final/4515/4515pro_018.html#index_x_704
>http://www.openvms.compaq.com:8000/73final/4515/4515pro_017.html#index_x_681 )
>
>
>it then uses blequ:
>0x1846 <main+50>: movl 52(r1),r0
>0x184a <main+54>: blequ 0x1866
>
>http://www.openvms.compaq.com:8000/73final/4515/4515pro_019.html#index_x_759
>says blequ tests both C and Z to determine if it should jump.
>
>something is wrong with the handling of C.
This turned out to be a 1 line fix in gcc/config/vax/vax.h. However,
until I do a complete build I'm not sure of the side effects, if any.
===================================================================
RCS file: /cvsroot/gnusrc/gnu/dist/toolchain/gcc/config/vax/vax.h,v
retrieving revision 1.8
diff -u -r1.8 vax.h
--- vax.h 2001/05/09 15:04:48 1.8
+++ vax.h 2002/02/21 19:30:16
@@ -904,7 +904,7 @@
CC_STATUS_INIT; \
else if (GET_CODE (SET_DEST (EXP)) != ZERO_EXTRACT \
&& GET_CODE (SET_DEST (EXP)) != PC) \
- { cc_status.flags = 0; \
+ { cc_status.flags = CC_NO_OVERFLOW; \
cc_status.value1 = SET_DEST (EXP); \
cc_status.value2 = SET_SRC (EXP); } } \
else if (GET_CODE (EXP) == PARALLEL \
This tells final.c to ignore the C (even though it's called
CC_NO_OVERFLOW) bit when generating is branches. This causes
your test program (and cp) to work correctly.
--
Matt Thomas Internet: matt@3am-software.com
3am Software Foundry WWW URL: http://www.3am-software.com/bio/matt/
Cupertino, CA Disclaimer: I avow all knowledge of this message