Hello! 2013-04-29 Uros Bizjak <ubiz...@gmail.com>
PR target/57098 * config/i386/i386.c (ix86_expand_vec_perm): Validize constant memory. 2013-04-29 Uros Bizjak <ubiz...@gmail.com> PR target/57098 * gcc.target/i386/pr57098.c: New test. Tested on x86_64-pc-linux-gnu {,-m32} and committed to mainline SVN. The patch will be backported to 4.7 and 4.8 branches. Uros.
Index: config/i386/i386.c =================================================================== --- config/i386/i386.c (revision 198401) +++ config/i386/i386.c (working copy) @@ -20559,7 +20559,7 @@ ix86_expand_vec_perm (rtx operands[]) vec[i * 2 + 1] = const1_rtx; } vt = gen_rtx_CONST_VECTOR (maskmode, gen_rtvec_v (w, vec)); - vt = force_const_mem (maskmode, vt); + vt = validize_mem (force_const_mem (maskmode, vt)); t1 = expand_simple_binop (maskmode, PLUS, t1, vt, t1, 1, OPTAB_DIRECT); @@ -20756,7 +20756,7 @@ ix86_expand_vec_perm (rtx operands[]) for (i = 0; i < 16; ++i) vec[i] = GEN_INT (i/e * e); vt = gen_rtx_CONST_VECTOR (V16QImode, gen_rtvec_v (16, vec)); - vt = force_const_mem (V16QImode, vt); + vt = validize_mem (force_const_mem (V16QImode, vt)); if (TARGET_XOP) emit_insn (gen_xop_pperm (mask, mask, mask, vt)); else @@ -20767,7 +20767,7 @@ ix86_expand_vec_perm (rtx operands[]) for (i = 0; i < 16; ++i) vec[i] = GEN_INT (i % e); vt = gen_rtx_CONST_VECTOR (V16QImode, gen_rtvec_v (16, vec)); - vt = force_const_mem (V16QImode, vt); + vt = validize_mem (force_const_mem (V16QImode, vt)); emit_insn (gen_addv16qi3 (mask, mask, vt)); } Index: testsuite/gcc.target/i386/pr57098.c =================================================================== --- testsuite/gcc.target/i386/pr57098.c (revision 0) +++ testsuite/gcc.target/i386/pr57098.c (working copy) @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target lp64 } */ +/* { dg-options "-msse4 -mcmodel=large" } */ + +typedef int V __attribute__((vector_size(16))); + +void foo (V *p, V *mask) +{ + *p = __builtin_shuffle (*p, *mask); +}