summaryrefslogtreecommitdiff
path: root/gcc/ipa-icf-gimple.c
diff options
context:
space:
mode:
authormarxin <marxin@138bc75d-0d04-0410-961f-82ee72b054a4>2014-12-10 14:07:47 +0000
committermarxin <marxin@138bc75d-0d04-0410-961f-82ee72b054a4>2014-12-10 14:07:47 +0000
commit92e5932309c2cb3ec3bd4aad5719139a2bf53daf (patch)
treeb600d3f7eb04d4c25ea190a2ab57744df220b515 /gcc/ipa-icf-gimple.c
parent6c679c887c74f12d60de874393dc7a31b01ee817 (diff)
downloadgcc-92e5932309c2cb3ec3bd4aad5719139a2bf53daf.tar.gz
PR ipa/63909
* gimple-iterator.h (gsi_start_bb_nondebug): New function. * ipa-icf-gimple.c (func_checker::compare_bb): Correct iteration replaces loop based on precomputed number of non-debug statements. * gcc.dg/ipa/pr63909.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@218578 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ipa-icf-gimple.c')
-rw-r--r--gcc/ipa-icf-gimple.c25
1 files changed, 10 insertions, 15 deletions
diff --git a/gcc/ipa-icf-gimple.c b/gcc/ipa-icf-gimple.c
index 8f2a438abc9..ec0290a4013 100644
--- a/gcc/ipa-icf-gimple.c
+++ b/gcc/ipa-icf-gimple.c
@@ -559,24 +559,16 @@ func_checker::parse_labels (sem_bb *bb)
bool
func_checker::compare_bb (sem_bb *bb1, sem_bb *bb2)
{
- unsigned i;
gimple_stmt_iterator gsi1, gsi2;
gimple s1, s2;
- if (bb1->nondbg_stmt_count != bb2->nondbg_stmt_count
- || bb1->edge_count != bb2->edge_count)
- return return_false ();
-
- gsi1 = gsi_start_bb (bb1->bb);
- gsi2 = gsi_start_bb (bb2->bb);
+ gsi1 = gsi_start_bb_nondebug (bb1->bb);
+ gsi2 = gsi_start_bb_nondebug (bb2->bb);
- for (i = 0; i < bb1->nondbg_stmt_count; i++)
+ while (!gsi_end_p (gsi1))
{
- if (is_gimple_debug (gsi_stmt (gsi1)))
- gsi_next_nondebug (&gsi1);
-
- if (is_gimple_debug (gsi_stmt (gsi2)))
- gsi_next_nondebug (&gsi2);
+ if (gsi_end_p (gsi2))
+ return return_false ();
s1 = gsi_stmt (gsi1);
s2 = gsi_stmt (gsi2);
@@ -646,10 +638,13 @@ func_checker::compare_bb (sem_bb *bb1, sem_bb *bb2)
return return_false_with_msg ("Unknown GIMPLE code reached");
}
- gsi_next (&gsi1);
- gsi_next (&gsi2);
+ gsi_next_nondebug (&gsi1);
+ gsi_next_nondebug (&gsi2);
}
+ if (!gsi_end_p (gsi2))
+ return return_false ();
+
return true;
}