aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorOlivier Hainque <hainque@adacore.com>2017-03-10 11:16:21 +0000
committerOlivier Hainque <hainque@gcc.gnu.org>2017-03-10 11:16:21 +0000
commitf1b0632aabe6473bf810b5e901d979a4570b7de5 (patch)
tree288a78ad82886d01310221ae6121bb0e46d117d9 /gcc
parent2d9dd4fb867bffd009ebc85896dceb932559d90a (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gnat.dg/opt64.adb25
-rw-r--r--gcc/testsuite/gnat.dg/opt64_pkg.adb14
-rw-r--r--gcc/testsuite/gnat.dg/opt64_pkg.ads6
-rw-r--r--gcc/tree-switch-conversion.c13
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;