aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2019-03-22 16:59:21 +0000
committerVladimir Makarov <vmakarov@gcc.gnu.org>2019-03-22 16:59:21 +0000
commitc07a0a226b6904995d785662bab74c2c68481539 (patch)
tree9c72c9d5b0fb9f3984cb29a660dade18eb65332b
parenteca5f9254bbb06364a0fc91fdf7bde820bd8d225 (diff)
downloadgcc-c07a0a226b6904995d785662bab74c2c68481539.zip
gcc-c07a0a226b6904995d785662bab74c2c68481539.tar.gz
gcc-c07a0a226b6904995d785662bab74c2c68481539.tar.bz2
re PR rtl-optimization/89676 (Redundant moves for long long shift on 32bit x86)
2019-03-22 Vladimir Makarov <vmakarov@redhat.com> PR rtl-optimization/89676 * lra-constraints.c (curr_insn_transform): Do match reload for early clobbers even if the match was successful. 2019-03-22 Vladimir Makarov <vmakarov@redhat.com> PR rtl-optimization/89676 * gcc.target/i386/pr89676.c: New. From-SVN: r269878
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/lra-constraints.c14
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr89676.c10
4 files changed, 35 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index aa5530e..c10c4c7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2019-03-22 Vladimir Makarov <vmakarov@redhat.com>
+
+ PR rtl-optimization/89676
+ * lra-constraints.c (curr_insn_transform): Do match reload for
+ early clobbers even if the match was successful.
+
2019-03-22 Jakub Jelinek <jakub@redhat.com>
PR c++/87481
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index cba87eb..78932cc 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -4256,6 +4256,20 @@ curr_insn_transform (bool check_only_p)
|| MEM_P (SET_DEST (curr_insn_set))
|| GET_CODE (SET_DEST (curr_insn_set)) == SUBREG))))
optional_p = true;
+ else if (goal_alt_matched[i][0] != -1
+ && curr_static_id->operand[i].type == OP_OUT
+ && (curr_static_id->operand_alternative
+ [goal_alt_number * n_operands + i].earlyclobber))
+ {
+ /* Generate reloads for output and matched inputs. This
+ is the easiest way to avoid creation of non-existing
+ conflicts in lra-lives.c. */
+ match_reload (i, goal_alt_matched[i], outputs, goal_alt[i], &before,
+ &after, TRUE);
+ outputs[n_outputs++] = i;
+ outputs[n_outputs] = -1;
+ continue;
+ }
else
continue;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8324702..5626696 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-03-22 Vladimir Makarov <vmakarov@redhat.com>
+
+ PR rtl-optimization/89676
+ * gcc.target/i386/pr89676.c: New.
+
2019-03-22 Jakub Jelinek <jakub@redhat.com>
PR c++/60702
diff --git a/gcc/testsuite/gcc.target/i386/pr89676.c b/gcc/testsuite/gcc.target/i386/pr89676.c
new file mode 100644
index 0000000..90865d8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr89676.c
@@ -0,0 +1,10 @@
+/* PR rtl-optimization/89676 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -m32 -march=i686" } */
+unsigned long long
+foo (unsigned long long i)
+{
+ return i << 3;
+}
+
+/* { dg-final { scan-assembler-times "movl" 2 } } */