Patchwork Fix ipa references removal

login
register
mail settings
Submitter Ilya Enkovich
Date Jan. 16, 2014, 2:24 p.m.
Message ID <CAMbmDYZmRybHDVBvS3RMei74U1+Pk3Wg51on+w-afLNRCs2J=Q@mail.gmail.com>
Download mbox | patch
Permalink /patch/311738/
State New
Headers show

Comments

Ilya Enkovich - Jan. 16, 2014, 2:24 p.m.
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.

 /* Remove all stmt references in non-speculative references.
Jeff Law - Jan. 16, 2014, 4:36 p.m.
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
Ilya Enkovich - Jan. 17, 2014, 5:57 a.m.
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
>

Patch

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++;
 }