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