re PR tree-optimization/86514 (wrong manipulation of 2-dimensional packed array at -O)
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 16 Jul 2018 08:59:09 +0000 (08:59 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Mon, 16 Jul 2018 08:59:09 +0000 (08:59 +0000)
PR tree-optimization/86514
* tree-ssa-reassoc.c (init_range_entry) <CASE_CONVERT>: Return for a
conversion to a boolean type from a type with greater precision.

From-SVN: r262684

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

index 7b48f8386618da82935603cda8d5fa5f3663fde7..5ed47c13633b7313dbac38246a78d87a3d4c690f 100644 (file)
@@ -1,3 +1,9 @@
+2018-07-16  Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR tree-optimization/86514
+       * tree-ssa-reassoc.c (init_range_entry) <CASE_CONVERT>: Return for a
+       conversion to a boolean type from a type with greater precision.
+
 2018-07-16  Tom de Vries  <tdevries@suse.de>
 
        * var-tracking.c (vt_initialize): Print adjusted insn slim if
index 9b6fe46edfac882ee1a754a90d7e91693f6b31cc..b943f233ec0f3b9b2f2532dafcaec42351529ed2 100644 (file)
@@ -1,3 +1,7 @@
+2018-07-16  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/opt73.adb: New test.
+
 2018-07-16  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/3698
diff --git a/gcc/testsuite/gnat.dg/opt73.adb b/gcc/testsuite/gnat.dg/opt73.adb
new file mode 100644 (file)
index 0000000..38ab477
--- /dev/null
@@ -0,0 +1,34 @@
+-- { dg-do run }
+-- { dg-options "-O" }
+
+procedure Opt73 is
+
+   type Terminal_Set_Indexed_By_Non_Terminal is
+     array (Natural range <>, Natural  range <>) of Boolean with Pack;
+
+   type Terminal_Set_Per_Non_Terminal
+     (Last_Terminal     : Natural;
+      Last_Non_Terminal : Natural) is
+   record
+      Map : Terminal_Set_Indexed_By_Non_Terminal
+        (1 .. Last_Non_Terminal, 0 .. Last_Terminal);
+   end record;
+
+   Follow : Terminal_Set_Per_Non_Terminal (5, 4);
+   Expect : Terminal_Set_Per_Non_Terminal :=
+     (5, 4, (1 => (2 => True, others => False),
+             others => (others => False)));
+
+   procedure Get_Follow (Value : out Terminal_Set_Per_Non_Terminal) is
+   begin
+      Value.Map := (others => (others => False));
+      Value.Map (1, 2) := True;
+      Value.Map (2, 0) := Value.Map (2, 0) or Value.Map (1, 0);
+   end;
+
+begin
+   Get_Follow (Follow);
+   if Follow /= Expect then
+      raise Program_Error;
+   end if;
+end;
index 97a53cd27cdfafba631f4d1984c03043a7c22125..41a37ab29899863cc79891faa778ca29cf007659 100644 (file)
@@ -2168,8 +2168,13 @@ init_range_entry (struct range_entry *r, tree exp, gimple *stmt)
          continue;
        CASE_CONVERT:
          if (is_bool)
-           goto do_default;
-         if (TYPE_PRECISION (TREE_TYPE (arg0)) == 1)
+           {
+             if ((TYPE_PRECISION (exp_type) == 1
+                  || TREE_CODE (exp_type) == BOOLEAN_TYPE)
+                 && TYPE_PRECISION (TREE_TYPE (arg0)) > 1)
+               return;
+           }
+         else if (TYPE_PRECISION (TREE_TYPE (arg0)) == 1)
            {
              if (TYPE_UNSIGNED (TREE_TYPE (arg0)))
                is_bool = true;