tree-ssa-phiopt.c (minmax_replacement): Create new ssa name if we're not the only...
authorNathan Sidwell <nathan@acm.org>
Tue, 11 Aug 2015 12:34:06 +0000 (12:34 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Tue, 11 Aug 2015 12:34:06 +0000 (12:34 +0000)
* tree-ssa-phiopt.c (minmax_replacement): Create new ssa name if
we're not the only contributor to target phi.

testsuite/
* c-c++-common/dfp/operator-comma.c: Call init function.
* c-c++-common/dfp/convert-dfp-2.c: New test.

From-SVN: r226778

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/dfp/convert-dfp-2.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/dfp/operator-comma.c
gcc/tree-ssa-phiopt.c

index 61fd887a65ac7a9ac4404f5abc4b5a230a84c79a..3a078162b356c2b3f6e8eea6cc83a1bcee9973aa 100644 (file)
@@ -1,3 +1,8 @@
+2015-08-11  Nathan Sidwell  <nathan@acm.org>
+
+       * tree-ssa-phiopt.c (minmax_replacement): Create new ssa name if
+       we're not the only contributor to target phi.
+
 2015-08-11  Jiong Wang  <jiong.wang@arm.com>
 
        * config/aarch64/aarch64.h (REG_CLASS_NAMES): Add the missing ',' after
index 34a5c1a593ee8a3a6fbb48565f5821b6a0b54e87..8d4903f5b62141b6ae8399374e7238ddbe842127 100644 (file)
@@ -1,3 +1,8 @@
+2015-08-11  Nathan Sidwell  <nathan@acm.org>
+
+       * c-c++-common/dfp/operator-comma.c: Call init function.
+       * c-c++-common/dfp/convert-dfp-2.c: New test.
+
 2015-08-10  H.J. Lu  <hongjiu.lu@intel.com>
 
        * gcc.target/i386/builtin_target.c (check_intel_cpu_model):
diff --git a/gcc/testsuite/c-c++-common/dfp/convert-dfp-2.c b/gcc/testsuite/c-c++-common/dfp/convert-dfp-2.c
new file mode 100644 (file)
index 0000000..a50b202
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-options "-O0" } */
+
+/* Test decimal fp conversions of zero.  */
+
+#include "dfp-dbg.h"
+
+volatile _Decimal32 d32a, d32c;
+volatile _Decimal64 d64a, d64c;
+volatile _Decimal128 d128a, d128c;
+
+int
+main ()
+{
+  d32a = d32c;
+  if (d32a)
+    FAILURE
+  d32a = d64c;
+  if (d32a)
+    FAILURE
+  d32a = d128c;
+  if (d32a)
+    FAILURE
+
+  d64a = d32c;
+  if (d64a)
+    FAILURE
+  d64a = d64c;
+  if (d64a)
+    FAILURE
+  d64a = d128c;
+  if (d64a)
+    FAILURE
+  
+  d128a = d32c;
+  if (d128a)
+    FAILURE
+  d128a = d64c;
+  if (d128a)
+    FAILURE
+  d128a = d128c;
+  if (d128a)
+    FAILURE
+  
+  FINISH
+}
index be6bf6f8cd1f4f266fc157208778bef29077a4b5..7055087ba6e271cb81e656b8de0fd81db41da9e3 100644 (file)
@@ -24,6 +24,8 @@ init ()
 int
 main ()
 {
+  init ();
+  
   d32a = (d32b, d32c);
   if (d32a != d32c)
     FAILURE
index 633ccc7edf23c14aa592c5b6ad8a037aa1b799ee..d46ba6229612c86cc1db42ee59683143a5a2b271 100644 (file)
@@ -1277,8 +1277,16 @@ minmax_replacement (basic_block cond_bb, basic_block middle_bb,
       gsi_move_before (&gsi_from, &gsi);
     }
 
+  /* Create an SSA var to hold the min/max result.  If we're the only
+     things setting the target PHI, then we  can clone the PHI
+     variable.  Otherwise we must create a new one.  */
+  result = PHI_RESULT (phi);
+  if (EDGE_COUNT (gimple_bb (phi)->preds) == 2)
+    result = duplicate_ssa_name (result, NULL);
+  else
+    result = make_ssa_name (TREE_TYPE (result));
+
   /* Emit the statement to compute min/max.  */
-  result = duplicate_ssa_name (PHI_RESULT (phi), NULL);
   new_stmt = gimple_build_assign (result, minmax, arg0, arg1);
   gsi = gsi_last_bb (cond_bb);
   gsi_insert_before (&gsi, new_stmt, GSI_NEW_STMT);