From f7251a2c103bc48775cb9726a4bebeaebde96684 Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Tue, 8 Dec 2020 13:18:37 +0100 Subject: if-to-switch: fix matching of negative conditions gcc/ChangeLog: PR tree-optimization/98182 * gimple-if-to-switch.cc (pass_if_to_switch::execute): Request chain linkage through false edges only. gcc/testsuite/ChangeLog: PR tree-optimization/98182 * gcc.dg/tree-ssa/if-to-switch-10.c: New test. * gcc.dg/tree-ssa/pr98182.c: New test. --- gcc/gimple-if-to-switch.cc | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'gcc/gimple-if-to-switch.cc') diff --git a/gcc/gimple-if-to-switch.cc b/gcc/gimple-if-to-switch.cc index 8e1043a..311f6f6 100644 --- a/gcc/gimple-if-to-switch.cc +++ b/gcc/gimple-if-to-switch.cc @@ -522,6 +522,12 @@ pass_if_to_switch::execute (function *fun) if (!info2 || info->m_ranges[0].exp != info2->m_ranges[0].exp) break; + /* It is important that the blocks are linked through FALSE_EDGE. + For an expression of index != VALUE, true and false edges + are flipped. */ + if (info2->m_false_edge != e) + break; + chain->m_entries.safe_push (info2); bitmap_set_bit (seen_bbs, e->src->index); info = info2; -- cgit v1.1