aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPeter Bergner <bergner@linux.ibm.com>2018-11-19 19:35:51 +0000
committerPeter Bergner <bergner@gcc.gnu.org>2018-11-19 13:35:51 -0600
commit4b0f04fba5fab30f28b55107ccddfbe7e1243743 (patch)
treef178fa2f69190af963c3c7842cd415fc8bb1734b /gcc
parent1fd319753c90f05e026e16c2c83af8f1c6687a5f (diff)
downloadgcc-4b0f04fba5fab30f28b55107ccddfbe7e1243743.zip
gcc-4b0f04fba5fab30f28b55107ccddfbe7e1243743.tar.gz
gcc-4b0f04fba5fab30f28b55107ccddfbe7e1243743.tar.bz2
re PR rtl-optimization/88033 (ICE on valid code at -O2 and -O3 on x86-64-linux-gnu: in remove_some_program_points_and_update_live_ranges, at lra-lives.c:1179)
gcc/ PR rtl-optimization/88033 * ira-lives.c (non_conflicting_reg_copy_p): Skip copies from a register to itself. Use HARD_REGISTER_NUM_P. gcc/testsuite/ PR rtl-optimization/88033 * gcc.target/i386/pr88033.c: New test. From-SVN: r266282
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/ira-lives.c10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr88033.c14
4 files changed, 33 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9996849..8bea262 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2018-11-19 Peter Bergner <bergner@linux.ibm.com>
+
+ PR rtl-optimization/88033
+ * ira-lives.c (non_conflicting_reg_copy_p): Skip copies from a register
+ to itself. Use HARD_REGISTER_NUM_P.
+
2018-11-19 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* tree-vect-loop.c (vect_transform_loop): Disable further unrolling
diff --git a/gcc/ira-lives.c b/gcc/ira-lives.c
index c5e85b9..f74958f 100644
--- a/gcc/ira-lives.c
+++ b/gcc/ira-lives.c
@@ -1083,11 +1083,17 @@ non_conflicting_reg_copy_p (rtx_insn *insn)
int src_regno = REGNO (SET_SRC (set));
machine_mode mode = GET_MODE (SET_DEST (set));
+ /* By definition, a register does not conflict with itself, therefore we
+ do not have to handle it specially. Returning NULL_RTX now, helps
+ simplify the callers of this function. */
+ if (dst_regno == src_regno)
+ return NULL_RTX;
+
/* Computing conflicts for register pairs is difficult to get right, so
for now, disallow it. */
- if ((dst_regno < FIRST_PSEUDO_REGISTER
+ if ((HARD_REGISTER_NUM_P (dst_regno)
&& hard_regno_nregs (dst_regno, mode) != 1)
- || (src_regno < FIRST_PSEUDO_REGISTER
+ || (HARD_REGISTER_NUM_P (src_regno)
&& hard_regno_nregs (src_regno, mode) != 1))
return NULL_RTX;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ba1c5d6..6a659e7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-11-19 Peter Bergner <bergner@linux.ibm.com>
+
+ PR rtl-optimization/88033
+ * gcc.target/i386/pr88033.c: New test.
+
2018-11-19 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* gcc.target/aarch64/sve/unroll-1.c: New test.
diff --git a/gcc/testsuite/gcc.target/i386/pr88033.c b/gcc/testsuite/gcc.target/i386/pr88033.c
new file mode 100644
index 0000000..d75692c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr88033.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+int
+main (long a, long *b, long c)
+{
+ if (!c)
+ return 0;
+ int g;
+ *b = (g & ~3000000000) < 0 ? a : a - g;
+ while (1)
+ ;
+ return 0;
+}