tree-complex.c (expand_complex_div_wide): Don't create CONDs that trap.
authorRafael Avila de Espindola <espindola@google.com>
Thu, 8 May 2008 22:16:59 +0000 (22:16 +0000)
committerRafael Espindola <espindola@gcc.gnu.org>
Thu, 8 May 2008 22:16:59 +0000 (22:16 +0000)
* tree-complex.c (expand_complex_div_wide): Don't create CONDs that
trap.
* tree-gimple.c (is_gimple_condexpr): Check that the expression doesn't
trap and that both operands are gimple values.
(canonicalize_cond_expr_cond): Use is_gimple_condexpr.
* gcc/tree-eh.c (tree_could_trap_p): Correctly detect if a comparison
is a fp operation.

* gcc/testsuite/gcc.dg/vect/vect-111.c: Rename to no-trapping-math-vect-111.c
* gcc/testsuite/gcc.dg/vect/vect-ifcvt-11.c: Rename to no-trapping-math-vect-ifcvt-11.c
* gcc/testsuite/gcc.dg/vect/vect-ifcvt-12.c: Rename to no-trapping-math-vect-ifcvt-12.c
* gcc/testsuite/gcc.dg/vect/vect-ifcvt-13.c: Rename to no-trapping-math-vect-ifcvt-13.c
* gcc/testsuite/gcc.dg/vect/vect-ifcvt-14.c: Rename to no-trapping-math-vect-ifcvt-14.c
* gcc/testsuite/gcc.dg/vect/vect-ifcvt-15.c: Rename to no-trapping-math-vect-ifcvt-15.c

From-SVN: r135093

17 files changed:
gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-111.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-11.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-12.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-13.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-14.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-15.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/vect/vect-111.c [deleted file]
gcc/testsuite/gcc.dg/vect/vect-ifcvt-11.c [deleted file]
gcc/testsuite/gcc.dg/vect/vect-ifcvt-12.c [deleted file]
gcc/testsuite/gcc.dg/vect/vect-ifcvt-13.c [deleted file]
gcc/testsuite/gcc.dg/vect/vect-ifcvt-14.c [deleted file]
gcc/testsuite/gcc.dg/vect/vect-ifcvt-15.c [deleted file]
gcc/tree-complex.c
gcc/tree-eh.c
gcc/tree-gimple.c

index cb7ee2ec286916ff34c09e7dd5ecad7de3292154..7d0a3afacafc0d4aa3e43002527129ecb75c52c4 100644 (file)
@@ -1,3 +1,13 @@
+2008-05-08  Rafael Espindola  <espindola@google.com>
+
+       * tree-complex.c (expand_complex_div_wide): Don't create CONDs that
+       trap.
+       * tree-gimple.c (is_gimple_condexpr): Check that the expression doesn't
+       trap and that both operands are gimple values.
+       (canonicalize_cond_expr_cond): Use is_gimple_condexpr.
+       * gcc/tree-eh.c (tree_could_trap_p): Correctly detect if a comparison
+       is a fp operation.
+
 2008-05-08  Richard Sandiford  <rsandifo@nildram.co.uk>
 
        * read-rtl.c (join_c_conditions): Return the first string if the
index ff5d2cc92ffbbfaf0c64acc925f4e921a7a4d1b1..9e3a1f148a91234658555a4a7b0d79e0b4d07e97 100644 (file)
@@ -1,3 +1,12 @@
+2008-05-08  Rafael Espindola  <espindola@google.com>
+
+       * gcc.dg/vect/vect-111.c: Rename to no-trapping-math-vect-111.c
+       * gcc.dg/vect/vect-ifcvt-11.c: Rename to no-trapping-math-vect-ifcvt-11.c
+       * gcc.dg/vect/vect-ifcvt-12.c: Rename to no-trapping-math-vect-ifcvt-12.c
+       * gcc.dg/vect/vect-ifcvt-13.c: Rename to no-trapping-math-vect-ifcvt-13.c
+       * gcc.dg/vect/vect-ifcvt-14.c: Rename to no-trapping-math-vect-ifcvt-14.c
+       * gcc.dg/vect/vect-ifcvt-15.c: Rename to no-trapping-math-vect-ifcvt-15.c
+
 2008-05-08  David Daney  <ddaney@avtrex.com>
 
        * lib/target-supports.exp (check_effective_target_sync_int_long): Add
