aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndi Kleen <ak@gcc.gnu.org>2024-10-15 13:16:02 -0700
committerAndi Kleen <ak@gcc.gnu.org>2024-10-16 06:48:55 -0700
commitd5a05db80fa95dcae1ebc177f7790e1d34fa73ed (patch)
tree62e98b98a2e6476d93747ef4d0e059e446e6b144 /gcc
parente48a65d3b3fcbcf6059df247d9c87a9a19b35861 (diff)
downloadgcc-d5a05db80fa95dcae1ebc177f7790e1d34fa73ed.zip
gcc-d5a05db80fa95dcae1ebc177f7790e1d34fa73ed.tar.gz
gcc-d5a05db80fa95dcae1ebc177f7790e1d34fa73ed.tar.bz2
PR116510: Add missing fold_converts into tree switch if conversion
Passes test suite. Ok to commit? gcc/ChangeLog: PR middle-end/116510 * tree-if-conv.cc (predicate_bbs): Add missing fold_converts. gcc/testsuite/ChangeLog: * gcc.dg/vect/vect-switch-ifcvt-3.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-switch-ifcvt-3.c12
-rw-r--r--gcc/tree-if-conv.cc9
2 files changed, 18 insertions, 3 deletions
diff --git a/gcc/testsuite/gcc.dg/vect/vect-switch-ifcvt-3.c b/gcc/testsuite/gcc.dg/vect/vect-switch-ifcvt-3.c
new file mode 100644
index 0000000..41bc8a1
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-switch-ifcvt-3.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+// PR116510
+
+char excmap_def_0;
+int gg_strescape_i;
+void gg_strescape() {
+ for (; gg_strescape_i; gg_strescape_i++)
+ switch ((unsigned char)gg_strescape_i)
+ case '\\':
+ case '"':
+ excmap_def_0 = 0;
+}
diff --git a/gcc/tree-if-conv.cc b/gcc/tree-if-conv.cc
index 90c754a..376a464 100644
--- a/gcc/tree-if-conv.cc
+++ b/gcc/tree-if-conv.cc
@@ -1477,10 +1477,12 @@ predicate_bbs (loop_p loop)
{
tree low = build2_loc (loc, GE_EXPR,
boolean_type_node,
- index, CASE_LOW (label));
+ index, fold_convert_loc (loc, TREE_TYPE (index),
+ CASE_LOW (label)));
tree high = build2_loc (loc, LE_EXPR,
boolean_type_node,
- index, CASE_HIGH (label));
+ index, fold_convert_loc (loc, TREE_TYPE (index),
+ CASE_HIGH (label)));
case_cond = build2_loc (loc, TRUTH_AND_EXPR,
boolean_type_node,
low, high);
@@ -1489,7 +1491,8 @@ predicate_bbs (loop_p loop)
case_cond = build2_loc (loc, EQ_EXPR,
boolean_type_node,
index,
- CASE_LOW (gimple_switch_label (sw, i)));
+ fold_convert_loc (loc, TREE_TYPE (index),
+ CASE_LOW (label)));
if (i > 1)
switch_cond = build2_loc (loc, TRUTH_OR_EXPR,
boolean_type_node,