aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2018-10-22 15:09:33 +0200
committerMartin Liska <marxin@gcc.gnu.org>2018-10-22 13:09:33 +0000
commitd78bcb133d4559273bf6f6125f2659354e3f505e (patch)
tree4e08ef3d6089ef46215679fc69d772ff9e2bf845 /gcc
parentc7acc2964eb184e9151a822cd74b96890804a81e (diff)
downloadgcc-d78bcb133d4559273bf6f6125f2659354e3f505e.zip
gcc-d78bcb133d4559273bf6f6125f2659354e3f505e.tar.gz
gcc-d78bcb133d4559273bf6f6125f2659354e3f505e.tar.bz2
Revert r263947.
2018-10-22 Martin Liska <mliska@suse.cz> PR tree-optimization/87686 Revert 2018-08-29 Martin Liska <mliska@suse.cz> * tree-switch-conversion.c (switch_conversion::expand): Strenghten assumption about gswitch statements. 2018-10-22 Martin Liska <mliska@suse.cz> PR tree-optimization/87686 * g++.dg/tree-ssa/pr87686.C: New test. From-SVN: r265388
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/tree-ssa/pr87686.C21
-rw-r--r--gcc/tree-switch-conversion.c9
4 files changed, 43 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 736904f..8bf1434 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,14 @@
2018-10-22 Martin Liska <mliska@suse.cz>
+ PR tree-optimization/87686
+ Revert
+ 2018-08-29 Martin Liska <mliska@suse.cz>
+
+ * tree-switch-conversion.c (switch_conversion::expand):
+ Strenghten assumption about gswitch statements.
+
+2018-10-22 Martin Liska <mliska@suse.cz>
+
* ipa-icf.c (sem_item::compare_attributes): Remove.
(sem_item::compare_referenced_symbol_properties): Use
attribute_list_equal instead.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2743301..b803f72 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-10-22 Martin Liska <mliska@suse.cz>
+
+ PR tree-optimization/87686
+ * g++.dg/tree-ssa/pr87686.C: New test.
+
2018-10-22 Jakub Jelinek <jakub@redhat.com>
* g++.target/i386/i386.exp: Use g++-dg-runtest to iterate
diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr87686.C b/gcc/testsuite/g++.dg/tree-ssa/pr87686.C
new file mode 100644
index 0000000..65160a7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tree-ssa/pr87686.C
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+class a {
+public:
+ enum b { c, g, d, e } f;
+ a(b h) : f(h) {}
+ a i() {
+ switch (f) {
+ case d:
+ return c;
+ case e:
+ return g;
+ }
+ } /* { dg-warning "control reaches end of non-void function" } */
+};
+struct k {
+ a j;
+ k l() { j.i(); } /* { dg-warning "no return statement in function returning non-void" } */
+};
+void m(k h) { h.l(); }
diff --git a/gcc/tree-switch-conversion.c b/gcc/tree-switch-conversion.c
index 64169a6..ac2aa58 100644
--- a/gcc/tree-switch-conversion.c
+++ b/gcc/tree-switch-conversion.c
@@ -913,7 +913,14 @@ switch_conversion::expand (gswitch *swtch)
/* Group case labels so that we get the right results from the heuristics
that decide on the code generation approach for this switch. */
m_cfg_altered |= group_case_labels_stmt (swtch);
- gcc_assert (gimple_switch_num_labels (swtch) >= 2);
+
+ /* If this switch is now a degenerate case with only a default label,
+ there is nothing left for us to do. */
+ if (gimple_switch_num_labels (swtch) < 2)
+ {
+ m_reason = "switch is a degenerate case";
+ return;
+ }
collect (swtch);