http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59303
--- Comment #5 from davidxl <xinliangli at gmail dot com> --- Fixing this requires more powerful predicate analysis with the help of value equivalent classes. >From the dump: "Use in stmt blah (v_1); is guarded by : if (_23 != 0)" _23 = pephitmp_22 | _8, so the use guard is prephitmp_22 != 0 || _8 != 0 prephitmp_22 = PHI <0(13), prephitmp_21(3), so the guard can be translated to prephitmp_21 != 0 || _8 != 0 prephitmp_21 = r_9(D) <= 19, so the predicate becomes r_9(D) <= 19 || _8 != 0 For the def: [CHECK] Found def edge 1 in v_1 = PHI <v_14(D)(13), r_9(D)(3)> Operand defs of phi v_1 = PHI <v_14(D)(13), r_9(D)(3)> is guarded by : if (_8 != 0) (.OR.) (.NOT.) if (_8 != 0) (.AND.) if (_13 != 0) the predicate is _8 != 0 || _13 != 0 where _13 = _10 | _12, 10_ = (r_9(D) <= 19), _12 = l_11(D) != 0 so the predicate is _8 != 0 || r_9(D) <= 19 || 1_11(D) != 0 which is the superset for the use. Perhaps we need to do around of predicate normalization before comparison. David