diff --git a/gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-111.c b/gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-111.c
new file mode 100644 (file)
index 0000000..413c7ef
--- /dev/null
@@ -0,0 +1,38 @@
+/* { dg-require-effective-target vect_float } */
+
+#include <stdarg.h>
+#include "tree-vect.h"
+
+#define N 16
+
+__attribute__ ((noinline)) int
+main1 (void)
+{
+  int i;
+  float a[N];
+  float b[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45};
+
+  /* Condition in loop.  */
+  /* This loop is vectorized on platforms that support vect_condition.  */
+  for (i = 0; i < N; i++)
+  {
+    a[i] = (b[i] > 0 ? b[i] : 0);
+  }
+
+  for (i = 0; i < N; i++)
+  {
+    if (a[i] != b[i])
+       abort ();
+  }
+  return 0;
+}
+
+int main (void)
+{
+  check_vect ();
+  return main1 ();
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target powerpc*-*-* } } } */
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target i?86-*-* x86_64-*-* ia64-*-* } } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-11.c b/gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-11.c
new file mode 100644 (file)
index 0000000..560b5bc
--- /dev/null
@@ -0,0 +1,33 @@
+/* { dg-require-effective-target vect_condition } */
+/* { dg-require-effective-target vect_float } */
+
+#include <stdarg.h>
+#include <signal.h>
+#include "tree-vect.h"
+
+#define N 16
+#define MAX 42
+
+extern void abort(void); 
+
+int main ()
+{  
+  float A[N] = {36,39,42,45,43,32,21,12,23,34,45,56,67,78,89,11};
+  float B[N] = {0,0,42,42,42,0,0,0,0,0,42,42,42,42,42,0};
+  int i, j;
+
+  check_vect ();
+
+  for (i = 0; i < 16; i++)
+    A[i] = ( A[i] >= MAX ? MAX : 0); 
+
+  /* check results:  */
+  for (i = 0; i < N; i++)
+    if (A[i] != B[i])
+      abort ();
+
+  return 0;
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-12.c b/gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-12.c
new file mode 100644 (file)
index 0000000..5f132b8
--- /dev/null
@@ -0,0 +1,32 @@
+/* { dg-require-effective-target vect_condition } */
+/* { dg-require-effective-target vect_float } */
+
+#include <stdarg.h>
+#include <signal.h>
+#include "tree-vect.h"
+
+#define N 16
+#define MAX 42
+
+extern void abort(void); 
+
+int main ()
+{  
+  float A[N] = {36,39,42,45,43,32,21,12,23,34,45,56,67,78,89,11};
+  float B[N] = {0,0,0,42,42,0,0,0,0,0,42,42,42,42,42,0};
+  int i, j;
+
+  check_vect ();
+  for (i = 0; i < 16; i++)
+    A[i] = ( A[i] > MAX ? MAX : 0); 
+
+  /* check results:  */
+  for (i = 0; i < N; i++)
+    if (A[i] != B[i])
+      abort ();
+
+  return 0;
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-13.c b/gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-13.c
new file mode 100644 (file)
index 0000000..a5a5936
--- /dev/null
@@ -0,0 +1,33 @@
+/* { dg-require-effective-target vect_condition } */
+/* { dg-require-effective-target vect_float } */
+
+#include <stdarg.h>
+#include <signal.h>
+#include "tree-vect.h"
+
+#define N 16
+#define MAX 42
+
+extern void abort(void); 
+
+int main ()
+{  
+  float A[N] = {36,39,42,45,43,32,21,12,23,34,45,56,67,78,89,11};
+  float B[N] = {42,42,42,0,0,42,42,42,42,42,0,0,0,0,0,42};
+  int i, j;
+
+  check_vect ();
+
+  for (i = 0; i < 16; i++)
+    A[i] = ( A[i] <= MAX ? MAX : 0); 
+
+  /* check results:  */
+  for (i = 0; i < N; i++)
+    if (A[i] != B[i])
+      abort ();
+
+  return 0;
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-14.c b/gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-14.c
new file mode 100644 (file)
index 0000000..a5a5936
--- /dev/null
@@ -0,0 +1,33 @@
+/* { dg-require-effective-target vect_condition } */
+/* { dg-require-effective-target vect_float } */
+
+#include <stdarg.h>
+#include <signal.h>
+#include "tree-vect.h"
+
+#define N 16
+#define MAX 42
+
+extern void abort(void); 
+
+int main ()
+{  
+  float A[N] = {36,39,42,45,43,32,21,12,23,34,45,56,67,78,89,11};
+  float B[N] = {42,42,42,0,0,42,42,42,42,42,0,0,0,0,0,42};
+  int i, j;
+
+  check_vect ();
+
+  for (i = 0; i < 16; i++)
+    A[i] = ( A[i] <= MAX ? MAX : 0); 
+
+  /* check results:  */
+  for (i = 0; i < N; i++)
+    if (A[i] != B[i])
+      abort ();
+
+  return 0;
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-15.c b/gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-15.c
new file mode 100644 (file)
index 0000000..67d7ebe
--- /dev/null
@@ -0,0 +1,33 @@
+/* { dg-require-effective-target vect_condition } */
+/* { dg-require-effective-target vect_float } */
+
+#include <stdarg.h>
+#include <signal.h>
+#include "tree-vect.h"
+
+#define N 16
+#define MAX 42
+
+extern void abort(void); 
+
+int main ()
+{  
+  float A[N] = {36,39,42,45,43,32,21,12,23,34,45,56,67,78,89,11};
+  float B[N] = {42,42,0,0,0,42,42,42,42,42,0,0,0,0,0,42};
+  int i, j;
+
+  check_vect ();
+
+  for (i = 0; i < 16; i++)
+    A[i] = ( A[i] < MAX ? MAX : 0); 
+
+  /* check results:  */
+  for (i = 0; i < N; i++)
+    if (A[i] != B[i])
+      abort ();
+
+  return 0;
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-111.c b/gcc/testsuite/gcc.dg/vect/vect-111.c
deleted file mode 100644 (file)
index 413c7ef..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/* { dg-require-effective-target vect_float } */
-
-#include <stdarg.h>
-#include "tree-vect.h"
-
-#define N 16
-
-__attribute__ ((noinline)) int
-main1 (void)
-{
-  int i;
-  float a[N];
-  float b[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45};
-
-  /* Condition in loop.  */
-  /* This loop is vectorized on platforms that support vect_condition.  */
-  for (i = 0; i < N; i++)
-  {
-    a[i] = (b[i] > 0 ? b[i] : 0);
-  }
-
-  for (i = 0; i < N; i++)
-  {
-    if (a[i] != b[i])
-       abort ();
-  }
-  return 0;
-}
-
-int main (void)
-{
-  check_vect ();
-  return main1 ();
-}
-
-/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target powerpc*-*-* } } } */
-/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target i?86-*-* x86_64-*-* ia64-*-* } } } */
-/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-ifcvt-11.c b/gcc/testsuite/gcc.dg/vect/vect-ifcvt-11.c
deleted file mode 100644 (file)
index 560b5bc..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/* { dg-require-effective-target vect_condition } */
-/* { dg-require-effective-target vect_float } */
-
-#include <stdarg.h>
-#include <signal.h>
-#include "tree-vect.h"
-
-#define N 16
-#define MAX 42
-
-extern void abort(void); 
-
-int main ()
-{  
-  float A[N] = {36,39,42,45,43,32,21,12,23,34,45,56,67,78,89,11};
-  float B[N] = {0,0,42,42,42,0,0,0,0,0,42,42,42,42,42,0};
-  int i, j;
-
-  check_vect ();
-
-  for (i = 0; i < 16; i++)
-    A[i] = ( A[i] >= MAX ? MAX : 0); 
-
-  /* check results:  */
-  for (i = 0; i < N; i++)
-    if (A[i] != B[i])
-      abort ();
-
-  return 0;
-}
-
-/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
-/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-ifcvt-12.c b/gcc/testsuite/gcc.dg/vect/vect-ifcvt-12.c
deleted file mode 100644 (file)
index 5f132b8..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/* { dg-require-effective-target vect_condition } */
-/* { dg-require-effective-target vect_float } */
-
-#include <stdarg.h>
-#include <signal.h>
-#include "tree-vect.h"
-
-#define N 16
-#define MAX 42
-
-extern void abort(void); 
-
-int main ()
-{  
-  float A[N] = {36,39,42,45,43,32,21,12,23,34,45,56,67,78,89,11};
-  float B[N] = {0,0,0,42,42,0,0,0,0,0,42,42,42,42,42,0};
-  int i, j;
-
-  check_vect ();
-  for (i = 0; i < 16; i++)
-    A[i] = ( A[i] > MAX ? MAX : 0); 
-
-  /* check results:  */
-  for (i = 0; i < N; i++)
-    if (A[i] != B[i])
-      abort ();
-
-  return 0;
-}
-
-/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
-/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-ifcvt-13.c b/gcc/testsuite/gcc.dg/vect/vect-ifcvt-13.c
deleted file mode 100644 (file)
index a5a5936..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/* { dg-require-effective-target vect_condition } */
-/* { dg-require-effective-target vect_float } */
-
-#include <stdarg.h>
-#include <signal.h>
-#include "tree-vect.h"
-
-#define N 16
-#define MAX 42
-
-extern void abort(void); 
-
-int main ()
-{  
-  float A[N] = {36,39,42,45,43,32,21,12,23,34,45,56,67,78,89,11};
-  float B[N] = {42,42,42,0,0,42,42,42,42,42,0,0,0,0,0,42};
-  int i, j;
-
-  check_vect ();
-
-  for (i = 0; i < 16; i++)
-    A[i] = ( A[i] <= MAX ? MAX : 0); 
-
-  /* check results:  */
-  for (i = 0; i < N; i++)
-    if (A[i] != B[i])
-      abort ();
-
-  return 0;
-}
-
-/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
-/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-ifcvt-14.c b/gcc/testsuite/gcc.dg/vect/vect-ifcvt-14.c
deleted file mode 100644 (file)
index a5a5936..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/* { dg-require-effective-target vect_condition } */
-/* { dg-require-effective-target vect_float } */
-
-#include <stdarg.h>
-#include <signal.h>
-#include "tree-vect.h"
-
-#define N 16
-#define MAX 42
-
-extern void abort(void); 
-
-int main ()
-{  
-  float A[N] = {36,39,42,45,43,32,21,12,23,34,45,56,67,78,89,11};
-  float B[N] = {42,42,42,0,0,42,42,42,42,42,0,0,0,0,0,42};
-  int i, j;
-
-  check_vect ();
-
-  for (i = 0; i < 16; i++)
-    A[i] = ( A[i] <= MAX ? MAX : 0); 
-
-  /* check results:  */
-  for (i = 0; i < N; i++)
-    if (A[i] != B[i])
-      abort ();
-
-  return 0;
-}
-
-/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
-/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-ifcvt-15.c b/gcc/testsuite/gcc.dg/vect/vect-ifcvt-15.c
deleted file mode 100644 (file)
index 67d7ebe..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/* { dg-require-effective-target vect_condition } */
-/* { dg-require-effective-target vect_float } */
-
-#include <stdarg.h>
-#include <signal.h>
-#include "tree-vect.h"
-
-#define N 16
-#define MAX 42
-
-extern void abort(void); 
-
-int main ()
-{  
-  float A[N] = {36,39,42,45,43,32,21,12,23,34,45,56,67,78,89,11};
-  float B[N] = {42,42,0,0,0,42,42,42,42,42,0,0,0,0,0,42};
-  int i, j;
-
-  check_vect ();
-
-  for (i = 0; i < 16; i++)
-    A[i] = ( A[i] < MAX ? MAX : 0); 
-
-  /* check results:  */
-  for (i = 0; i < N; i++)
-    if (A[i] != B[i])
-      abort ();
-
-  return 0;
-}
-
-/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
-/* { dg-final { cleanup-tree-dump "vect" } } */
index 4703e78d22d655da416858946bafa363459c141f..8d680dfa6bf02205d55714459a524f7972780370 100644 (file)
@@ -1047,22 +1047,30 @@ expand_complex_div_wide (block_stmt_iterator *bsi, tree inner_type,
                         tree ar, tree ai, tree br, tree bi,
                         enum tree_code code)
 {
-  tree rr, ri, ratio, div, t1, t2, tr, ti, cond;
+  tree rr, ri, ratio, div, t1, t2, tr, ti, compare;
   basic_block bb_cond, bb_true, bb_false, bb_join;
 
   /* Examine |br| < |bi|, and branch.  */
   t1 = gimplify_build1 (bsi, ABS_EXPR, inner_type, br);
   t2 = gimplify_build1 (bsi, ABS_EXPR, inner_type, bi);
-  cond = fold_build2 (LT_EXPR, boolean_type_node, t1, t2);
-  STRIP_NOPS (cond);
+  compare = fold_build2 (LT_EXPR, boolean_type_node, t1, t2);
+  STRIP_NOPS (compare);
 
   bb_cond = bb_true = bb_false = bb_join = NULL;
   rr = ri = tr = ti = NULL;
-  if (!TREE_CONSTANT (cond))
+  if (!TREE_CONSTANT (compare))
     {
       edge e;
+      tree cond, tmp;
 
-      cond = build3 (COND_EXPR, void_type_node, cond, NULL_TREE, NULL_TREE);
+      tmp = create_tmp_var (boolean_type_node, NULL);
+      cond = build_gimple_modify_stmt (tmp, compare);
+      if (gimple_in_ssa_p (cfun))
+       tmp = make_ssa_name (tmp,  cond);
+      GIMPLE_STMT_OPERAND (cond, 0) = tmp;
+      bsi_insert_before (bsi, cond, BSI_SAME_STMT);
+
+      cond = build3 (COND_EXPR, void_type_node, tmp, NULL_TREE, NULL_TREE);
       bsi_insert_before (bsi, cond, BSI_SAME_STMT);
 
       /* Split the original block, and create the TRUE and FALSE blocks.  */
@@ -1098,7 +1106,7 @@ expand_complex_div_wide (block_stmt_iterator *bsi, tree inner_type,
       ti = (ai * ratio) - ar;
       tr = tr / div;
       ti = ti / div;  */
-  if (bb_true || integer_nonzerop (cond))
+  if (bb_true || integer_nonzerop (compare))
     {
       if (bb_true)
        {
@@ -1137,7 +1145,7 @@ expand_complex_div_wide (block_stmt_iterator *bsi, tree inner_type,
       ti = b - (a * ratio);
       tr = tr / div;
       ti = ti / div;  */
-  if (bb_false || integer_zerop (cond))
+  if (bb_false || integer_zerop (compare))
     {
       if (bb_false)
        {
index 06e4b5a9d07b1df2e4f9aac06d696adacd287e9f..9428e38c54e30eb3faf69092cde36de0887debc5 100644 (file)
@@ -1896,7 +1896,10 @@ tree_could_trap_p (tree expr)
       || TREE_CODE_CLASS (code) == tcc_binary)
     {
       t = TREE_TYPE (expr);
-      fp_operation = FLOAT_TYPE_P (t);
+      if (COMPARISON_CLASS_P (expr))
+       fp_operation = FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (expr, 0)));
+      else
+       fp_operation = FLOAT_TYPE_P (t);
       if (fp_operation)
        {
          honor_nans = flag_trapping_math && !flag_finite_math_only;
index 433c294039b2841815d6312b561d752475d09029..101dfd17c2ba7b4502d1e4b8103f4424e4fa5375 100644 (file)
@@ -155,7 +155,10 @@ is_gimple_lvalue (tree t)
 bool
 is_gimple_condexpr (tree t)
 {
-  return (is_gimple_val (t) || COMPARISON_CLASS_P (t));
+  return (is_gimple_val (t) || (COMPARISON_CLASS_P (t)
+                               && !tree_could_trap_p (t)
+                               && is_gimple_val (TREE_OPERAND (t, 0))
+                               && is_gimple_val (TREE_OPERAND (t, 1))));
 }
 
 /*  Return true if T is something whose address can be taken.  */
@@ -648,12 +651,7 @@ canonicalize_cond_expr_cond (tree t)
                  TREE_OPERAND (top0, 0), TREE_OPERAND (top0, 1));
     }
 
-  /* A valid conditional for a COND_EXPR is either a gimple value
-     or a comparison with two gimple value operands.  */
-  if (is_gimple_val (t)
-      || (COMPARISON_CLASS_P (t)
-         && is_gimple_val (TREE_OPERAND (t, 0))
-         && is_gimple_val (TREE_OPERAND (t, 1))))
+  if (is_gimple_condexpr (t))
     return t;
 
   return NULL_TREE;