diff options
author | Richard Henderson <rth@redhat.com> | 2004-03-02 16:18:12 -0800 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2004-03-02 16:18:12 -0800 |
commit | 0eadce5226808dfd6180effb4de3ad794d72c84d (patch) | |
tree | 48915b803035c7d3f508c1b607144a9e6631ffd6 /gcc | |
parent | 3a75069d35c288ccdeceeff6daecca227dda81a2 (diff) | |
download | gcc-0eadce5226808dfd6180effb4de3ad794d72c84d.zip gcc-0eadce5226808dfd6180effb4de3ad794d72c84d.tar.gz gcc-0eadce5226808dfd6180effb4de3ad794d72c84d.tar.bz2 |
re PR middle-end/14327 (-O0 -fdefer-pop generates wrong code)
PR middle-end/14327
* stmt.c (expand_computed_goto): Do do_pending_stack_adjust before
emitting the label, not after.
* gcc.c-torture/execute/20040302-1.c: New.
From-SVN: r78798
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/stmt.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/20040302-1.c | 24 |
3 files changed, 31 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8bc1d5a..1a8e333 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-03-02 Richard Henderson <rth@redhat.com> + + PR middle-end/14327 + * stmt.c (expand_computed_goto): Do do_pending_stack_adjust before + emitting the label, not after. + 2004-03-02 Stephane Carrez <stcarrez@nerim.fr> * config/m68hc11/m68hc11.c (m68hc11_addr_mode): New variable. @@ -524,9 +524,9 @@ expand_computed_goto (tree exp) { cfun->computed_goto_common_reg = copy_to_mode_reg (Pmode, x); cfun->computed_goto_common_label = gen_label_rtx (); - emit_label (cfun->computed_goto_common_label); do_pending_stack_adjust (); + emit_label (cfun->computed_goto_common_label); emit_indirect_jump (cfun->computed_goto_common_reg); current_function_has_computed_jump = 1; diff --git a/gcc/testsuite/gcc.c-torture/execute/20040302-1.c b/gcc/testsuite/gcc.c-torture/execute/20040302-1.c new file mode 100644 index 0000000..07056c4 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/20040302-1.c @@ -0,0 +1,24 @@ +int code[]={0,0,0,0,1}; + +void foo(int x) { + volatile int b; + b = 0xffffffff; +} + +void bar(int *pc) { + static const void *l[] = {&&lab0, &&end}; + + foo(0); + goto *l[*pc]; + lab0: + foo(0); + pc++; + goto *l[*pc]; + end: + return; +} + +int main() { + bar(code); + return 0; +} |