From 12929514e78008b033dfbd9d30f852db506dc27e Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Sun, 24 Oct 2010 20:50:20 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 8 ++++++ gcc/reg-stack.c | 28 +++++++++++++------ gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gnat.dg/opt7.adb | 44 ++++++++++++++++++++++++++++++ gcc/testsuite/gnat.dg/opt7.ads | 12 ++++++++ gcc/testsuite/gnat.dg/opt7_pkg.ads | 5 ++++ 6 files changed, 94 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/gnat.dg/opt7.adb create mode 100644 gcc/testsuite/gnat.dg/opt7.ads create mode 100644 gcc/testsuite/gnat.dg/opt7_pkg.ads diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4f250e70c297..c48d9d7b22de 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2010-10-24 Eric Botcazou + + * 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 * config/sparc/sparc.c (sparc_type_code) : New case. diff --git a/gcc/reg-stack.c b/gcc/reg-stack.c index e692584bb6bb..98c5fcee77ef 100644 --- a/gcc/reg-stack.c +++ b/gcc/reg-stack.c @@ -2876,9 +2876,10 @@ better_edge (edge e1, edge 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) { struct stack_def regstack; @@ -2886,6 +2887,7 @@ convert_regs_1 (basic_block block) int reg; rtx insn, next; bool control_flow_insn_deleted = false; + bool cfg_altered = false; int debug_insns_with_starting_stack = 0; 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. */ 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 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); bi->stack_out = regstack; 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) { basic_block *stack, *sp; + bool cfg_altered = false; /* 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 @@ -3097,11 +3103,13 @@ convert_regs_2 (basic_block block) *sp++ = e->dest; } - convert_regs_1 (block); + cfg_altered |= convert_regs_1 (block); } while (sp != stack); free (stack); + + return cfg_altered; } /* Traverse all basic blocks in a function, converting the register @@ -3111,6 +3119,7 @@ convert_regs_2 (basic_block block) static void convert_regs (void) { + bool cfg_altered = false; int inserted; basic_block b; edge e; @@ -3129,7 +3138,7 @@ convert_regs (void) /* Process all blocks reachable from all entry points. */ 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 for keeping these even when not optimizing. */ @@ -3138,7 +3147,7 @@ convert_regs (void) block_info bi = BLOCK_INFO (b); if (! bi->done) - convert_regs_2 (b); + cfg_altered |= convert_regs_2 (b); } inserted |= compensate_edges (); @@ -3149,6 +3158,9 @@ convert_regs (void) if (inserted) commit_edge_insertions (); + if (cfg_altered) + cleanup_cfg (0); + if (dump_file) fputc ('\n', dump_file); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9ee2d3cdb85d..5e202cb06450 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-10-24 Eric Botcazou + + * gnat.dg/opt7.ad[sb]: New test. + * gnat.dg/opt7_pkg.ads: New helper. + 2010-10-24 Nicola Pero PR objc/45735 diff --git a/gcc/testsuite/gnat.dg/opt7.adb b/gcc/testsuite/gnat.dg/opt7.adb new file mode 100644 index 000000000000..da3b0e6dfa2c --- /dev/null +++ b/gcc/testsuite/gnat.dg/opt7.adb @@ -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; diff --git a/gcc/testsuite/gnat.dg/opt7.ads b/gcc/testsuite/gnat.dg/opt7.ads new file mode 100644 index 000000000000..c98035326708 --- /dev/null +++ b/gcc/testsuite/gnat.dg/opt7.ads @@ -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; diff --git a/gcc/testsuite/gnat.dg/opt7_pkg.ads b/gcc/testsuite/gnat.dg/opt7_pkg.ads new file mode 100644 index 000000000000..db24f5dac7b5 --- /dev/null +++ b/gcc/testsuite/gnat.dg/opt7_pkg.ads @@ -0,0 +1,5 @@ +package Opt7_Pkg is + + procedure My_Raise_Exception; + +end Opt7_Pkg;