diff mbox

[PR,55355,trunk,4.6,4.7] One more host_integerp check in SRA

Message ID 20121214120403.GB3543@virgil.suse
State New
Headers show

Commit Message

Martin Jambor Dec. 14, 2012, 12:04 p.m. UTC
Hi,

below are two variants for PR 55355, one for trunk and for 4.7, the
second one, without dumping, for 4.6.  On 4.6 they fix an ICE for a
too-large integer on i686, which perhaps can also happen on 4.7 and
trunk even though it does not for their particular testcase.

I've bootstrapped and tested this on x86_64-linux on trunk and the two
branches, I'm in the process of doing the same on i686-linux.  OK for
everywhere if it passes?

Thanks,

Martin


trunk and 4.7 variant:

2012-12-12  Martin Jambor  <mjambor@suse.cz>

	PR tree-optimization/55355
	* tree-sra.c (type_internals_preclude_sra_p): Also check that
	bit_position is small enough to fit a single HOST_WIDE_INT.

	* testsuite/g++.dg/torture/pr55355.C: New test.

Comments

Richard Biener Dec. 14, 2012, 12:22 p.m. UTC | #1
On Fri, Dec 14, 2012 at 1:04 PM, Martin Jambor <mjambor@suse.cz> wrote:
> Hi,
>
> below are two variants for PR 55355, one for trunk and for 4.7, the
> second one, without dumping, for 4.6.  On 4.6 they fix an ICE for a
> too-large integer on i686, which perhaps can also happen on 4.7 and
> trunk even though it does not for their particular testcase.
>
> I've bootstrapped and tested this on x86_64-linux on trunk and the two
> branches, I'm in the process of doing the same on i686-linux.  OK for
> everywhere if it passes?

Ok.

Thanks,
Richard.

