This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH, PR86097] Generate correctly typed compare in canonicalize_loop_ivs


Hi,

Consider the test-case from the patch. When compiled with "-O2
-ftree-parallelize-loops=2 -fno-tree-dce", it ICEs like this:
...
error: mismatching comparison operand types
signed int
unsigned int
if (ivtmp_32 < 3)
during GIMPLE pass: parloops
pr86097.c:4:1: internal compiler error: verify_gimple failed
...

The comparison with signed int and unsigned int operands is generated during
the call to canonicalize_loop_ivs in the parloops pass.

Parloops calls canonicalize_loop_ivs with nit (the number of loop iterations)
set to (unsigned int)3. Then canonicalize_loop_ivs decides to use a canonical
iv of type signed int.  At the end of canonicalize_loop_ivs, the comparison
between the unsigned nit and the signed iv is constructed.

This patch fixes the ICE by ensuring that nit is casted to the iv type in this
case.

Bootstrapped and reg-tested on x86_64.

OK for trunk?

Thanks,
- Tom

Generate correctly typed compare in canonicalize_loop_ivs

2018-06-20  Tom de Vries  <tdevries@suse.de>

	PR tree-optimization/86097
	* tree-ssa-loop-manip.c (canonicalize_loop_ivs): Also convert *nit to
	iv type if signedness of iv type is not the same as that of *nit.

	* gcc.dg/autopar/pr86097.c: New test.

---
 gcc/testsuite/gcc.dg/autopar/pr86097.c | 31 +++++++++++++++++++++++++++++++
 gcc/tree-ssa-loop-manip.c              |  3 ++-
 2 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/gcc/testsuite/gcc.dg/autopar/pr86097.c b/gcc/testsuite/gcc.dg/autopar/pr86097.c
new file mode 100644
index 00000000000..b48e87b8bf9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/autopar/pr86097.c
@@ -0,0 +1,31 @@
+/* { dg-options "-O2 -ftree-parallelize-loops=2 -fno-tree-dce -Wno-aggressive-loop-optimizations" } */
+int rp, vd;
+
+void
+p5 (int cd)
+{
+  while (cd != 0)
+    {
+      for (rp = 0; rp < 4; ++rp)
+        for (vd = 0; vd < 1; ++vd)
+          {
+ g0:
+            ;
+          }
+
+      ++rp;
+    }
+
+  while (rp < 2)
+    {
+      for (cd = 0; cd < 1; ++cd)
+        for (rp = 1; rp != 0; ++rp)
+          {
+          }
+
+      ++rp;
+    }
+
+  if (cd != 0)
+    goto g0;
+}
diff --git a/gcc/tree-ssa-loop-manip.c b/gcc/tree-ssa-loop-manip.c
index bf425afd436..5acee6c98f3 100644
--- a/gcc/tree-ssa-loop-manip.c
+++ b/gcc/tree-ssa-loop-manip.c
@@ -1542,7 +1542,8 @@ canonicalize_loop_ivs (struct loop *loop, tree *nit, bool bump_in_latch)
   precision = GET_MODE_PRECISION (mode);
   type = build_nonstandard_integer_type (precision, unsigned_p);
 
-  if (original_precision != precision)
+  if (original_precision != precision
+      || TYPE_UNSIGNED (TREE_TYPE (*nit)) != unsigned_p)
     {
       *nit = fold_convert (type, *nit);
       *nit = force_gimple_operand (*nit, &stmts, true, NULL_TREE);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]