Convert vector load:
(insn 14 465 412 3 (set (reg:SI 507 [ j_lsm.26 ])
(const_int 2 [0x2])) "foo.c":10:12 discrim 2 100 {*movsi_internal}
(nil))
...
(insn 518 507 434 16 (set (reg:V2SI 493)
(reg:V2SI 517)) 2066 {*movv2si_internal}
(nil))
to constant integer load:
(insn 566 55 56 6 (set (subreg:DI (reg:V2SI 517) 0)
(const_int
8589934594 [0x200000002])) -1
(nil))
...
(insn 518 507 434 16 (set (reg:V2SI 493)
(reg:V2SI 517)) 2066 {*movv2si_internal}
(nil))
Tested on Linux/x86-64.
gcc/
PR target/125238
* config/i386/i386-features.cc (ix86_broadcast_inner): Set kind
to X86_CSE_CONST_VECTOR if the vector load can be converted to
constant integer load.
gcc/testsuite/
PR target/125238
* gcc.target/i386/pr125238.c: New test.
Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
*insn_p = nullptr;
return constm1_rtx;
}
+
+ /* Check if we can convert:
+
+ (insn 14 465 412 3 (set (reg:SI 507 [ j_lsm.26 ])
+ (const_int 2 [0x2])) "foo.c":10:12 discrim 2 100 {*movsi_internal} (nil))
+ ...
+ (insn 518 507 434 16 (set (reg:V2SI 493)
+ (vec_duplicate:V2SI (reg:SI 507 [ j_lsm.26 ]))) 2395 {*vec_dupv2si} (nil))
+
+ to constant integer load:
+
+ (insn 566 55 56 6 (set (subreg:DI (reg:V2SI 517) 0)
+ (const_int 8589934594 [0x200000002])) -1 (nil))
+ ...
+ (insn 518 507 434 16 (set (reg:V2SI 493)
+ (reg:V2SI 517)) 2066 {*movv2si_internal} (nil))
+
+ */
+ if (GET_MODE_SIZE (orig_mode) <= UNITS_PER_WORD)
+ *kind_p = X86_CSE_CONST_VECTOR;
+
*insn_p = nullptr;
}
else
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O3 -march=x86-64" } */
+
+extern void bar (const char *, int);
+extern char a, b, d, e, k;
+extern int c, f, g, h, i, j;
+void
+foo (void)
+{
+ while (a) {
+ int *n = &h, *o = &g;
+ bar ("%d", f);
+ for (; c; c++) {
+ int *p = &j;
+ for (b = 0; b < 8; b++) {
+ e = a > 0 ? a : a << 1;
+ k = -e;
+ *n &= (k != *p);
+ }
+ for (; d; d++)
+ i || (*o = *p = 2);
+ }
+ }
+}
+
+/* { dg-final { scan-assembler "movabsq\[ \\t\]+\\\$8589934594, %r\[a-z0-9\]+" { target { ! ia32 } } } } */