From ad999c1c7cc283cd8287edf7e7d43fb1a249071d Mon Sep 17 00:00:00 2001 From: ebotcazou Date: Mon, 16 Mar 2015 09:59:01 +0000 Subject: [PATCH] * gcc-interface/utils2.c (gnat_invariant_expr): Return null if the type of the expression ends up being composite. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@221449 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ada/ChangeLog | 5 +++++ gcc/ada/gcc-interface/utils2.c | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gnat.dg/loop_optimization18.adb | 16 ++++++++++++++++ gcc/testsuite/gnat.dg/loop_optimization18.ads | 7 +++++++ gcc/testsuite/gnat.dg/loop_optimization18_pkg.ads | 15 +++++++++++++++ 6 files changed, 54 insertions(+) create mode 100644 gcc/testsuite/gnat.dg/loop_optimization18.adb create mode 100644 gcc/testsuite/gnat.dg/loop_optimization18.ads create mode 100644 gcc/testsuite/gnat.dg/loop_optimization18_pkg.ads diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index bfda926..e81f015 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,5 +1,10 @@ 2015-03-16 Eric Botcazou + * gcc-interface/utils2.c (gnat_invariant_expr): Return null if the type + of the expression ends up being composite. + +2015-03-16 Eric Botcazou + * gcc-interface/decl.c (is_from_limited_with_of_main): New predicate. (gnat_to_gnu_entity) : Invoke it on return and parameter types to detect circularities in ASIS mode. diff --git a/gcc/ada/gcc-interface/utils2.c b/gcc/ada/gcc-interface/utils2.c index e04add9..e25b815 100644 --- a/gcc/ada/gcc-interface/utils2.c +++ b/gcc/ada/gcc-interface/utils2.c @@ -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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9c8532a..d68e7a0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-03-16 Eric Botcazou + + * gnat.dg/loop_optimization18.ad[sb]: New test. + * gnat.dg/loop_optimization18_pkg.ads: New helper. + 2015-03-16 Alan Modra * 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 index 0000000..eb4eeca --- /dev/null +++ b/gcc/testsuite/gnat.dg/loop_optimization18.adb @@ -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 index 0000000..c9f3e2a --- /dev/null +++ b/gcc/testsuite/gnat.dg/loop_optimization18.ads @@ -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 index 0000000..9fb3311 --- /dev/null +++ b/gcc/testsuite/gnat.dg/loop_optimization18_pkg.ads @@ -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; -- 2.7.4