Hi! While the testcase could be perhaps handled with some extra effort (the issue there is just CSE of an early possibly throwing trapping addition, so maybe_cleanup_or_replace_eh_stmt + gimple_purge_dead_eh_edges + TODO_cleanup_cfg might do the job, but I'm afraid the pass wouldn't know what to do if it rewrites some arithmetics as a different one where EH edges would need to be added etc.
So, instead this patch just punts with -fnon-call-exceptions and possibly throwing statements. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? If later on we find something where it will be worthwhile to spend time on this, it can be easily reverted together with the full support for that. 2018-01-04 Jakub Jelinek <ja...@redhat.com> PR tree-optimization/83605 * gimple-ssa-strength-reduction.c: Include tree-eh.h. (find_candidates_dom_walker::before_dom_children): Ignore stmts that can throw. * gcc.dg/pr83605.c: New test. --- gcc/gimple-ssa-strength-reduction.c.jj 2018-01-03 10:19:54.000000000 +0100 +++ gcc/gimple-ssa-strength-reduction.c 2018-01-04 10:39:48.273512779 +0100 @@ -55,6 +55,7 @@ along with GCC; see the file COPYING3. #include "params.h" #include "tree-ssa-address.h" #include "tree-affine.h" +#include "tree-eh.h" #include "builtins.h" /* Information about a strength reduction candidate. Each statement @@ -1747,6 +1748,9 @@ find_candidates_dom_walker::before_dom_c { gimple *gs = gsi_stmt (gsi); + if (stmt_could_throw_p (gs)) + continue; + if (gimple_vuse (gs) && gimple_assign_single_p (gs)) slsr_process_ref (gs); --- gcc/testsuite/gcc.dg/pr83605.c.jj 2018-01-04 10:35:20.874481057 +0100 +++ gcc/testsuite/gcc.dg/pr83605.c 2018-01-04 10:35:01.972479109 +0100 @@ -0,0 +1,20 @@ +/* PR tree-optimization/83605 */ +/* { dg-do compile } */ +/* { dg-options "-O1 -ftrapv -fexceptions -fnon-call-exceptions" } */ + +int a; + +int +foo (int x) +{ + int b = a; + { + int c; + int *d = (x == 0) ? &c : &b; + + for (a = 0; a < 2; ++a) + c = (x + b) < a; + + return *d; + } +} Jakub