utils2.c (gnat_invariant_expr): Return null if the type of the expression ends up...
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 16 Mar 2015 09:59:01 +0000 (09:59 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Mon, 16 Mar 2015 09:59:01 +0000 (09:59 +0000)
* gcc-interface/utils2.c (gnat_invariant_expr): Return null if the type
of the expression ends up being composite.

From-SVN: r221449

gcc/ada/ChangeLog
gcc/ada/gcc-interface/utils2.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/loop_optimization18.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/loop_optimization18.ads [new file with mode: 0644]
gcc/testsuite/gnat.dg/loop_optimization18_pkg.ads [new file with mode: 0644]

index bfda926a163899dad88909fd1281dc8afa715304..e81f0150e9a732c6bd3f236204930cc13798913c 100644 (file)
@@ -1,3 +1,8 @@
+2015-03-16  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/utils2.c (gnat_invariant_expr): Return null if the type
+       of the expression ends up being composite.
+
 2015-03-16  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/decl.c (is_from_limited_with_of_main): New predicate.
index e04add97d085a207a1801448547f52f44566f532..e25b815a5dd14dfc1debeadc91ac6a26b18794c1 100644 (file)
@@ -2805,6 +2805,12 @@ gnat_invariant_expr (tree expr)
       expr = remove_conversions (expr, false);
     }
 
+  /* We are only interested in scalar types at the moment and, even if we may
+     have gone through padding types in the above loop, we must be back to a
+     scalar value at this point.  */
+  if (AGGREGATE_TYPE_P (TREE_TYPE (expr)))
+    return NULL_TREE;
+
   if (TREE_CONSTANT (expr))
     return fold_convert (type, expr);
 
index 9c8532aa05a9171616db09bb8ba63cb4740f2dd6..d68e7a02f979d29f4887df770b2773fabbc4cc3c 100644 (file)
@@ -1,3 +1,8 @@
+2015-03-16  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/loop_optimization18.ad[sb]: New test.
+       * gnat.dg/loop_optimization18_pkg.ads: New helper.
+
 2015-03-16  Alan Modra  <amodra@gmail.com>
 
        * gcc.target/powerpc/pr53199.c: Add extra functions.  Revert
diff --git a/gcc/testsuite/gnat.dg/loop_optimization18.adb b/gcc/testsuite/gnat.dg/loop_optimization18.adb
new file mode 100644 (file)
index 0000000..eb4eeca
--- /dev/null
@@ -0,0 +1,16 @@
+-- { dg-do compile }
+-- { dg-options "-O3" }
+
+package body Loop_Optimization18 is
+
+   procedure Proc (Message : Byte_Array_Type) is
+
+      R : Rec (Conv (Message));
+
+   begin
+      for Division in 1 .. R.UB loop
+         R.L (Division) := 0;
+      end loop;
+  end;
+
+end Loop_Optimization18;
diff --git a/gcc/testsuite/gnat.dg/loop_optimization18.ads b/gcc/testsuite/gnat.dg/loop_optimization18.ads
new file mode 100644 (file)
index 0000000..c9f3e2a
--- /dev/null
@@ -0,0 +1,7 @@
+with Loop_Optimization18_Pkg; use Loop_Optimization18_Pkg;
+
+package Loop_Optimization18 is
+
+   procedure Proc (Message : Byte_Array_Type);
+
+end Loop_Optimization18;
diff --git a/gcc/testsuite/gnat.dg/loop_optimization18_pkg.ads b/gcc/testsuite/gnat.dg/loop_optimization18_pkg.ads
new file mode 100644 (file)
index 0000000..9fb3311
--- /dev/null
@@ -0,0 +1,15 @@
+with Unchecked_Conversion;
+
+package Loop_Optimization18_Pkg is
+
+   type Arr is array (Integer range <>) of Natural;
+
+   type Rec (UB : Integer) is record
+      L : Arr (1 .. UB);
+   end record;
+
+   type Byte_Array_Type is new String (1..4);
+
+   function Conv is new Unchecked_Conversion (Byte_Array_Type, Integer);
+
+end Loop_Optimization18_Pkg;