]> gcc.gnu.org Git - gcc.git/commitdiff
middle-end/104402 - split out _Complex compares from COND_EXPRs
authorRichard Biener <rguenther@suse.de>
Mon, 7 Feb 2022 08:31:07 +0000 (09:31 +0100)
committerRichard Biener <rguenther@suse.de>
Mon, 7 Feb 2022 08:37:59 +0000 (09:37 +0100)
This makes sure we always have a _Complex compare split to a
different stmt for the compare operand in a COND_EXPR on GIMPLE.
Complex lowering doesn't handle this and the change is something
we want for all kind of compares at some point.

2022-02-07  Richard Biener  <rguenther@suse.de>

PR middle-end/104402
* gimple-expr.cc (is_gimple_condexpr): _Complex typed
compares are not valid.
* tree-cfg.cc (verify_gimple_assign_ternary): For COND_EXPR
check is_gimple_condexpr.

* gcc.dg/torture/pr104402.c: New testcase.

gcc/gimple-expr.cc
gcc/testsuite/gcc.dg/torture/pr104402.c [new file with mode: 0644]
gcc/tree-cfg.cc

index 05b127474998839dd9b841c72ab50855dd2b5f50..f9a650b5dafb6ddfdb98b9089a59bdb45751ff2b 100644 (file)
@@ -602,12 +602,16 @@ is_gimple_lvalue (tree t)
 /* Helper for is_gimple_condexpr and is_gimple_condexpr_for_cond.  */
 
 static bool
-is_gimple_condexpr_1 (tree t, bool allow_traps)
+is_gimple_condexpr_1 (tree t, bool allow_traps, bool allow_cplx)
 {
-  return (is_gimple_val (t) || (COMPARISON_CLASS_P (t)
-                               && (allow_traps || !tree_could_throw_p (t))
-                               && is_gimple_val (TREE_OPERAND (t, 0))
-                               && is_gimple_val (TREE_OPERAND (t, 1))));
+  tree op0;
+  return (is_gimple_val (t)
+         || (COMPARISON_CLASS_P (t)
+             && (allow_traps || !tree_could_throw_p (t))
+             && ((op0 = TREE_OPERAND (t, 0)), true)
+             && (allow_cplx || TREE_CODE (TREE_TYPE (op0)) != COMPLEX_TYPE)
+             && is_gimple_val (op0)
+             && is_gimple_val (TREE_OPERAND (t, 1))));
 }
 
 /* Return true if T is a GIMPLE condition.  */
@@ -615,7 +619,9 @@ is_gimple_condexpr_1 (tree t, bool allow_traps)
 bool
 is_gimple_condexpr (tree t)
 {
-  return is_gimple_condexpr_1 (t, true);
+  /* Always split out _Complex type compares since complex lowering
+     doesn't handle this case.  */
+  return is_gimple_condexpr_1 (t, true, false);
 }
 
 /* Like is_gimple_condexpr, but does not allow T to trap.  */
@@ -623,7 +629,7 @@ is_gimple_condexpr (tree t)
 bool
 is_gimple_condexpr_for_cond (tree t)
 {
-  return is_gimple_condexpr_1 (t, false);
+  return is_gimple_condexpr_1 (t, false, true);
 }
 
 /* Return true if T is a gimple address.  */
diff --git a/gcc/testsuite/gcc.dg/torture/pr104402.c b/gcc/testsuite/gcc.dg/torture/pr104402.c
new file mode 100644 (file)
index 0000000..1cb0370
--- /dev/null
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+
+_Complex int a;
+char b;
+void c() {
+  if (b != 2 + (long)(a != 0 ^ 0))
+    __builtin_abort();
+}
index 260a7fb97c65779d090ef53a50f326ab41a6d3c6..e321d929fd0cd3dfe81b079674ece6d98f9c5af1 100644 (file)
@@ -4289,10 +4289,11 @@ verify_gimple_assign_ternary (gassign *stmt)
       /* Fallthrough.  */
     case COND_EXPR:
       if (!is_gimple_val (rhs1)
-         && verify_gimple_comparison (TREE_TYPE (rhs1),
-                                      TREE_OPERAND (rhs1, 0),
-                                      TREE_OPERAND (rhs1, 1),
-                                      TREE_CODE (rhs1)))
+         && (!is_gimple_condexpr (rhs1)
+             || verify_gimple_comparison (TREE_TYPE (rhs1),
+                                          TREE_OPERAND (rhs1, 0),
+                                          TREE_OPERAND (rhs1, 1),
+                                          TREE_CODE (rhs1))))
        return true;
       if (!useless_type_conversion_p (lhs_type, rhs2_type)
          || !useless_type_conversion_p (lhs_type, rhs3_type))
This page took 0.094356 seconds and 5 git commands to generate.