> Thanks,
>
> Martin
>
>
> trunk and 4.7 variant:
>
> 2012-12-12  Martin Jambor  <mjambor@suse.cz>
>
>         PR tree-optimization/55355
>         * tree-sra.c (type_internals_preclude_sra_p): Also check that
>         bit_position is small enough to fit a single HOST_WIDE_INT.
>
>         * testsuite/g++.dg/torture/pr55355.C: New test.
>
>
> diff --git a/gcc/testsuite/g++.dg/torture/pr55355.C b/gcc/testsuite/g++.dg/torture/pr55355.C
> new file mode 100644
> index 0000000..6d8f8b6
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/torture/pr55355.C
> @@ -0,0 +1,23 @@
> +/* { dg-do compile } */
> +
> +struct A
> +{
> +    void funcA(void);
> +};
> +
> +struct B {};
> +
> +struct C
> +{
> +    void funcC(void) { a_mp->funcA(); }
> +
> +    char buf_ma[268435456];
> +    A   *a_mp;
> +    B    b_m;
> +};
> +
> +void
> +func(C *c_p)
> +{
> +    c_p->funcC();
> +}
> diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
> index 21d8a51..286ef26 100644
> --- a/gcc/tree-sra.c
> +++ b/gcc/tree-sra.c
> @@ -714,7 +714,12 @@ type_internals_preclude_sra_p (tree type, const char **msg)
>               {
>                 *msg = "structure field size not fixed";
>                 return true;
> -             }
> +             }
> +           if (!host_integerp (bit_position (fld), 0))
> +             {
> +               *msg = "structure field size too big";
> +               return true;
> +             }
>             if (AGGREGATE_TYPE_P (ft)
>                     && int_bit_position (fld) % BITS_PER_UNIT != 0)
>               {
>
>
> 4.6 variant:
>
>
> 2012-12-12  Martin Jambor  <mjambor@suse.cz>
>
>         PR tree-optimization/55355
>         * tree-sra.c (type_internals_preclude_sra_p): Also check that
>         bit_position is small enough to fit a single HOST_WIDE_INT.
>
>         * testsuite/g++.dg/torture/pr55355.C: New test.
>
> Index: gcc/testsuite/g++.dg/torture/pr55355.C
> ===================================================================
> --- gcc/testsuite/g++.dg/torture/pr55355.C      (revision 0)
> +++ gcc/testsuite/g++.dg/torture/pr55355.C      (revision 0)
> @@ -0,0 +1,23 @@
> +/* { dg-do compile } */
> +
> +struct A
> +{
> +    void funcA(void);
> +};
> +
> +struct B {};
> +
> +struct C
> +{
> +    void funcC(void) { a_mp->funcA(); }
> +
> +    char buf_ma[268435456];
> +    A   *a_mp;
> +    B    b_m;
> +};
> +
> +void
> +func(C *c_p)
> +{
> +    c_p->funcC();
> +}
> Index: gcc/tree-sra.c
> ===================================================================
> --- gcc/tree-sra.c      (revision 194450)
> +++ gcc/tree-sra.c      (working copy)
> @@ -666,6 +666,7 @@ type_internals_preclude_sra_p (tree type
>                 || !DECL_FIELD_OFFSET (fld) || !DECL_SIZE (fld)
>                 || !host_integerp (DECL_FIELD_OFFSET (fld), 1)
>                 || !host_integerp (DECL_SIZE (fld), 1)
> +               || !host_integerp (bit_position (fld), 0)
>                 || (AGGREGATE_TYPE_P (ft)
>                     && int_bit_position (fld) % BITS_PER_UNIT != 0))
>               return true;
diff mbox

Patch

diff --git a/gcc/testsuite/g++.dg/torture/pr55355.C b/gcc/testsuite/g++.dg/torture/pr55355.C
new file mode 100644
index 0000000..6d8f8b6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr55355.C
@@ -0,0 +1,23 @@ 
+/* { dg-do compile } */
+
+struct A
+{
+    void funcA(void);
+};
+
+struct B {};
+
+struct C
+{
+    void funcC(void) { a_mp->funcA(); }
+
+    char buf_ma[268435456];
+    A   *a_mp;
+    B    b_m;
+};
+
+void
+func(C *c_p)
+{
+    c_p->funcC();
+}
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index 21d8a51..286ef26 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -714,7 +714,12 @@  type_internals_preclude_sra_p (tree type, const char **msg)
 	      {
 	        *msg = "structure field size not fixed";
 		return true;
-	      }	      
+	      }
+	    if (!host_integerp (bit_position (fld), 0))
+	      {
+	        *msg = "structure field size too big";
+		return true;
+	      }
 	    if (AGGREGATE_TYPE_P (ft)
 		    && int_bit_position (fld) % BITS_PER_UNIT != 0)
 	      {


4.6 variant:


2012-12-12  Martin Jambor  <mjambor@suse.cz>

	PR tree-optimization/55355
	* tree-sra.c (type_internals_preclude_sra_p): Also check that
	bit_position is small enough to fit a single HOST_WIDE_INT.

	* testsuite/g++.dg/torture/pr55355.C: New test.

Index: gcc/testsuite/g++.dg/torture/pr55355.C
===================================================================
--- gcc/testsuite/g++.dg/torture/pr55355.C	(revision 0)
+++ gcc/testsuite/g++.dg/torture/pr55355.C	(revision 0)
@@ -0,0 +1,23 @@ 
+/* { dg-do compile } */
+
+struct A
+{
+    void funcA(void);
+};
+
+struct B {};
+
+struct C
+{
+    void funcC(void) { a_mp->funcA(); }
+
+    char buf_ma[268435456];
+    A   *a_mp;
+    B    b_m;
+};
+
+void
+func(C *c_p)
+{
+    c_p->funcC();
+}
Index: gcc/tree-sra.c
===================================================================
--- gcc/tree-sra.c	(revision 194450)
+++ gcc/tree-sra.c	(working copy)
@@ -666,6 +666,7 @@  type_internals_preclude_sra_p (tree type
 		|| !DECL_FIELD_OFFSET (fld) || !DECL_SIZE (fld)
 		|| !host_integerp (DECL_FIELD_OFFSET (fld), 1)
 		|| !host_integerp (DECL_SIZE (fld), 1)
+		|| !host_integerp (bit_position (fld), 0)
 		|| (AGGREGATE_TYPE_P (ft)
 		    && int_bit_position (fld) % BITS_PER_UNIT != 0))
 	      return true;