diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index dc65d88fea3d..17554bde8da5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -5,8 +5,7 @@
 
 2013-01-10  Richard Biener  <rguenther@suse.de>
 
-	* builtins.c (expand_builtin_init_trampoline): Use
-	set_mem_attributes.
+	* builtins.c (expand_builtin_init_trampoline): Use set_mem_attributes.
 
 2013-01-10  Richard Biener  <rguenther@suse.de>
 
@@ -51,7 +50,8 @@
 2013-01-09  Jan Hubicka  <jh@suse.cz>
 
 	PR lto/45375
-	* ipa-inline.c (ipa_inline): Remove extern inlines and virtual functions.
+	* ipa-inline.c (ipa_inline): Remove extern inlines and virtual
+	functions.
 	* cgraphclones.c (cgraph_clone_node): Cpoy also LTO file data.
 
 2013-01-09  Richard Sandiford  <rdsandiford@googlemail.com>
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 95a52cdd1a79..8fd1f915d90c 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -18013,19 +18013,22 @@
 
 (define_expand "xbegin"
   [(set (match_operand:SI 0 "register_operand")
-	(unspec_volatile:SI [(match_dup 1)] UNSPECV_XBEGIN))]
+	(unspec_volatile:SI [(const_int 0)] UNSPECV_XBEGIN))]
   "TARGET_RTM"
 {
   rtx label = gen_label_rtx ();
 
-  operands[1] = force_reg (SImode, constm1_rtx);
+  /* xbegin is emitted as jump_insn, so reload won't be able
+     to reload its operand.  Force the value into AX hard register.  */
+  rtx ax_reg = gen_rtx_REG (SImode, AX_REG);
+  emit_move_insn (ax_reg, constm1_rtx);
 
-  emit_jump_insn (gen_xbegin_1 (operands[1], label));
+  emit_jump_insn (gen_xbegin_1 (ax_reg, label));
 
   emit_label (label);
   LABEL_NUSES (label) = 1;
 
-  emit_move_insn (operands[0], operands[1]);
+  emit_move_insn (operands[0], ax_reg);
 
   DONE;
 })