diff options
author | Vladimir Makarov <vmakarov@redhat.com> | 2019-03-22 16:59:21 +0000 |
---|---|---|
committer | Vladimir Makarov <vmakarov@gcc.gnu.org> | 2019-03-22 16:59:21 +0000 |
commit | c07a0a226b6904995d785662bab74c2c68481539 (patch) | |
tree | 9c72c9d5b0fb9f3984cb29a660dade18eb65332b | |
parent | eca5f9254bbb06364a0fc91fdf7bde820bd8d225 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/lra-constraints.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr89676.c | 10 |
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 } } */ |