https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103028
--- Comment #2 from Andreas Krebbel <krebbel at gcc dot gnu.org> --- IF-convert generates the compare *after* reload. The operands get checked for validity only by invoking the predicates. That means everything which is accepted by TARGET_LEGITIMATE_CONSTANT_P is ok for a general_operand. However, we have several patterns where the union of all constraints would accept less operands than the predicate assuming that reload is able to sort this out. The ICE is triggered by emitting a pattern which actually would need to be fixed by reload. The problem could easily be avoided by e.g. enforcing operand1 to satisfy the constraint used in the pattern. However, I'm wondering how this is supposed to work in general. Couldn't this trigger all sorts of problems? Are we the only backend relying on LRA sorting out these kind of issues for us? Btw. I couldn't trigger the problem without -fharden-conditional-branches so far.