------- Comment #5 from ubizjak at gmail dot com 2009-02-06 15:05 ------- This patch fixes wrong scheduling:
Index: i386.md =================================================================== --- i386.md (revision 143890) +++ i386.md (working copy) @@ -67,6 +67,7 @@ (UNSPEC_DEF_CFA 15) (UNSPEC_SET_RIP 16) (UNSPEC_SET_GOT_OFFSET 17) + (UNSPEC_REDZONE_BLOCKAGE 18) ; TLS support (UNSPEC_TP 18) @@ -14885,6 +14886,14 @@ "" [(set_attr "length" "0")]) +(define_insn "redzone_blockage" + [(set (match_operand 0 "" "") + (unspec [(match_operand 1 "" "")] UNSPEC_REDZONE_BLOCKAGE))] + "" + "" + [(set_attr "length" "0")]) + + ;; Insn emitted into the body of a function to return from a function. ;; This is only done if the function's epilogue is known to be simple. ;; See comments for ix86_can_use_return_insn_p in i386.c. Index: i386.c =================================================================== --- i386.c (revision 143890) +++ i386.c (working copy) @@ -6492,6 +6492,10 @@ emit_insn (gen_blockage ()); } + if (frame_pointer_needed && frame.red_zone_size) + emit_insn (gen_redzone_blockage (hard_frame_pointer_rtx, + stack_pointer_rtx)); + /* Emit cld instruction if stringops are used in the function. */ if (TARGET_CLD && ix86_current_function_needs_cld) emit_insn (gen_cld ()); -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39118