https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94665
Segher Boessenkool <segher at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|RESOLVED |REOPENED Resolution|INVALID |--- --- Comment #9 from Segher Boessenkool <segher at gcc dot gnu.org> --- Okay, native aarch64 compiler built. Phew. vara, varb, varc are in regs r92, r93, r94. The code before combine is: 37: cc:CCFPE=cmp(r92:SF,r93:SF) 38: r93:SF={(cc:CCFPE<0)?r93:SF:r92:SF} REG_DEAD r92:SF REG_DEAD cc:CCFPE 39: cc:CCFPE=cmp(r94:SF,r93:SF) 40: r94:SF={(cc:CCFPE<0)?r94:SF:r93:SF} REG_DEAD r93:SF REG_DEAD cc:CCFPE and it leaves 37+38 as it was: Trying 37 -> 38: 37: cc:CCFPE=cmp(r92:SF,r93:SF) 38: r93:SF={(cc:CCFPE<0)?r93:SF:r92:SF} REG_DEAD r92:SF REG_DEAD cc:CCFPE Failed to match this instruction: (set (reg:SF 93 [ _2 ]) (if_then_else:SF (lt (reg:SF 92 [ _1 ]) (reg:SF 93 [ _2 ])) (reg:SF 93 [ _2 ]) (reg:SF 92 [ _1 ]))) but it combines 39+40: Trying 39 -> 40: 39: cc:CCFPE=cmp(r94:SF,r93:SF) 40: r94:SF={(cc:CCFPE<0)?r94:SF:r93:SF} REG_DEAD r93:SF REG_DEAD cc:CCFPE Successfully matched this instruction: (set (reg:SF 94 [ _4 ]) (smin:SF (reg:SF 94 [ _4 ]) (reg:SF 93 [ _2 ]))) allowing combination of insns 39 and 40 original costs 4 + 4 = 8 replacement cost 8 deferring deletion of insn with uid = 39. modifying insn i3 40: r94:SF=smin(r94:SF,r93:SF) REG_DEAD r93:SF deferring rescan insn with uid = 40. So huh, simplify_if_then_else seems to be buggy: /* Look for MIN or MAX. */ if ((! FLOAT_MODE_P (mode) || flag_unsafe_math_optimizations) && comparison_p && rtx_equal_p (XEXP (cond, 0), true_rtx) && rtx_equal_p (XEXP (cond, 1), false_rtx) && ! side_effects_p (cond)) that isn't correct afaics?