Hi all, Sphinx3 benchmark segmented when built and ran with -Ofast and -fprefecth-loop-arrays.
When I debugged the benchmark executable, found that it is caused due to register swapping happening at reload for the smaxdf3 pattern. 197r.ira --------- (insn 457 456 458 28 (set (reg:DF 687) (smax:DF (reg/v:DF 367 [ dval1 ]) (reg/v:DF 154 [ dval1 ]))) eval.c:58 914 {smaxdf3} (expr_list:REG_DEAD (reg/v:DF 367 [ dval1 ]) (expr_list:REG_DEAD (reg/v:DF 154 [ dval1 ]) (nil)))) 198.reload ----------- (insn 457 456 458 28 (set (reg:DF 21 xmm0 [687]) (smax:DF (reg/v:DF 21 xmm0 [orig:154 dval1 ] [154]) (reg/v:DF 51 xmm14 [orig:367 dval1 ] [367]))) eval.c:58 914 {smaxdf3} (nil)) In my case the register 367 is sNAN. MAXSD instruction is sensitive to sNAN and is not commutative. DEST[63-0] IF (DEST[63-0] == SNaN) THEN SRC[63-0]; ELSE IF SRC[63-0] == SNaN) THEN SRC[63-0]; ELSE IF (DEST[63-0] > SRC[63-0]) THEN DEST[63-0] ELSE SRC[63-0]; FI; So I think the commutative % should be removed from the pattern when -Ofast (fastmath) is set. Index: gcc/config/i386/i386.md =================================================================== --- gcc/config/i386/i386.md (revision 184372) +++ gcc/config/i386/i386.md (working copy) @@ -16507,7 +16507,7 @@ (define_insn "<code><mode>3" [(set (match_operand:MODEF 0 "register_operand" "=x,x") (smaxmin:MODEF - (match_operand:MODEF 1 "nonimmediate_operand" "%0,x") + (match_operand:MODEF 1 "nonimmediate_operand" "0,x") (match_operand:MODEF 2 "nonimmediate_operand" "xm,xm")))] "SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH" "@ This solved the sphinx segmentation. But the comments on i386.md says the commutative % mark is correct. Please provide your opinion. Regards, Venkat