Message ID | CAMbmDYZmRybHDVBvS3RMei74U1+Pk3Wg51on+w-afLNRCs2J=Q@mail.gmail.com |
---|---|
State | New |
Headers | show |
On 01/16/14 07:24, Ilya Enkovich wrote: > Hi, > > I found ipa_remove_stmt_references incorrectly iterates over > references after reference removal. When reference is removed, the > last one takes it's place and is not checked at all. It means we do > not remove all required references in some cases. > > Here is a patch to fix it. Bootstrapped and tested on linux-x86_64. OK > for trunk? > > Thanks, > Ilya > -- > 2014-01-16 Ilya Enkovich <ilya.enkovich@intel.com> > > * ipa-ref.c (ipa_remove_stmt_references): Fix references > traversal when removing references. OK for the trunk. Do you have a testcase that can be added to the regression suite? jeff
2014/1/16 Jeff Law <law@redhat.com>: > On 01/16/14 07:24, Ilya Enkovich wrote: >> >> Hi, >> >> I found ipa_remove_stmt_references incorrectly iterates over >> references after reference removal. When reference is removed, the >> last one takes it's place and is not checked at all. It means we do >> not remove all required references in some cases. >> >> Here is a patch to fix it. Bootstrapped and tested on linux-x86_64. OK >> for trunk? >> >> Thanks, >> Ilya >> -- >> 2014-01-16 Ilya Enkovich <ilya.enkovich@intel.com> >> >> * ipa-ref.c (ipa_remove_stmt_references): Fix references >> traversal when removing references. > > OK for the trunk. Committed. > > Do you have a testcase that can be added to the regression suite? Unfortunately I couldn't compose a test revealing this problem on the trunk. I found this bug during Pointer Bounds Checker testing and regression test will be a part of checker testsuite. Thanks, Ilya > > jeff >
diff --git a/gcc/ipa-ref.c b/gcc/ipa-ref.c index b8c3d51..6aa41e6 100644 --- a/gcc/ipa-ref.c +++ b/gcc/ipa-ref.c @@ -291,11 +291,13 @@ void ipa_remove_stmt_references (symtab_node *referring_node, gimple stmt) { struct ipa_ref *r = NULL; - int i; + int i = 0; - for (i = 0; ipa_ref_list_reference_iterate (&referring_node->ref_list, i, r); i++) + while (ipa_ref_list_reference_iterate (&referring_node->ref_list, i, r)) if (r->stmt == stmt) ipa_remove_reference (r); + else + i++; }