Patchwork PATCH: PR target/59379: [4.9 Regression] gomp_init_num_threads is compiled into an infinite loop with --with-arch=corei7 --with-cpu=slm

login
register
mail settings
Submitter Uros Bizjak
Date Jan. 19, 2014, 9:55 a.m.
Message ID <CAFULd4ar_8gcvBnfvp52n5H5zQMKvxty5KNnHebpAbuKXE9_aA@mail.gmail.com>
Download mbox | patch
Permalink /patch/312368/
State New
Headers show

Comments

Uros Bizjak - Jan. 19, 2014, 9:55 a.m.
On Sat, Jan 18, 2014 at 9:15 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
> For LEA operation with SImode_address_operand, which zero-extends SImode
> to DImode, ix86_split_lea_for_addr turns
>
> (set (reg:DI) ...)
>
> into
>
> (set (reg:SI) ...)
>
> We need to do
>
> (set (reg:DI) (zero_extend:DI (reg:SI)))
>
> at the end. If the LEA operation is
>
> (set (reg:DI) (zero_extend:DI (reg:SI)))

ree pass should remove these. However, we can just emit zero-extend
insn at the end of sequence, and ree (which is located after
post-reload split) should handle it:

--cut here--
--cut here--

The patch was tested with a testcase from Comment #9 of the PR using
"-O --march=corei7 -mtune=slm", and resulting binary runs without
problems.

Uros.

Patch

Index: config/i386/i386.md
===================================================================
--- config/i386/i386.md (revision 206753)
+++ config/i386/i386.md (working copy)
@@ -5428,12 +5428,17 @@ 
   operands[0] = SET_DEST (pat);
   operands[1] = SET_SRC (pat);

-  /* Emit all operations in SImode for zero-extended addresses.  Recall
-     that x86_64 inheretly zero-extends SImode operations to DImode.  */
+  /* Emit all operations in SImode for zero-extended addresses.  */
   if (SImode_address_operand (operands[1], VOIDmode))
     mode = SImode;

   ix86_split_lea_for_addr (curr_insn, operands, mode);
+
+  /* Zero-extend return register to DImode for zero-extended addresses.  */
+  if (mode != <MODE>mode)
+    emit_insn (gen_zero_extendsidi2
+              (operands[0], gen_lowpart ((mode), operands[0])));
+
   DONE;
 }
   [(set_attr "type" "lea")