Patchwork [4.8,PR57358] Check if optimizing in parm_ref_data_preserved_p

login
register
mail settings
Submitter Martin Jambor
Date June 12, 2013, 12:23 p.m.
Message ID <20130612122341.GD26236@virgil.suse>
Download mbox | patch
Permalink /patch/250749/
State New
Headers show

Comments

Martin Jambor - June 12, 2013, 12:23 p.m.
Hi,

this is the simplest fix for the PR which happens because there is no
VDEF on a stmt if a particular function is not optimized.  I'd like to
fix the bug with it on the branch.  Bootstrapped and tested on
x86_64-linux.  OK?

Thanks,

Martin


2013-06-11  Martin Jambor  <mjambor@suse.cz>

	PR tree-optimization/57358
	* ipa-prop.c (parm_ref_data_preserved_p): Always return true when
	not optimizing.

testsuite/
	* gcc.dg/ipa/pr57358.c: New test.
Jan Hubicka - June 20, 2013, 11:29 a.m.
> Hi,
> 
> this is the simplest fix for the PR which happens because there is no
> VDEF on a stmt if a particular function is not optimized.  I'd like to
> fix the bug with it on the branch.  Bootstrapped and tested on
> x86_64-linux.  OK?
> 
> Thanks,
> 
> Martin
> 
> 
> 2013-06-11  Martin Jambor  <mjambor@suse.cz>
> 
> 	PR tree-optimization/57358
> 	* ipa-prop.c (parm_ref_data_preserved_p): Always return true when
> 	not optimizing.

Seems to make sense,
OK,
Honza

Patch

diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c
index 53cd5ed..c62dc68 100644
--- a/gcc/ipa-prop.c
+++ b/gcc/ipa-prop.c
@@ -678,13 +678,19 @@  parm_ref_data_preserved_p (struct param_analysis_info *parm_ainfo,
   bool modified = false;
   ao_ref refd;
 
-  gcc_checking_assert (gimple_vuse (stmt));
   if (parm_ainfo && parm_ainfo->ref_modified)
     return false;
 
-  ao_ref_init (&refd, ref);
-  walk_aliased_vdefs (&refd, gimple_vuse (stmt), mark_modified, &modified,
-		      NULL);
+  if (optimize)
+    {
+      gcc_checking_assert (gimple_vuse (stmt));
+      ao_ref_init (&refd, ref);
+      walk_aliased_vdefs (&refd, gimple_vuse (stmt), mark_modified, &modified,
+			  NULL);
+    }
+  else
+    modified = true;
+
   if (parm_ainfo && modified)
     parm_ainfo->ref_modified = true;
   return !modified;
diff --git a/gcc/testsuite/gcc.dg/ipa/pr57358.c b/gcc/testsuite/gcc.dg/ipa/pr57358.c
new file mode 100644
index 0000000..c83396f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/ipa/pr57358.c
@@ -0,0 +1,9 @@ 
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+struct t { void (*func)(void*); };
+void test_func(struct t* a) __attribute__((optimize("O0")));
+void test_func(struct t* a)
+{
+  a->func(0);
+}