[gnu.gcc.bug] mode confusion bug in 1.30

bunda@cs.utexas.edu (John Bunda) (11/11/88)

This bug occurs in my port to our experimental machine (METRIC),
I haven't checked to see if it occurs for other little-endian
memory machines.  

The problem occurs when a global memory reference is used in a
shorter mode than its natural one; in this case, when adding
a global int to a local short.  The program test.c:

extern int x;
bad_load()
{
  register short y = 5;
  y += x;
  return y;
}

TRULY_NOOP_TRUNCATION is defined as 0, and truncation insns
are defined only on
The code generated for my machine with incorrect code noted:

%%    Metric gcc output
%%    gcc level 1.30 11/10/88
	.text
	.align  2
LC0:
	.long   _x
	.align  1
	.globl  _test
_test: 
% test (C function)
% stack usage:      0 bytes argument overflow
%                  32 bytes register save
%                   0 bytes local stack frame
    .using  _test,r2
    stm     r1,r8,-128(r4)
    move    r2,r25
    lda     r3,-128(r4)
    lda     r4,-128(r4)
	ldi     r6,5
	ld      r7,LC0     <----- load address of x (declared extern int)
	ldh     r8,0(r7)   <----- but load wrong halfword - should be 2(r7)
	move    r7,r6
	shli    r7,16
	shrai   r7,16
	shli    r8,16
	shrai   r8,16
	add     r7,r8
	move    r6,r7
	move    r26,r6
	shli    r26,16
	shrai   r26,16
	j       L1
L1:
    ldm     r1,r8,0(r3)
    return
    .drop   r2
% End of function test
%

******* 
Here is the RTL from:   gcc -S -dr test.c
*******

;; Function test

(note 1 0 2 "" -1)

(note 2 1 3 "" -2)

(insn 3 2 4 (use (reg/v:HI 32)) -1 (nil)
   (nil))

(insn 4 3 5 (set (reg/v:HI 32)
       (const_int 5)) -1 (nil)
   (nil))

(insn 5 4 6 (set (reg:SI 33)
       (mem:SI (symbol_ref/u:SI ("*LC0")))) -1 (nil)
   (expr_list:SI (symbol_ref:SI ("x"))
       (nil)))

(insn 6 5 7 (set (reg:HI 34)             
       (mem:HI (reg:SI 33))) -1 (nil)     <- note ref of memory in wrong mode here
   (nil))

(insn 7 6 8 (set (reg:SI 35)
       (sign_extend:SI (reg/v:HI 32))) -1 (nil)
   (nil))

(insn 8 7 10 (set (reg:SI 36)
       (sign_extend:SI (reg:HI 34))) -1 (nil)
   (nil))

(insn 10 8 11 (set (reg:SI 37)
       (plus:SI (reg:SI 35)
           (reg:SI 36))) -1 (nil)
   (nil))

(insn 11 10 12 (set (reg/v:HI 32)
       (subreg:HI (reg:SI 37) 0)) -1 (nil)
   (nil))

(insn 12 11 13 (set (reg/i:SI 26)
       (sign_extend:SI (reg/v:HI 32))) -1 (nil)
   (nil))

(insn 13 12 14 (use (reg/i:SI 26)) -1 (nil)
   (nil))

(jump_insn 14 13 15 (set (pc)
       (label_ref 19)) -1 (nil)
   (nil))

(barrier 15 14 16)

(note 16 15 17 "" -3)

(insn 17 16 18 (use (reg/v:HI 32)) -1 (nil)
   (nil))

(note 18 17 19 "" -6)

(code_label 19 18 0 1)

**** end of RTL ****

Thanks!

-John
..................................
John Bunda            UT CS Dept.      
bunda@cs.utexas.edu   Austin, Texas    

bunda@cs.utexas.edu (John Bunda) (11/11/88)

Apologies - I located the problem described in the previous posting,
and it is not a gcc problem.  please ignore it.
-john


-- 
...................................
John Bunda            UT CS Dept.      
bunda@cs.utexas.edu   Austin, Texas