aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2025-08-12 05:19:24 -0700
committerH.J. Lu <hjl.tools@gmail.com>2025-08-12 18:01:47 -0700
commit9e30860f8c77309c9f74742fe8866d2ca0d0fe7a (patch)
tree8e3c56a7d0d67b594fbfbbc76b574e66e561d761
parent28c0d45201a0a4a0f7dd285b1992039cd6af015f (diff)
downloadgcc-9e30860f8c77309c9f74742fe8866d2ca0d0fe7a.zip
gcc-9e30860f8c77309c9f74742fe8866d2ca0d0fe7a.tar.gz
gcc-9e30860f8c77309c9f74742fe8866d2ca0d0fe7a.tar.bz2
x86: Convert integer constant to mode of move
For (set (reg/v:DI 106 [ k ]) (const_int 3000000000 [0xb2d05e00])) ... (set (reg:V4SI 115 [ _13 ]) (vec_duplicate:V4SI (subreg:SI (reg/v:DI 106 [ k ]) 0))) ... (set (reg:V2SI 118 [ _9 ]) (vec_duplicate:V2SI (subreg:SI (reg/v:DI 106 [ k ]) 0))) we should generate (set (reg:SI 125) (const_int -1294967296 [0xffffffffb2d05e00])) (set (reg:V4SI 124) (vec_duplicate:V4SI (reg:VSI 125)) ... (set (reg:V4SI 115 [ _13 ]) (reg:V4SI 124) ... (set (reg:V2SI 118 [ _9 ]) (subreg:V2SI (reg:V4SI 124)) by converting integer constant to mode of move. gcc/ PR target/121497 * config/i386/i386-features.cc (ix86_broadcast_inner): Convert integer constant to mode of move gcc/testsuite/ PR target/121497 * gcc.target/i386/pr121497.c: New test. Co-authored-by: Liu, Hongtao <hongtao.liu@intel.com> Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
-rw-r--r--gcc/config/i386/i386-features.cc2
-rw-r--r--gcc/testsuite/gcc.target/i386/pr121497.c18
2 files changed, 20 insertions, 0 deletions
diff --git a/gcc/config/i386/i386-features.cc b/gcc/config/i386/i386-features.cc
index 9941e61..b4aa5fa 100644
--- a/gcc/config/i386/i386-features.cc
+++ b/gcc/config/i386/i386-features.cc
@@ -3639,6 +3639,8 @@ ix86_broadcast_inner (rtx op, machine_mode mode,
Set *INSN_P to nullptr and return SET_SRC if SET_SRC is an
integer constant. */
op = src;
+ if (mode != GET_MODE (reg))
+ op = gen_int_mode (INTVAL (src), mode);
*insn_p = nullptr;
}
else
diff --git a/gcc/testsuite/gcc.target/i386/pr121497.c b/gcc/testsuite/gcc.target/i386/pr121497.c
new file mode 100644
index 0000000..ce55f95
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr121497.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -msse2 -w" } */
+
+extern void a(int *);
+int q;
+void b(int c, int d, int e, int f, int g, int h) {
+ int t[] = {c, d, e, f, g, h};
+ a(t);
+}
+int main() {
+ int k[2], i = 0, *p();
+ if (q) {
+ for (; (int)p + i < 2; i++)
+ k[i] = -1294967296;
+ b(k[0] + 7, k[0] + 9, k[0] + 6, k[0] + 9, k[0] + 9, k[0] + 6);
+ }
+ return 0;
+}