From 61e0b23353f25d12fd1925ccd2aaaf19f56ddbcb Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Mon, 16 Mar 2015 09:59:01 +0000 Subject: [PATCH] utils2.c (gnat_invariant_expr): Return null if the type of the expression ends up being composite. * 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 | 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 +++++++ .../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 bfda926a163..e81f0150e9a 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +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. diff --git a/gcc/ada/gcc-interface/utils2.c b/gcc/ada/gcc-interface/utils2.c index e04add97d08..e25b815a5dd 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 9c8532aa05a..d68e7a02f97 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 00000000000..eb4eeca32e2 --- /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 00000000000..c9f3e2a1eb9 --- /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 00000000000..9fb3311ca03 --- /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.30.2