problem in jump.c

Herman ten Brugge Haj.Ten.Brugge@net.HCC.nl
Thu Nov 5 17:07:00 GMT 1998


Hello,

I discovered a bug in jump.c. The if/then/else transformations is not
working anymore because the patch Jim Wilson made was a bit over
productive. The patch checked with the aid off modified_between_p
if a register was modified. The result of this call was allways '1'
because the 'pc' was included in the insn passed to modified_between_p.
The insn passed is something like: (c4x example)

(jump_insn 94 93 96 (set (pc)
        (if_then_else (ge (reg:CC 21 st)
                (const_int 0))
            (label_ref 99)
            (pc))) 198 {*b} (nil)
    (nil))

The actual test should only test the if/then/else part of the insn:

(ge (reg:CC 21 st)
    (const_int 0))

I contacted Jim Wilson and he agreed that he only wanted to test the
registers in the if/then/else part.
It is save to use 'XEXP (SET_SRC (PATTERN (temp)), 0)' in the patch below
because we checked that temp is a condjump_p before we arive here.
The previous patch disabled code like:

	x = a > b ? a : b;

Normally this would result in an if/then/else. This will be rewritten by
jump into:

	if (...) x = a; else x = b;  ---> x = b; if (...) x = a;

After this a conditional load can be performed and all jumps are gone.
This is a big win on a c4x and other platforms that have conditional
loads. The patch below enables this transformation again.

	Herman.


Wed Nov  4 16:24:51 1998 Herman A.J. ten Brugge <Haj.Ten.Brugge@net.HCC.nl>

	* jump.c (jump_optimize): In if/then/else transformations. Only check
	registers in if/then/else part when calling modified_between_p.


--- jump.c.org	Wed Nov  4 16:11:06 1998
+++ jump.c	Wed Nov  4 16:38:40 1998
@@ -860,7 +860,8 @@ jump_optimize (f, cross_jump, noop_moves
 		      || ! modified_between_p (SET_SRC (temp4), p, temp2))
 		  /* Verify that registers used by the jump are not clobbered
 		     by the instruction being moved.  */
-		  && ! modified_between_p (PATTERN (temp), temp2,
+		  && ! modified_between_p (XEXP (SET_SRC (PATTERN (temp)), 0),
+					   temp2,
 					   NEXT_INSN (temp2)))
 		{
 		  emit_insn_after_with_line_notes (PATTERN (temp2), p, temp2);


-- 
-------------------------------------------------------------------------
Herman ten Brugge			Email:	Haj.Ten.Brugge@net.HCC.nl



More information about the Gcc-bugs mailing list