Fix ipa references removal

Submitted by Ilya Enkovich on Jan. 16, 2014, 2:24 p.m.

Details

Message ID CAMbmDYZmRybHDVBvS3RMei74U1+Pk3Wg51on+w-afLNRCs2J=Q@mail.gmail.com
State New
Headers show

Commit Message

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.

Comments

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 hide | download patch | download mbox

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