summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rwxr-xr-xgcc/calls.c27
-rwxr-xr-xgcc/config/arm/thumb.c59
-rwxr-xr-xgcc/config/arm/thumb.h4
-rwxr-xr-xgcc/config/arm/thumb.md6
-rwxr-xr-xgcc/function.c31
-rwxr-xr-xgcc/jump.c37
-rwxr-xr-xgcc/reorg.c138
-rwxr-xr-xgcc/stmt.c75
8 files changed, 1 insertions, 376 deletions
diff --git a/gcc/calls.c b/gcc/calls.c
index e2a179e..4f2c148 100755
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -1025,21 +1025,6 @@ expand_call (exp, target, ignore)
/* This call returns a big structure. */
is_const = 0;
-#ifdef PCC_STATIC_STRUCT_RETURN
- {
- pcc_struct_value = 1;
- /* Easier than making that case work right. */
- if (is_integrable)
- {
- /* In case this is a static function, note that it has been
- used. */
- if (! TREE_ADDRESSABLE (fndecl))
- mark_addressable (fndecl);
- is_integrable = 0;
- }
- }
-#else /* not PCC_STATIC_STRUCT_RETURN */
- {
struct_value_size = int_size_in_bytes (TREE_TYPE (exp));
if (target && GET_CODE (target) == MEM)
@@ -1065,8 +1050,6 @@ expand_call (exp, target, ignore)
TREE_USED (d) = 1;
target = 0;
}
- }
-#endif /* not PCC_STATIC_STRUCT_RETURN */
}
/* If called function is inline, try to integrate it. */
@@ -2912,21 +2895,11 @@ emit_library_call_value VPROTO((rtx orgfun, rtx value, int no_queue,
decide where in memory it should come back. */
if (aggregate_value_p (type_for_mode (outmode, 0)))
{
-#ifdef PCC_STATIC_STRUCT_RETURN
- rtx pointer_reg
- = hard_function_value (build_pointer_type (type_for_mode (outmode, 0)),
- 0);
- mem_value = gen_rtx_MEM (outmode, pointer_reg);
- pcc_struct_value = 1;
- if (value == 0)
- value = gen_reg_rtx (outmode);
-#else /* not PCC_STATIC_STRUCT_RETURN */
struct_value_size = GET_MODE_SIZE (outmode);
if (value != 0 && GET_CODE (value) == MEM)
mem_value = value;
else
mem_value = assign_stack_temp (outmode, GET_MODE_SIZE (outmode), 0);
-#endif
/* This call returns a big structure. */
is_const = 0;
diff --git a/gcc/config/arm/thumb.c b/gcc/config/arm/thumb.c
index 1aaff01..05ded97 100755
--- a/gcc/config/arm/thumb.c
+++ b/gcc/config/arm/thumb.c
@@ -741,65 +741,6 @@ far_jump_used_p()
static int return_used_this_function = 0;
-char *
-output_return()
-{
- int regno;
- int live_regs_mask = 0;
-
- /* If a function is naked, don't use the "return" insn. */
- if (arm_naked_function_p(current_function_decl))
- return "";
-
- return_used_this_function = 1;
-
- for (regno = 0; regno < 8; regno++)
- if (regs_ever_live[regno] && !call_used_regs[regno])
- live_regs_mask |= 1 << regno;
-
- if (live_regs_mask == 0)
- {
- if (leaf_function_p() && !far_jump_used_p())
- {
- thumb_exit(asm_out_file, 14);
- }
- else if (TARGET_THUMB_INTERWORK)
- {
- thumb_exit(asm_out_file, -1);
- }
- else
- {
- asm_fprintf(asm_out_file, "\tpop\t{pc}\n");
- }
- }
- else
- {
- asm_fprintf(asm_out_file, "\tpop\t{");
-
- for (regno = 0; live_regs_mask; regno++, live_regs_mask >>= 1)
- {
- if (live_regs_mask & 1)
- {
- asm_fprintf(asm_out_file, reg_names[regno]);
- if (live_regs_mask & ~1)
- asm_fprintf(asm_out_file, ", ");
- }
- }
-
- if (TARGET_THUMB_INTERWORK)
- {
- asm_fprintf(asm_out_file, "}\n");
- thumb_exit(asm_out_file, -1);
- }
- else
- {
- asm_fprintf(asm_out_file, ", pc}\n");
- }
- }
-
- return "";
-}
-
void
thumb_function_prologue(FILE *f, int frame_size)
{
diff --git a/gcc/config/arm/thumb.h b/gcc/config/arm/thumb.h
index 2c65886..e38281c 100755
--- a/gcc/config/arm/thumb.h
+++ b/gcc/config/arm/thumb.h
@@ -1148,12 +1148,8 @@ int thumb_shiftable_const ();
limited PC addressing range: */
#define MACHINE_DEPENDENT_REORG(INSN) thumb_reorg ((INSN))
-/* True if a return instruction can be used in this function. */
-#define USE_RETURN reload_completed
-
extern char * thumb_unexpanded_epilogue ();
extern char * output_move_mem_multiple ();
extern char * thumb_load_double_from_address ();
-extern char * output_return ();
extern int far_jump_used_p();
diff --git a/gcc/config/arm/thumb.md b/gcc/config/arm/thumb.md
index 1769ac9..ea4fa9c 100755
--- a/gcc/config/arm/thumb.md
+++ b/gcc/config/arm/thumb.md
@@ -993,12 +993,6 @@
""
"mov\\tpc, %0")
-(define_insn "return"
- [(return)]
- "USE_RETURN"
- "* return output_return ();"
-[(set_attr "length" "18")])
-
;; Call insns
(define_expand "call"
diff --git a/gcc/function.c b/gcc/function.c
index 0b9701b..6e37df4 100755
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -5690,9 +5690,6 @@ init_function_start (subr, filename, line)
/* Set flags used by final.c. */
if (aggregate_value_p (DECL_RESULT (subr)))
{
-#ifdef PCC_STATIC_STRUCT_RETURN
- current_function_returns_pcc_struct = 1;
-#endif
current_function_returns_struct = 1;
}
@@ -5799,17 +5796,7 @@ expand_function_start (subr, parms_have_cleanups)
/* Make the label for return statements to jump to, if this machine
does not have a one-instruction return and uses an epilogue,
or if it returns a structure, or if it has parm cleanups. */
-#ifdef HAVE_return
- if (cleanup_label == 0 && HAVE_return
- && ! current_function_instrument_entry_exit
- && ! current_function_returns_pcc_struct
- && ! (current_function_returns_struct && ! optimize))
- return_label = 0;
- else
- return_label = gen_label_rtx ();
-#else
return_label = gen_label_rtx ();
-#endif
/* Initialize rtx used to return the value. */
/* Do this before assign_parms so that we copy the struct value address
@@ -5821,15 +5808,7 @@ expand_function_start (subr, parms_have_cleanups)
/* Returning something that won't go in a register. */
register rtx value_address = 0;
-#ifdef PCC_STATIC_STRUCT_RETURN
- if (current_function_returns_pcc_struct)
- {
- int size = int_size_in_bytes (TREE_TYPE (DECL_RESULT (subr)));
- value_address = assemble_static_space (size);
- }
- else
-#endif
- {
+
/* Expect to be passed the address of a place to store the value.
If it is passed as an argument, assign_parms will take care of
it. */
@@ -5838,7 +5817,6 @@ expand_function_start (subr, parms_have_cleanups)
value_address = gen_reg_rtx (Pmode);
emit_move_insn (value_address, struct_value_incoming_rtx);
}
- }
if (value_address)
{
DECL_RTL (DECL_RESULT (subr))
@@ -6370,13 +6348,6 @@ expand_function_end (filename, line, end_bindings)
Otherwise, let the rtl chain end here, to drop through
into the epilogue. */
-#ifdef HAVE_return
- if (HAVE_return)
- {
- emit_jump_insn (gen_return ());
- emit_barrier ();
- }
-#endif
/* Fix up any gotos that jumped out to the outermost
binding level of the function.
diff --git a/gcc/jump.c b/gcc/jump.c
index a3de04e..85452dd 100755
--- a/gcc/jump.c
+++ b/gcc/jump.c
@@ -243,24 +243,6 @@ jump_optimize (f, cross_jump, noop_moves, after_regscan)
return;
}
-#ifdef HAVE_return
- if (HAVE_return)
- {
- /* If we fall through to the epilogue, see if we can insert a RETURN insn
- in front of it. If the machine allows it at this point (we might be
- after reload for a leaf routine), it will improve optimization for it
- to be there. */
- insn = get_last_insn ();
- while (insn && GET_CODE (insn) == NOTE)
- insn = PREV_INSN (insn);
-
- if (insn && GET_CODE (insn) != BARRIER)
- {
- emit_jump_insn (gen_return ());
- emit_barrier ();
- }
- }
-#endif
if (noop_moves)
delete_noop_moves (f);
@@ -2072,25 +2054,6 @@ jump_optimize (f, cross_jump, noop_moves, after_regscan)
}
}
-#ifdef HAVE_return
- if (HAVE_return)
- {
- /* If we fall through to the epilogue, see if we can insert a RETURN insn
- in front of it. If the machine allows it at this point (we might be
- after reload for a leaf routine), it will improve optimization for it
- to be there. We do this both here and at the start of this pass since
- the RETURN might have been deleted by some of our optimizations. */
- insn = get_last_insn ();
- while (insn && GET_CODE (insn) == NOTE)
- insn = PREV_INSN (insn);
-
- if (insn && GET_CODE (insn) != BARRIER)
- {
- emit_jump_insn (gen_return ());
- emit_barrier ();
- }
- }
-#endif
can_reach_end = calculate_can_reach_end (last_insn, 0, 1);
diff --git a/gcc/reorg.c b/gcc/reorg.c
index dc5606e..a636a43 100755
--- a/gcc/reorg.c
+++ b/gcc/reorg.c
@@ -374,17 +374,6 @@ find_end_label ()
end_of_function_label = gen_label_rtx ();
LABEL_NUSES (end_of_function_label) = 0;
emit_label (end_of_function_label);
-#ifdef HAVE_return
- if (HAVE_return)
- {
- /* The return we make may have delay slots too. */
- rtx insn = gen_return ();
- insn = emit_jump_insn (insn);
- emit_barrier ();
- if (num_delay_slots (insn) > 0)
- obstack_ptr_grow (&unfilled_slots_obstack, insn);
- }
-#endif
}
/* Show one additional use for this label so it won't go away until
@@ -3353,129 +3342,6 @@ relax_delay_slots (first)
}
}
-#ifdef HAVE_return
-
-/* Look for filled jumps to the end of function label. We can try to convert
- them into RETURN insns if the insns in the delay slot are valid for the
- RETURN as well. */
-
-static void
-make_return_insns (first)
- rtx first;
-{
- rtx insn, jump_insn, pat;
- rtx real_return_label = end_of_function_label;
- int slots, i;
-
- /* See if there is a RETURN insn in the function other than the one we
- made for END_OF_FUNCTION_LABEL. If so, set up anything we can't change
- into a RETURN to jump to it. */
- for (insn = first; insn; insn = NEXT_INSN (insn))
- if (GET_CODE (insn) == JUMP_INSN && GET_CODE (PATTERN (insn)) == RETURN)
- {
- real_return_label = get_label_before (insn);
- break;
- }
-
- /* Show an extra usage of REAL_RETURN_LABEL so it won't go away if it
- was equal to END_OF_FUNCTION_LABEL. */
- LABEL_NUSES (real_return_label)++;
-
- /* Clear the list of insns to fill so we can use it. */
- obstack_free (&unfilled_slots_obstack, unfilled_firstobj);
-
- for (insn = first; insn; insn = NEXT_INSN (insn))
- {
- int flags;
-
- /* Only look at filled JUMP_INSNs that go to the end of function
- label. */
- if (GET_CODE (insn) != INSN
- || GET_CODE (PATTERN (insn)) != SEQUENCE
- || GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) != JUMP_INSN
- || JUMP_LABEL (XVECEXP (PATTERN (insn), 0, 0)) != end_of_function_label)
- continue;
-
- pat = PATTERN (insn);
- jump_insn = XVECEXP (pat, 0, 0);
-
- /* If we can't make the jump into a RETURN, try to redirect it to the best
- RETURN and go on to the next insn. */
- if (! reorg_redirect_jump (jump_insn, NULL_RTX))
- {
- /* Make sure redirecting the jump will not invalidate the delay
- slot insns. */
- if (redirect_with_delay_slots_safe_p (jump_insn,
- real_return_label,
- insn))
- reorg_redirect_jump (jump_insn, real_return_label);
- continue;
- }
-
- /* See if this RETURN can accept the insns current in its delay slot.
- It can if it has more or an equal number of slots and the contents
- of each is valid. */
-
- flags = get_jump_flags (jump_insn, JUMP_LABEL (jump_insn));
- slots = num_delay_slots (jump_insn);
- if (slots >= XVECLEN (pat, 0) - 1)
- {
- for (i = 1; i < XVECLEN (pat, 0); i++)
- if (! (
-#ifdef ANNUL_IFFALSE_SLOTS
- (INSN_ANNULLED_BRANCH_P (jump_insn)
- && INSN_FROM_TARGET_P (XVECEXP (pat, 0, i)))
- ? eligible_for_annul_false (jump_insn, i - 1,
- XVECEXP (pat, 0, i), flags) :
-#endif
-#ifdef ANNUL_IFTRUE_SLOTS
- (INSN_ANNULLED_BRANCH_P (jump_insn)
- && ! INSN_FROM_TARGET_P (XVECEXP (pat, 0, i)))
- ? eligible_for_annul_true (jump_insn, i - 1,
- XVECEXP (pat, 0, i), flags) :
-#endif
- eligible_for_delay (jump_insn, i -1, XVECEXP (pat, 0, i), flags)))
- break;
- }
- else
- i = 0;
-
- if (i == XVECLEN (pat, 0))
- continue;
-
- /* We have to do something with this insn. If it is an unconditional
- RETURN, delete the SEQUENCE and output the individual insns,
- followed by the RETURN. Then set things up so we try to find
- insns for its delay slots, if it needs some. */
- if (GET_CODE (PATTERN (jump_insn)) == RETURN)
- {
- rtx prev = PREV_INSN (insn);
-
- delete_insn (insn);
- for (i = 1; i < XVECLEN (pat, 0); i++)
- prev = emit_insn_after (PATTERN (XVECEXP (pat, 0, i)), prev);
-
- insn = emit_jump_insn_after (PATTERN (jump_insn), prev);
- emit_barrier_after (insn);
-
- if (slots)
- obstack_ptr_grow (&unfilled_slots_obstack, insn);
- }
- else
- /* It is probably more efficient to keep this with its current
- delay slot as a branch to a RETURN. */
- reorg_redirect_jump (jump_insn, real_return_label);
- }
-
- /* Now delete REAL_RETURN_LABEL if we never used it. Then try to fill any
- new delay slots we have created. */
- if (--LABEL_NUSES (real_return_label) == 0)
- delete_insn (real_return_label);
-
- fill_simple_delay_slots (1);
- fill_simple_delay_slots (0);
-}
-#endif
/* Try to find insns to place in delay slots. */
@@ -3589,10 +3455,6 @@ dbr_schedule (first, file)
if (end_of_function_label && --LABEL_NUSES (end_of_function_label) == 0)
delete_insn (end_of_function_label);
-#ifdef HAVE_return
- if (HAVE_return && end_of_function_label != 0)
- make_return_insns (first);
-#endif
obstack_free (&unfilled_slots_obstack, unfilled_firstobj);
diff --git a/gcc/stmt.c b/gcc/stmt.c
index 828e371..0f21741 100755
--- a/gcc/stmt.c
+++ b/gcc/stmt.c
@@ -2472,17 +2472,6 @@ expand_null_return_1 (last_insn, use_goto)
return;
}
- /* Otherwise output a simple return-insn if one is available,
- unless it won't do the job. */
-#ifdef HAVE_return
- if (HAVE_return && use_goto == 0 && cleanup_label == 0)
- {
- emit_jump_insn (gen_return ());
- emit_barrier ();
- return;
- }
-#endif
-
/* Otherwise jump to the epilogue. */
expand_goto_internal (NULL_TREE, end_label, last_insn);
}
@@ -2578,70 +2567,6 @@ expand_return (retval)
if (optimize_tail_recursion (retval_rhs, last_insn))
return;
-#ifdef HAVE_return
- /* This optimization is safe if there are local cleanups
- because expand_null_return takes care of them.
- ??? I think it should also be safe when there is a cleanup label,
- because expand_null_return takes care of them, too.
- Any reason why not? */
- if (HAVE_return && cleanup_label == 0
- && ! current_function_returns_pcc_struct
- && BRANCH_COST <= 1)
- {
- /* If this is return x == y; then generate
- if (x == y) return 1; else return 0;
- if we can do it with explicit return insns and branches are cheap,
- but not if we have the corresponding scc insn. */
- int has_scc = 0;
- if (retval_rhs)
- switch (TREE_CODE (retval_rhs))
- {
- case EQ_EXPR:
-#ifdef HAVE_seq
- has_scc = HAVE_seq;
-#endif
- case NE_EXPR:
-#ifdef HAVE_sne
- has_scc = HAVE_sne;
-#endif
- case GT_EXPR:
-#ifdef HAVE_sgt
- has_scc = HAVE_sgt;
-#endif
- case GE_EXPR:
-#ifdef HAVE_sge
- has_scc = HAVE_sge;
-#endif
- case LT_EXPR:
-#ifdef HAVE_slt
- has_scc = HAVE_slt;
-#endif
- case LE_EXPR:
-#ifdef HAVE_sle
- has_scc = HAVE_sle;
-#endif
- case TRUTH_ANDIF_EXPR:
- case TRUTH_ORIF_EXPR:
- case TRUTH_AND_EXPR:
- case TRUTH_OR_EXPR:
- case TRUTH_NOT_EXPR:
- case TRUTH_XOR_EXPR:
- if (! has_scc)
- {
- op0 = gen_label_rtx ();
- jumpifnot (retval_rhs, op0);
- expand_value_return (const1_rtx);
- emit_label (op0);
- expand_value_return (const0_rtx);
- return;
- }
- break;
-
- default:
- break;
- }
- }
-#endif /* HAVE_return */
/* If the result is an aggregate that is being returned in one (or more)
registers, load the registers here. The compiler currently can't handle