This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
variable-arrays problem
- From: Dale Johannesen <dalej at apple dot com>
- To: gcc at gcc dot gnu dot org
- Date: Wed, 7 Aug 2002 10:50:52 -0700
- Subject: variable-arrays problem
I'm looking at a problem in code similar to the following:
int y;
{ int a[f()];
...
y = a[0];
}
...reference to y...
The scheduler can move the load of a[0] across the code that
pops a[] from the stack; there is no dependency telling it
not to do that. Areas below the stack pointer are subject
to random clobbering by context switches on many targets, so
this is not a good thing. RTL for ppc below; x86 has the
same basic problem. Note there's no dependency, direct or
indirect, between 117 and 120. I'm not sure how to fix this.
Will adding a clobber(MEM(a)) at the end of the block suffice?
; r29 was set equal to &a[0] much earlier in the block...
; load a[0]
(insn 117 113 119 (set (reg/v:SI 3 r3 [116])
(mem/j:SI (reg/f:SI 29 r29 [134]) [0 a+0 S4 A32])) 311
{*movsi_internal\
1} (insn_list 56 (insn_list:REG_DEP_ANTI 113 (nil)))
(expr_list:REG_DEAD (reg/f:SI 29 r29 [134])
(nil)))
; load previous frame pointer from current stack bottom
; (part of ppc calling convention, ymmv, and not really
; relevant to the problem)
(insn:TI 119 117 120 (set (reg:SI 0 r0 [152])
(mem:SI (reg/f:SI 1 r1) [0 S4 A8])) 311 {*movsi_internal1}
(insn_list:R\
EG_DEP_OUTPUT 87 (insn_list 89 (insn_list:REG_DEP_ANTI 113 (nil))))
(nil))
; restore old stack bottom
(insn 120 119 121 (set (reg/f:SI 1 r1)
(reg/f:SI 28 r28 [117])) 311 {*movsi_internal1}
(insn_list:REG_DEP_ANTI\
118 (insn_list:REG_DEP_ANTI 112 (insn_list:REG_DEP_ANTI 113
(insn_list:REG_DEP\
_ANTI 119 (insn_list:REG_DEP_OUTPUT 89 (insn_list 14 (nil)))))))
(expr_list:REG_DEAD (reg/f:SI 28 r28 [117])
(nil)))
; store previous frame pointer into new stack bottom
(insn:TI 121 120 174 (set (mem:SI (reg/f:SI 1 r1) [0 S4 A8])
(reg:SI 0 r0 [152])) 311 {*movsi_internal1} (insn_list 120
(insn_list:R\
EG_DEP_ANTI 113 (insn_list 119 (insn_list:REG_DEP_ANTI 117 (nil)))))
(expr_list:REG_DEAD (reg:SI 0 r0 [152])
(nil)))
(note 174 121 132 0xe61180 NOTE_INSN_BLOCK_END)