Hi! The rhs1 of CONVERT_EXPR_CODE_P doesn't have to be a SSA_NAME, can be e.g. invariant like ADDR_EXPR of a var, but ifcombine didn't think about that possibility.
Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk/4.9/4.8? 2014-07-03 Jakub Jelinek <ja...@redhat.com> PR tree-optimization/61684 * tree-ssa-ifcombine.c (recognize_single_bit_test): Make sure rhs1 of conversion is a SSA_NAME before using SSA_NAME_DEF_STMT on it. * gcc.c-torture/compile/pr61684.c: New test. --- gcc/tree-ssa-ifcombine.c.jj 2014-06-06 09:19:22.000000000 +0200 +++ gcc/tree-ssa-ifcombine.c 2014-07-03 11:46:25.868335148 +0200 @@ -233,7 +233,8 @@ recognize_single_bit_test (gimple cond, while (is_gimple_assign (stmt) && ((CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (stmt)) && (TYPE_PRECISION (TREE_TYPE (gimple_assign_lhs (stmt))) - <= TYPE_PRECISION (TREE_TYPE (gimple_assign_rhs1 (stmt))))) + <= TYPE_PRECISION (TREE_TYPE (gimple_assign_rhs1 (stmt)))) + && TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME) || gimple_assign_ssa_name_copy_p (stmt))) stmt = SSA_NAME_DEF_STMT (gimple_assign_rhs1 (stmt)); --- gcc/testsuite/gcc.c-torture/compile/pr61684.c.jj 2014-07-03 12:06:46.654858358 +0200 +++ gcc/testsuite/gcc.c-torture/compile/pr61684.c 2014-07-03 12:09:05.016123771 +0200 @@ -0,0 +1,15 @@ +/* PR tree-optimization/61684 */ + +int a, c; +static int *b = 0; +short d; +static short **e = 0; + +void +foo () +{ + for (; c < 1; c++) + ; + *e = &d; + a = d && (c && 1) & *b; +} Jakub