mirror of git://gcc.gnu.org/git/gcc.git
reg-stack.c (convert_regs_1): Return boolean value, true if the CFG has been modified.
* reg-stack.c (convert_regs_1): Return boolean value, true if the CFG has been modified. (convert_regs_2): Likewise. Adjust calls to convert_regs_1. (convert_regs): Adjust calls to convert_regs_2. Clean up the CFG if it has been modified. From-SVN: r165905
This commit is contained in:
parent
0e7e15278e
commit
12929514e7
|
@ -1,3 +1,11 @@
|
||||||
|
2010-10-24 Eric Botcazou <ebotcazou@adacore.com>
|
||||||
|
|
||||||
|
* reg-stack.c (convert_regs_1): Return boolean value, true if the CFG
|
||||||
|
has been modified.
|
||||||
|
(convert_regs_2): Likewise. Adjust calls to convert_regs_1.
|
||||||
|
(convert_regs): Adjust calls to convert_regs_2. Clean up the CFG if
|
||||||
|
it has been modified.
|
||||||
|
|
||||||
2010-10-24 Eric Botcazou <ebotcazou@adacore.com>
|
2010-10-24 Eric Botcazou <ebotcazou@adacore.com>
|
||||||
|
|
||||||
* config/sparc/sparc.c (sparc_type_code) <NULLPTR_TYPE>: New case.
|
* config/sparc/sparc.c (sparc_type_code) <NULLPTR_TYPE>: New case.
|
||||||
|
|
|
@ -2876,9 +2876,10 @@ better_edge (edge e1, edge e2)
|
||||||
return (e1->src->index < e2->src->index) ? e1 : e2;
|
return (e1->src->index < e2->src->index) ? e1 : e2;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Convert stack register references in one block. */
|
/* Convert stack register references in one block. Return true if the CFG
|
||||||
|
has been modified in the process. */
|
||||||
|
|
||||||
static void
|
static bool
|
||||||
convert_regs_1 (basic_block block)
|
convert_regs_1 (basic_block block)
|
||||||
{
|
{
|
||||||
struct stack_def regstack;
|
struct stack_def regstack;
|
||||||
|
@ -2886,6 +2887,7 @@ convert_regs_1 (basic_block block)
|
||||||
int reg;
|
int reg;
|
||||||
rtx insn, next;
|
rtx insn, next;
|
||||||
bool control_flow_insn_deleted = false;
|
bool control_flow_insn_deleted = false;
|
||||||
|
bool cfg_altered = false;
|
||||||
int debug_insns_with_starting_stack = 0;
|
int debug_insns_with_starting_stack = 0;
|
||||||
|
|
||||||
any_malformed_asm = false;
|
any_malformed_asm = false;
|
||||||
|
@ -3041,7 +3043,7 @@ convert_regs_1 (basic_block block)
|
||||||
place, still, but we don't have enough information at that time. */
|
place, still, but we don't have enough information at that time. */
|
||||||
|
|
||||||
if (control_flow_insn_deleted)
|
if (control_flow_insn_deleted)
|
||||||
purge_dead_edges (block);
|
cfg_altered |= purge_dead_edges (block);
|
||||||
|
|
||||||
/* Something failed if the stack lives don't match. If we had malformed
|
/* Something failed if the stack lives don't match. If we had malformed
|
||||||
asms, we zapped the instruction itself, but that didn't produce the
|
asms, we zapped the instruction itself, but that didn't produce the
|
||||||
|
@ -3051,14 +3053,18 @@ convert_regs_1 (basic_block block)
|
||||||
|| any_malformed_asm);
|
|| any_malformed_asm);
|
||||||
bi->stack_out = regstack;
|
bi->stack_out = regstack;
|
||||||
bi->done = true;
|
bi->done = true;
|
||||||
|
|
||||||
|
return cfg_altered;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Convert registers in all blocks reachable from BLOCK. */
|
/* Convert registers in all blocks reachable from BLOCK. Return true if the
|
||||||
|
CFG has been modified in the process. */
|
||||||
|
|
||||||
static void
|
static bool
|
||||||
convert_regs_2 (basic_block block)
|
convert_regs_2 (basic_block block)
|
||||||
{
|
{
|
||||||
basic_block *stack, *sp;
|
basic_block *stack, *sp;
|
||||||
|
bool cfg_altered = false;
|
||||||
|
|
||||||
/* We process the blocks in a top-down manner, in a way such that one block
|
/* We process the blocks in a top-down manner, in a way such that one block
|
||||||
is only processed after all its predecessors. The number of predecessors
|
is only processed after all its predecessors. The number of predecessors
|
||||||
|
@ -3097,11 +3103,13 @@ convert_regs_2 (basic_block block)
|
||||||
*sp++ = e->dest;
|
*sp++ = e->dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
convert_regs_1 (block);
|
cfg_altered |= convert_regs_1 (block);
|
||||||
}
|
}
|
||||||
while (sp != stack);
|
while (sp != stack);
|
||||||
|
|
||||||
free (stack);
|
free (stack);
|
||||||
|
|
||||||
|
return cfg_altered;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Traverse all basic blocks in a function, converting the register
|
/* Traverse all basic blocks in a function, converting the register
|
||||||
|
@ -3111,6 +3119,7 @@ convert_regs_2 (basic_block block)
|
||||||
static void
|
static void
|
||||||
convert_regs (void)
|
convert_regs (void)
|
||||||
{
|
{
|
||||||
|
bool cfg_altered = false;
|
||||||
int inserted;
|
int inserted;
|
||||||
basic_block b;
|
basic_block b;
|
||||||
edge e;
|
edge e;
|
||||||
|
@ -3129,7 +3138,7 @@ convert_regs (void)
|
||||||
|
|
||||||
/* Process all blocks reachable from all entry points. */
|
/* Process all blocks reachable from all entry points. */
|
||||||
FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
|
FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
|
||||||
convert_regs_2 (e->dest);
|
cfg_altered |= convert_regs_2 (e->dest);
|
||||||
|
|
||||||
/* ??? Process all unreachable blocks. Though there's no excuse
|
/* ??? Process all unreachable blocks. Though there's no excuse
|
||||||
for keeping these even when not optimizing. */
|
for keeping these even when not optimizing. */
|
||||||
|
@ -3138,7 +3147,7 @@ convert_regs (void)
|
||||||
block_info bi = BLOCK_INFO (b);
|
block_info bi = BLOCK_INFO (b);
|
||||||
|
|
||||||
if (! bi->done)
|
if (! bi->done)
|
||||||
convert_regs_2 (b);
|
cfg_altered |= convert_regs_2 (b);
|
||||||
}
|
}
|
||||||
|
|
||||||
inserted |= compensate_edges ();
|
inserted |= compensate_edges ();
|
||||||
|
@ -3149,6 +3158,9 @@ convert_regs (void)
|
||||||
if (inserted)
|
if (inserted)
|
||||||
commit_edge_insertions ();
|
commit_edge_insertions ();
|
||||||
|
|
||||||
|
if (cfg_altered)
|
||||||
|
cleanup_cfg (0);
|
||||||
|
|
||||||
if (dump_file)
|
if (dump_file)
|
||||||
fputc ('\n', dump_file);
|
fputc ('\n', dump_file);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
2010-10-24 Eric Botcazou <ebotcazou@adacore.com>
|
||||||
|
|
||||||
|
* gnat.dg/opt7.ad[sb]: New test.
|
||||||
|
* gnat.dg/opt7_pkg.ads: New helper.
|
||||||
|
|
||||||
2010-10-24 Nicola Pero <nicola.pero@meta-innovation.com>
|
2010-10-24 Nicola Pero <nicola.pero@meta-innovation.com>
|
||||||
|
|
||||||
PR objc/45735
|
PR objc/45735
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
-- { dg-do compile }
|
||||||
|
-- { dg-options "-Os -g" }
|
||||||
|
|
||||||
|
with Opt7_Pkg;
|
||||||
|
|
||||||
|
package body Opt7 is
|
||||||
|
|
||||||
|
procedure Parse (Str : String;
|
||||||
|
Time_Type : out time_t;
|
||||||
|
Abs_Time : out Time;
|
||||||
|
Delt_Time : out Duration) is
|
||||||
|
Year : Year_Number;
|
||||||
|
Month : Month_Number;
|
||||||
|
Day : Day_Number;
|
||||||
|
Minute : Integer := 0;
|
||||||
|
Idx : Integer := Str'First;
|
||||||
|
Ch : Character := Str (Idx);
|
||||||
|
Current_Time : Time;
|
||||||
|
|
||||||
|
begin
|
||||||
|
if Ch = '-' then
|
||||||
|
Time_Type := Absolute_Time;
|
||||||
|
Current_Time := Clock;
|
||||||
|
Day := Ada.Calendar.Day (Current_Time);
|
||||||
|
Month := Ada.Calendar.Month (Current_Time);
|
||||||
|
Year := Ada.Calendar.Year (Current_Time);
|
||||||
|
else
|
||||||
|
Time_Type := Delta_Time;
|
||||||
|
end if;
|
||||||
|
while Ch in '0' .. '9' loop
|
||||||
|
Minute := Minute + Character'Pos (Ch);
|
||||||
|
Idx := Idx + 1;
|
||||||
|
Ch := Str (Idx);
|
||||||
|
end loop;
|
||||||
|
if Time_Type = Absolute_Time then
|
||||||
|
Abs_Time := Time_Of (Year, Month, Day, Day_Duration (1));
|
||||||
|
else
|
||||||
|
Delt_Time := Duration (Float (Minute));
|
||||||
|
end if;
|
||||||
|
exception
|
||||||
|
when others => Opt7_Pkg.My_Raise_Exception;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end Opt7;
|
|
@ -0,0 +1,12 @@
|
||||||
|
with Ada.Calendar; use Ada.Calendar;
|
||||||
|
|
||||||
|
package Opt7 is
|
||||||
|
|
||||||
|
type time_t is (Absolute_Time, Delta_Time);
|
||||||
|
|
||||||
|
procedure Parse (Str : String;
|
||||||
|
Time_Type : out time_t;
|
||||||
|
Abs_Time : out Time;
|
||||||
|
Delt_Time : out Duration);
|
||||||
|
|
||||||
|
end Opt7;
|
|
@ -0,0 +1,5 @@
|
||||||
|
package Opt7_Pkg is
|
||||||
|
|
||||||
|
procedure My_Raise_Exception;
|
||||||
|
|
||||||
|
end Opt7_Pkg;
|
Loading…
Reference in New Issue