diff options
Diffstat (limited to 'gcc/stmt.c')
-rw-r--r-- | gcc/stmt.c | 114 |
1 files changed, 26 insertions, 88 deletions
diff --git a/gcc/stmt.c b/gcc/stmt.c index f283b7590c6..7d6c398fc58 100644 --- a/gcc/stmt.c +++ b/gcc/stmt.c @@ -35,6 +35,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include "config.h" #include "system.h" +#include "coretypes.h" +#include "tm.h" #include "rtl.h" #include "tree.h" @@ -166,9 +168,6 @@ struct nesting GTY(()) rtx start_label; /* Label at the end of the whole construct. */ rtx end_label; - /* Label before a jump that branches to the end of the whole - construct. This is where destructors go if any. */ - rtx alt_end_label; /* Label for `continue' statement to jump to; this is in front of the stepper of the loop. */ rtx continue_label; @@ -459,14 +458,6 @@ init_stmt_for_function () clear_last_expr (); } -/* Return nonzero if anything is pushed on the loop, condition, or case - stack. */ -int -in_control_zone_p () -{ - return cond_stack || loop_stack || case_stack; -} - /* Record the current file and line. Called from emit_line_note. */ void set_file_and_line_for_stmt (file, line) @@ -1480,8 +1471,6 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line) = (enum machine_mode *) alloca (noutputs * sizeof (enum machine_mode)); const char **constraints = (const char **) alloca ((noutputs + ninputs) * sizeof (const char *)); - /* The insn we have emitted. */ - rtx insn; int old_generating_concat_p = generating_concat_p; /* An ASM with no outputs needs to be treated as volatile, for now. */ @@ -1774,13 +1763,13 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line) if (noutputs == 1 && nclobbers == 0) { ASM_OPERANDS_OUTPUT_CONSTRAINT (body) = constraints[0]; - insn = emit_insn (gen_rtx_SET (VOIDmode, output_rtx[0], body)); + emit_insn (gen_rtx_SET (VOIDmode, output_rtx[0], body)); } else if (noutputs == 0 && nclobbers == 0) { /* No output operands: put in a raw ASM_OPERANDS rtx. */ - insn = emit_insn (body); + emit_insn (body); } else @@ -1867,7 +1856,7 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line) = gen_rtx_CLOBBER (VOIDmode, clobbered_reg); } - insn = emit_insn (body); + emit_insn (body); } /* For any outputs that needed reloading into registers, spill them @@ -2495,7 +2484,6 @@ expand_start_loop (exit_flag) thisloop->depth = ++nesting_depth; thisloop->data.loop.start_label = gen_label_rtx (); thisloop->data.loop.end_label = gen_label_rtx (); - thisloop->data.loop.alt_end_label = 0; thisloop->data.loop.continue_label = thisloop->data.loop.start_label; thisloop->exit_label = exit_flag ? thisloop->data.loop.end_label : 0; loop_stack = thisloop; @@ -2537,7 +2525,6 @@ expand_start_null_loop () thisloop->depth = ++nesting_depth; thisloop->data.loop.start_label = emit_note (NULL, NOTE_INSN_DELETED); thisloop->data.loop.end_label = gen_label_rtx (); - thisloop->data.loop.alt_end_label = NULL_RTX; thisloop->data.loop.continue_label = thisloop->data.loop.end_label; thisloop->exit_label = thisloop->data.loop.end_label; loop_stack = thisloop; @@ -2568,6 +2555,7 @@ expand_end_loop () rtx start_label = loop_stack->data.loop.start_label; rtx etc_note; int eh_regions, debug_blocks; + bool empty_test; /* Mark the continue-point at the top of the loop if none elsewhere. */ if (start_label == loop_stack->data.loop.continue_label) @@ -2611,6 +2599,7 @@ expand_end_loop () /* Scan insns from the top of the loop looking for the END_TOP_COND note. */ + empty_test = true; eh_regions = debug_blocks = 0; for (etc_note = start_label; etc_note ; etc_note = NEXT_INSN (etc_note)) if (GET_CODE (etc_note) == NOTE) @@ -2651,9 +2640,12 @@ expand_end_loop () else if (NOTE_LINE_NUMBER (etc_note) == NOTE_INSN_BLOCK_END) debug_blocks--; } + else if (INSN_P (etc_note)) + empty_test = false; if (etc_note && optimize + && ! empty_test && eh_regions == 0 && (debug_blocks == 0 || optimize >= 2) && NEXT_INSN (etc_note) != NULL_RTX @@ -2772,22 +2764,32 @@ expand_exit_loop_if_false (whichloop, cond) struct nesting *whichloop; tree cond; { - rtx label = gen_label_rtx (); - rtx last_insn; + rtx label; clear_last_expr (); if (whichloop == 0) whichloop = loop_stack; if (whichloop == 0) return 0; + + if (integer_nonzerop (cond)) + return 1; + if (integer_zerop (cond)) + return expand_exit_loop (whichloop); + + /* Check if we definitely won't need a fixup. */ + if (whichloop == nesting_stack) + { + jumpifnot (cond, whichloop->data.loop.end_label); + return 1; + } + /* In order to handle fixups, we actually create a conditional jump around an unconditional branch to exit the loop. If fixups are necessary, they go before the unconditional branch. */ - do_jump (cond, NULL_RTX, label); - last_insn = get_last_insn (); - if (GET_CODE (last_insn) == CODE_LABEL) - whichloop->data.loop.alt_end_label = last_insn; + label = gen_label_rtx (); + jumpif (cond, label); expand_goto_internal (NULL_TREE, whichloop->data.loop.end_label, NULL_RTX); emit_label (label); @@ -2811,17 +2813,6 @@ expand_exit_loop_top_cond (whichloop, cond) return 1; } -/* Return nonzero if the loop nest is empty. Else return zero. */ - -int -stmt_loop_nest_empty () -{ - /* cfun->stmt can be NULL if we are building a call to get the - EH context for a setjmp/longjmp EH target and the current - function was a deferred inline function. */ - return (cfun->stmt == NULL || loop_stack == NULL); -} - /* Return nonzero if we should preserve sub-expressions as separate pseudos. We never do so if we aren't optimizing. We always do so if -fexpensive-optimizations. @@ -3204,18 +3195,6 @@ expand_return (retval) expand_value_return (result_rtl); } } - -/* Return 1 if the end of the generated RTX is not a barrier. - This means code already compiled can drop through. */ - -int -drop_through_at_end_p () -{ - rtx insn = get_last_insn (); - while (insn && GET_CODE (insn) == NOTE) - insn = PREV_INSN (insn); - return insn && GET_CODE (insn) != BARRIER; -} /* Attempt to optimize a potential tail recursion call into a goto. ARGUMENTS are the arguments to a CALL_EXPR; LAST_INSN indicates @@ -3833,7 +3812,6 @@ void expand_decl (decl) tree decl; { - struct nesting *thisblock; tree type; type = TREE_TYPE (decl); @@ -3859,8 +3837,6 @@ expand_decl (decl) if (TREE_STATIC (decl) || DECL_EXTERNAL (decl)) return; - thisblock = block_stack; - /* Create the RTL representation for the variable. */ if (type == error_mark_node) @@ -4326,24 +4302,6 @@ end_cleanup_deferral () --block_stack->data.block.conditional_code; } -/* Move all cleanups from the current block_stack - to the containing block_stack, where they are assumed to - have been created. If anything can cause a temporary to - be created, but not expanded for more than one level of - block_stacks, then this code will have to change. */ - -void -move_cleanups_up () -{ - struct nesting *block = block_stack; - struct nesting *outer = block->next; - - outer->data.block.cleanups - = chainon (block->data.block.cleanups, - outer->data.block.cleanups); - block->data.block.cleanups = 0; -} - tree last_cleanup_this_contour () { @@ -4453,26 +4411,6 @@ expand_start_case_dummy () nesting_stack = thiscase; start_cleanup_deferral (); } - -/* End a dummy case statement. */ - -void -expand_end_case_dummy () -{ - end_cleanup_deferral (); - POPSTACK (case_stack); -} - -/* Return the data type of the index-expression - of the innermost case statement, or null if none. */ - -tree -case_index_expr_type () -{ - if (case_stack) - return TREE_TYPE (case_stack->data.case_stmt.index_expr); - return 0; -} static void check_seenlabel () |