diff options
author | Olivier Hainque <hainque@adacore.com> | 2017-03-10 11:16:21 +0000 |
---|---|---|
committer | Olivier Hainque <hainque@gcc.gnu.org> | 2017-03-10 11:16:21 +0000 |
commit | f1b0632aabe6473bf810b5e901d979a4570b7de5 (patch) | |
tree | 288a78ad82886d01310221ae6121bb0e46d117d9 /gcc | |
parent | 2d9dd4fb867bffd009ebc85896dceb932559d90a (diff) | |
download | gcc-f1b0632aabe6473bf810b5e901d979a4570b7de5.zip gcc-f1b0632aabe6473bf810b5e901d979a4570b7de5.tar.gz gcc-f1b0632aabe6473bf810b5e901d979a4570b7de5.tar.bz2 |
tree-switch-conversion (array_value_type): Start by resetting candidate type to it's main variant.
2017-03-10 Olivier Hainque <hainque@adacore.com>
* tree-switch-conversion (array_value_type): Start by resetting
candidate type to it's main variant.
testsuite/
* gnat.dg/opt64.adb: New test.
* gnat.dg/opt64_pkg.ads: New helper.
* gnat.dg/opt64_pkg.adb: New helper.
From-SVN: r246024
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/opt64.adb | 25 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/opt64_pkg.adb | 14 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/opt64_pkg.ads | 6 | ||||
-rw-r--r-- | gcc/tree-switch-conversion.c | 13 |
6 files changed, 66 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b44a7a5..5050ca8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2017-03-10 Olivier Hainque <hainque@adacore.com> + + * tree-switch-conversion (array_value_type): Start by resetting + candidate type to it's main variant. + 2017-03-10 Jakub Jelinek <jakub@redhat.com> PR rtl-optimization/79909 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index bf1c69d..b17299b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2017-03-10 Olivier Hainque <hainque@adacore.com> + + * gnat.dg/opt64.adb: New test. + * gnat.dg/opt64_pkg.ads: New helper. + * gnat.dg/opt64_pkg.adb: New helper. + 2017-03-10 Jakub Jelinek <jakub@redhat.com> PR rtl-optimization/79909 diff --git a/gcc/testsuite/gnat.dg/opt64.adb b/gcc/testsuite/gnat.dg/opt64.adb new file mode 100644 index 0000000..6d287d3 --- /dev/null +++ b/gcc/testsuite/gnat.dg/opt64.adb @@ -0,0 +1,25 @@ +-- { dg-do run } +-- { dg-options "-O2" } + +-- The issue which prompted the test is a compilation failure. Might +-- as well verify that the generated code performs as expected. + +with opt64_pkg; use opt64_pkg; + +procedure opt64 is + procedure assert (T : boolean) is + begin + if not T then + raise program_error; + end if; + end; +begin + Encode (1); + assert (last_hash = "1"); + Encode (2); + assert (last_hash = "2"); + Encode (3); + assert (last_hash = "3"); + Encode (6); + assert (last_hash = "?"); +end; diff --git a/gcc/testsuite/gnat.dg/opt64_pkg.adb b/gcc/testsuite/gnat.dg/opt64_pkg.adb new file mode 100644 index 0000000..5235e73 --- /dev/null +++ b/gcc/testsuite/gnat.dg/opt64_pkg.adb @@ -0,0 +1,14 @@ +package body Opt64_PKG is + + procedure Encode (X : Integer) is + result : Hash; + begin + case X is + when 1 => result := "1"; + when 2 => result := "2"; + when 3 => result := "3"; + when others => Result := "?"; + end case; + Last_Hash := Result; + end; +end; diff --git a/gcc/testsuite/gnat.dg/opt64_pkg.ads b/gcc/testsuite/gnat.dg/opt64_pkg.ads new file mode 100644 index 0000000..e4b09fc --- /dev/null +++ b/gcc/testsuite/gnat.dg/opt64_pkg.ads @@ -0,0 +1,6 @@ +package Opt64_PKG is + type Hash is new string (1 .. 1); + Last_Hash : Hash; + + procedure Encode (X : Integer); +end; diff --git a/gcc/tree-switch-conversion.c b/gcc/tree-switch-conversion.c index ce1d11d..1ccb4bd 100644 --- a/gcc/tree-switch-conversion.c +++ b/gcc/tree-switch-conversion.c @@ -935,9 +935,9 @@ constructor_contains_same_values_p (vec<constructor_elt, va_gc> *vec) return prev; } -/* Return type which should be used for array elements, either TYPE, - or for integral type some smaller integral type that can still hold - all the constants. */ +/* Return type which should be used for array elements, either TYPE's + main variant or, for integral types, some smaller integral type + that can still hold all the constants. */ static tree array_value_type (gswitch *swtch, tree type, int num, @@ -949,6 +949,13 @@ array_value_type (gswitch *swtch, tree type, int num, int sign = 0; tree smaller_type; + /* Types with alignments greater than their size can reach here, e.g. out of + SRA. We couldn't use these as an array component type so get back to the + main variant first, which, for our purposes, is fine for other types as + well. */ + + type = TYPE_MAIN_VARIANT (type); + if (!INTEGRAL_TYPE_P (type)) return type; |