diff mbox

Fix PR64764

Message ID alpine.LSU.2.11.1501261547050.12482@zhemvz.fhfr.qr
State New
Headers show

Commit Message

Richard Biener Jan. 26, 2015, 2:47 p.m. UTC
The following fixes PR64764.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.

Richard.

2015-01-26  Richard Biener  <rguenther@suse.de>

	PR middle-end/64764
	* tree-ssa-uninit.c (is_pred_expr_subset_of): Handle
	combining two BIT_AND_EXPR predicates.

	* gcc.dg/uninit-19.c: New testcase.

Comments

Tom de Vries Feb. 5, 2015, 11:45 a.m. UTC | #1
On 26-01-15 15:47, Richard Biener wrote:
> Index: gcc/testsuite/gcc.dg/uninit-19.c
> ===================================================================
> --- gcc/testsuite/gcc.dg/uninit-19.c	(revision 0)
> +++ gcc/testsuite/gcc.dg/uninit-19.c	(working copy)
> @@ -0,0 +1,23 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O -Wuninitialized" } */
> +
> +int a, l, m;
> +float *b;
> +float c, d, e, g, h;
> +unsigned char i, k;
> +void
> +fn1 (int p1, float *f1, float *f2, float *f3, unsigned char *c1, float *f4,
> +     unsigned char *c2, float *p10)
> +{
> +  if (p1 & 8)
> +    b[3] = p10[a];  /* { dg-warning "may be used uninitialized" } */
> +}
> +
> +void
> +fn2 ()
> +{
> +  float *n;
> +  if (l & 6)
> +    n = &c + m;
> +  fn1 (l, &d, &e, &g, &i, &h, &k, n);
> +}

Hi Richard,

this new test fails with -fpic, because fn1 is not inlined.

Adding static to fn1 allows it to pass both with and without -fpic. But that 
change might affect whether it still serves as a regression test for this PR, 
I'm not sure.

Another way to fix this could be to use the warning line number 22 instead 13 
for fpic.

Thanks,
- Tom
Richard Biener Feb. 9, 2015, 8:59 a.m. UTC | #2
On Thu, 5 Feb 2015, Tom de Vries wrote:

> On 26-01-15 15:47, Richard Biener wrote:
> > Index: gcc/testsuite/gcc.dg/uninit-19.c
> > ===================================================================
> > --- gcc/testsuite/gcc.dg/uninit-19.c	(revision 0)
> > +++ gcc/testsuite/gcc.dg/uninit-19.c	(working copy)
> > @@ -0,0 +1,23 @@
> > +/* { dg-do compile } */
> > +/* { dg-options "-O -Wuninitialized" } */
> > +
> > +int a, l, m;
> > +float *b;
> > +float c, d, e, g, h;
> > +unsigned char i, k;
> > +void
> > +fn1 (int p1, float *f1, float *f2, float *f3, unsigned char *c1, float *f4,
> > +     unsigned char *c2, float *p10)
> > +{
> > +  if (p1 & 8)
> > +    b[3] = p10[a];  /* { dg-warning "may be used uninitialized" } */
> > +}
> > +
> > +void
> > +fn2 ()
> > +{
> > +  float *n;
> > +  if (l & 6)
> > +    n = &c + m;
> > +  fn1 (l, &d, &e, &g, &i, &h, &k, n);
> > +}
> 
> Hi Richard,
> 
> this new test fails with -fpic, because fn1 is not inlined.
> 
> Adding static to fn1 allows it to pass both with and without -fpic. But that
> change might affect whether it still serves as a regression test for this PR,
> I'm not sure.
> 
> Another way to fix this could be to use the warning line number 22 instead 13
> for fpic.

Either way is fine with me.

Thanks,
Richard.
diff mbox

Patch

Index: gcc/tree-ssa-uninit.c
===================================================================
--- gcc/tree-ssa-uninit.c	(revision 220107)
+++ gcc/tree-ssa-uninit.c	(working copy)
@@ -1377,7 +1377,8 @@  is_pred_expr_subset_of (pred_info expr1,
   if (expr2.invert)
     code2 = invert_tree_comparison (code2, false);
 
-  if (code1 == EQ_EXPR && code2 == BIT_AND_EXPR)
+  if ((code1 == EQ_EXPR || code1 == BIT_AND_EXPR)
+      && code2 == BIT_AND_EXPR)
     return wi::eq_p (expr1.pred_rhs,
 		     wi::bit_and (expr1.pred_rhs, expr2.pred_rhs));
 
Index: gcc/testsuite/gcc.dg/uninit-19.c
===================================================================
--- gcc/testsuite/gcc.dg/uninit-19.c	(revision 0)
+++ gcc/testsuite/gcc.dg/uninit-19.c	(working copy)
@@ -0,0 +1,23 @@ 
+/* { dg-do compile } */
+/* { dg-options "-O -Wuninitialized" } */
+
+int a, l, m;
+float *b;
+float c, d, e, g, h;
+unsigned char i, k;
+void
+fn1 (int p1, float *f1, float *f2, float *f3, unsigned char *c1, float *f4,
+     unsigned char *c2, float *p10)
+{
+  if (p1 & 8)
+    b[3] = p10[a];  /* { dg-warning "may be used uninitialized" } */
+}
+
+void
+fn2 ()
+{
+  float *n;
+  if (l & 6)
+    n = &c + m;
+  fn1 (l, &d, &e, &g, &i, &h, &k, n);
+}