aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRoger Sayle <roger@nextmovesoftware.com>2024-06-11 09:31:34 +0100
committerRoger Sayle <roger@nextmovesoftware.com>2024-06-11 09:31:34 +0100
commita797398cfbc75899fdb7d97436c0c89c02b133c0 (patch)
tree622c0a74ffa7c5d70b367bbf11b20aa29f72ef11 /gcc
parent8087204a4260a552c7cee37d1fb46cec7edfe9ee (diff)
downloadgcc-a797398cfbc75899fdb7d97436c0c89c02b133c0.zip
gcc-a797398cfbc75899fdb7d97436c0c89c02b133c0.tar.gz
gcc-a797398cfbc75899fdb7d97436c0c89c02b133c0.tar.bz2
i386: PR target/115397: AVX512 ternlog vs. -m32 -fPIC constant pool.
This patch fixes PR target/115397, a recent regression caused by my ternlog patch that results in an ICE (building numpy) with -m32 -fPIC. The problem is that ix86_broadcast_from_constant, which calls get_pool_constant, doesn't handle the UNSPEC_GOTOFF that's created by calling validize_mem when using -fPIC on i686. The logic here is a bit convoluted (and my future patches will clean some of this up), but the simplest fix is to call ix86_broadcast_from_constant between the calls to force_const_mem and the call to validize_mem. Perhaps a better solution might be to call targetm.delegitimize_address from the middle-end's get_pool_constant, but ultimately the best approach would be to not place things in the constant pool if we don't need to. My plans to move (broadcast) constant handling from expand to split1 should simplify this. 2024-06-11 Roger Sayle <roger@nextmovesoftware.com> gcc/ChangeLog PR target/115397 * config/i386/i386-expand.cc (ix86_expand_ternlog): Move call to ix86_broadcast_from_constant before call to validize_mem, but after call to force_const_mem. gcc/testsuite/ChangeLog PR target/115397 * gcc.target/i386/pr115397.c: New test case.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/i386/i386-expand.cc3
-rw-r--r--gcc/testsuite/gcc.target/i386/pr115397.c17
2 files changed, 19 insertions, 1 deletions
diff --git a/gcc/config/i386/i386-expand.cc b/gcc/config/i386/i386-expand.cc
index 9b60264..312329e 100644
--- a/gcc/config/i386/i386-expand.cc
+++ b/gcc/config/i386/i386-expand.cc
@@ -26041,8 +26041,9 @@ ix86_expand_ternlog (machine_mode mode, rtx op0, rtx op1, rtx op2, int idx,
tmp2 = ix86_gen_bcst_mem (mode, op2);
if (!tmp2)
{
- tmp2 = validize_mem (force_const_mem (mode, op2));
+ tmp2 = force_const_mem (mode, op2);
rtx bcast = ix86_broadcast_from_constant (mode, tmp2);
+ tmp2 = validize_mem (tmp2);
if (bcast)
{
rtx reg2 = gen_reg_rtx (mode);
diff --git a/gcc/testsuite/gcc.target/i386/pr115397.c b/gcc/testsuite/gcc.target/i386/pr115397.c
new file mode 100644
index 0000000..2783578
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr115397.c
@@ -0,0 +1,17 @@
+/* { dg-do compile { target ia32 } } */
+/* { dg-options "-fPIC -mavx512f -O3" } */
+
+int LONG_divide_AVX512F_dimensions_0;
+void npy_set_floatstatus_overflow();
+void LONG_divide_AVX512F() {
+ long *src;
+ int raise_err = 0;
+ for (; LONG_divide_AVX512F_dimensions_0;
+ --LONG_divide_AVX512F_dimensions_0, ++src) {
+ long a = *src;
+ if (a)
+ raise_err = 1;
+ }
+ if (raise_err)
+ npy_set_floatstatus_overflow();
+}