We are not expecting the switch index and the case labels to differ
in types.  The following fixes this by converting the case label
values accordingly.

Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.

        PR tree-optimization/127262
        * gimple-predicate-analysis.cc (predicate::init_from_control_deps):
        Convert switch label values to the type of the switch index.

        * gcc.dg/pr127262.c: New testcase.
---
 gcc/gimple-predicate-analysis.cc | 12 +++++++---
 gcc/testsuite/gcc.dg/pr127262.c  | 40 ++++++++++++++++++++++++++++++++
 2 files changed, 49 insertions(+), 3 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/pr127262.c

diff --git a/gcc/gimple-predicate-analysis.cc b/gcc/gimple-predicate-analysis.cc
index 2acf1b5d745..6ecb1bc0387 100644
--- a/gcc/gimple-predicate-analysis.cc
+++ b/gcc/gimple-predicate-analysis.cc
@@ -1906,7 +1906,9 @@ predicate::init_from_control_deps (const vec<edge> 
*dep_chains,
                {
                  pred_info one_pred;
                  one_pred.pred_lhs = gimple_switch_index (gs);
-                 one_pred.pred_rhs = CASE_LOW (l);
+                 one_pred.pred_rhs
+                   = wide_int_to_tree (TREE_TYPE (one_pred.pred_lhs),
+                                       wi::to_widest (CASE_LOW (l)));
                  one_pred.cond_code = EQ_EXPR;
                  one_pred.invert = false;
                  t_chain.safe_push (one_pred);
@@ -1920,11 +1922,15 @@ predicate::init_from_control_deps (const vec<edge> 
*dep_chains,
                     of two here.  */
                  pred_info one_pred;
                  one_pred.pred_lhs = gimple_switch_index (gs);
-                 one_pred.pred_rhs = CASE_LOW (l);
+                 one_pred.pred_rhs
+                   = wide_int_to_tree (TREE_TYPE (one_pred.pred_lhs),
+                                       wi::to_widest (CASE_LOW (l)));
                  one_pred.cond_code = GE_EXPR;
                  one_pred.invert = false;
                  t_chain.safe_push (one_pred);
-                 one_pred.pred_rhs = CASE_HIGH (l);
+                 one_pred.pred_rhs
+                   = wide_int_to_tree (TREE_TYPE (one_pred.pred_lhs),
+                                       wi::to_widest (CASE_HIGH (l)));
                  one_pred.cond_code = LE_EXPR;
                  t_chain.safe_push (one_pred);
                  has_valid_pred = true;
diff --git a/gcc/testsuite/gcc.dg/pr127262.c b/gcc/testsuite/gcc.dg/pr127262.c
new file mode 100644
index 00000000000..0ae968d4e5e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr127262.c
@@ -0,0 +1,40 @@
+/* { dg-do compile } */
+/* { dg-options "-O -Wmaybe-uninitialized" } */
+
+_Bool g18, f1_c17;
+void *f1_a0;
+void f1() {
+  unsigned char init8;
+  _Bool c15, c18 = 0;
+lbl_f2_b0:
+  if (g18)
+  lbl_f2_b1:
+  lbl_f2_b4:
+  lbl_f2_b8:
+    if (f1_c17)
+    lbl_f2_b9:
+      if (f1_c17)
+        goto lbl_f2_b28;
+lbl_f2_b14:
+  if (g18)
+    goto lbl_f2_b62;
+lbl_f2_b28:
+  init8 = c18;
+  switch (init8) {
+  case 9:
+    goto lbl_f2_b1;
+  case 13:
+    goto lbl_f2_b9;
+  case 1:
+    goto lbl_f2_b0;
+  case 11:
+  case 25:
+    goto lbl_f2_b4;
+  }
+lbl_f2_b62:
+  c18 = 80;
+  if (c15) /* { dg-warning "may be used uninitialized" } */
+    goto lbl_f2_b1;
+  c15 = f1_a0;
+  goto lbl_f2_b14;
+}
-- 
2.51.0

Reply via email to