aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2019-04-07 21:19:08 +0200
committerUros Bizjak <uros@gcc.gnu.org>2019-04-07 21:19:08 +0200
commit45acde2fe01cea0e2e11dda9d336133c5b526f6d (patch)
treee771bf5e6053a0f5b14386c4506d2185c3b74f13 /gcc
parent6d31ef2ab12c76dfd72c44c1833fcaf1720b724b (diff)
downloadgcc-45acde2fe01cea0e2e11dda9d336133c5b526f6d.zip
gcc-45acde2fe01cea0e2e11dda9d336133c5b526f6d.tar.gz
gcc-45acde2fe01cea0e2e11dda9d336133c5b526f6d.tar.bz2
re PR target/89945 (ICE in gen_lowpart_general, at rtlhooks.c:63)
PR target/89945 * config/i386/i386.md (anddi_1 to andsi_1_zext splitter): Avoid calling gen_lowpart with SYMBOL_REF and LABEL_REF operand. testsuite/ChangeLog: PR target/89945 * gcc.target/i386/pr89945.c: New test. From-SVN: r270190
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/i386/i386.md11
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr89945.c21
4 files changed, 42 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f407578..778c70a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2019-04-07 Uroš Bizjak <ubizjak@gmail.com>
+
+ PR target/89945
+ * config/i386/i386.md (anddi_1 to andsi_1_zext splitter):
+ Avoid calling gen_lowpart with SYMBOL_REF and LABEL_REF operand.
+
2019-04-05 Joern Rennecke <joern.rennecke@embecosm.com>
* sched-deps.c (sched_macro_fuse_insns): Check return value of
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 46277f1..0fe778f 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -8609,7 +8609,16 @@
[(parallel [(set (match_dup 0)
(zero_extend:DI (and:SI (match_dup 1) (match_dup 2))))
(clobber (reg:CC FLAGS_REG))])]
- "operands[2] = gen_lowpart (SImode, operands[2]);")
+{
+ if (GET_CODE (operands[2]) == SYMBOL_REF
+ || GET_CODE (operands[2]) == LABEL_REF)
+ {
+ operands[2] = shallow_copy_rtx (operands[2]);
+ PUT_MODE (operands[2], SImode);
+ }
+ else
+ operands[2] = gen_lowpart (SImode, operands[2]);
+})
;; See comment for addsi_1_zext why we do use nonimmediate_operand
(define_insn "*andsi_1_zext"
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 4208625..50ac61c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-04-07 Uroš Bizjak <ubizjak@gmail.com>
+
+ PR target/89945
+ * gcc.target/i386/pr89945.c: New test.
+
2019-04-06 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/87352
diff --git a/gcc/testsuite/gcc.target/i386/pr89945.c b/gcc/testsuite/gcc.target/i386/pr89945.c
new file mode 100644
index 0000000..39e864a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr89945.c
@@ -0,0 +1,21 @@
+/* PR target/89945 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+void
+foo ()
+{
+ void *g[] = {&&a, &&b};
+
+ for (unsigned c = 0x1F;; c >>= 1)
+ {
+ unsigned d = (long)"a";
+ long e = 8;
+
+ while (e)
+ {
+ a: goto *g[c&d];
+ b: e--;
+ }
+ }
+}