tree-ssa-phiopt.c (factor_out_conditional_conversion): Remove redundant test and...
authorEric Botcazou <ebotcazou@adacore.com>
Wed, 25 May 2016 20:41:01 +0000 (20:41 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Wed, 25 May 2016 20:41:01 +0000 (20:41 +0000)
* tree-ssa-phiopt.c (factor_out_conditional_conversion): Remove
redundant test and bail out if the type of the new operand is not
a GIMPLE register type after stripping a VIEW_CONVERT_EXPR.

From-SVN: r236748

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/opt55.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/opt55.ads [new file with mode: 0644]
gcc/tree-ssa-phiopt.c

index 0172c8ba1546210d84470c87f3666c85b81a8038..43be10fe61e0e21beb6be66bd9b903385360e996 100644 (file)
@@ -1,3 +1,9 @@
+2016-05-25  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * tree-ssa-phiopt.c (factor_out_conditional_conversion): Remove
+       redundant test and bail out if the type of the new operand is not
+       a GIMPLE register type after stripping a VIEW_CONVERT_EXPR.
+
 2016-05-25  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/i386/i386.opt (ix86_target_flags_explicit): Remove.
index f89efd337885543fd205bb20061a2b7a58077e02..23dc60d29b5ce686fc76ed9aabe406f784470061 100644 (file)
@@ -1,3 +1,7 @@
+2016-05-25  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/opt55.ad[sb]: New test.
+
 2016-05-25  Senthil Kumar Selvaraj  <senthil_kumar.selvaraj@atmel.com>
 
        * c-c++-common/Wduplicated-cond-1.c: Use smaller const literal.
diff --git a/gcc/testsuite/gnat.dg/opt55.adb b/gcc/testsuite/gnat.dg/opt55.adb
new file mode 100644 (file)
index 0000000..70f486b
--- /dev/null
@@ -0,0 +1,20 @@
+-- { dg-do compile }\r
+-- { dg-options "-O" }\r
+\r
+package body Opt55 is\r
+\r
+   function Cond (B : Boolean; If_True, If_False : Date) return Date is\r
+   begin\r
+      if B then\r
+         return If_True;\r
+      else\r
+         return If_False;\r
+      end if;\r
+   end;\r
+\r
+   function F (C : Rec2; B : Boolean) return Date is\r
+   begin\r
+      return Cond (B, C.D1, C.D2);\r
+   end;\r
+\r
+end Opt55;\r
diff --git a/gcc/testsuite/gnat.dg/opt55.ads b/gcc/testsuite/gnat.dg/opt55.ads
new file mode 100644 (file)
index 0000000..fec3c9a
--- /dev/null
@@ -0,0 +1,22 @@
+package Opt55 is\r
+\r
+   type Date is record\r
+      D : Float;\r
+   end record;\r
+\r
+   type Rec1 (Kind : Boolean := False) is record\r
+      case Kind is\r
+         when True => N : Natural;\r
+         when False => null;\r
+      end case;\r
+   end record;\r
+\r
+   type Rec2 (D : Positive) is record\r
+      R  : Rec1;\r
+      D1 : Date;\r
+      D2 : Date;\r
+   end record;\r
+\r
+   function F (C : Rec2; B : Boolean) return Date;\r
+\r
+end Opt55;\r
index a752fe0fd1c216016c30945ee32374e6f68f4c31..caf591bc529fd123726a37d5f9b6c4040319d540 100644 (file)
@@ -438,15 +438,18 @@ factor_out_conditional_conversion (edge e0, edge e1, gphi *phi,
   /* Check if arg0 is an SSA_NAME and the stmt which defines arg0 is
      a conversion.  */
   arg0_def_stmt = SSA_NAME_DEF_STMT (arg0);
-  if (!is_gimple_assign (arg0_def_stmt)
-      || !gimple_assign_cast_p (arg0_def_stmt))
+  if (!gimple_assign_cast_p (arg0_def_stmt))
     return NULL;
 
   /* Use the RHS as new_arg0.  */
   convert_code = gimple_assign_rhs_code (arg0_def_stmt);
   new_arg0 = gimple_assign_rhs1 (arg0_def_stmt);
   if (convert_code == VIEW_CONVERT_EXPR)
-    new_arg0 = TREE_OPERAND (new_arg0, 0);
+    {
+      new_arg0 = TREE_OPERAND (new_arg0, 0);
+      if (!is_gimple_reg_type (TREE_TYPE (new_arg0)))
+       return NULL;
+    }
 
   if (TREE_CODE (arg1) == SSA_NAME)
     {