diff options
author | Jakub Jelinek <jakub@redhat.com> | 2020-01-23 20:08:22 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2020-01-23 20:08:22 +0100 |
commit | 32667e04c7153d97d09d81c1af073d400f0c719a (patch) | |
tree | 4ced83b6cceb8099b652aaad1cc3763029314ccb /gcc | |
parent | c91072247eb066ec9c6cd0b0f949c7dae691e46c (diff) | |
download | gcc-32667e04c7153d97d09d81c1af073d400f0c719a.zip gcc-32667e04c7153d97d09d81c1af073d400f0c719a.tar.gz gcc-32667e04c7153d97d09d81c1af073d400f0c719a.tar.bz2 |
postreload: Fix up postreload combine [PR93402]
The following testcase is miscompiled, because the postreload pass changes:
-(insn 14 13 23 2 (parallel [
- (set (reg:DI 1 dx [94])
- (plus:DI (reg:DI 1 dx [95])
- (reg:DI 5 di [92])))
- (clobber (reg:CC 17 flags))
- ]) "pr93402.c":8:30 186 {*adddi_1}
- (expr_list:REG_EQUAL (plus:DI (reg:DI 5 di [92])
- (const_int 111111111111 [0x19debd01c7]))
- (nil)))
-(insn 23 14 25 2 (set (reg:SI 0 ax)
+(insn 23 13 25 2 (set (reg:SI 0 ax)
(const_int 0 [0])) "pr93402.c":10:1 67 {*movsi_internal}
(nil))
(insn 25 23 26 2 (use (reg:SI 0 ax)) "pr93402.c":10:1 -1
(nil))
-(insn 26 25 35 2 (use (reg:DI 1 dx)) "pr93402.c":10:1 -1
+(insn 26 25 35 2 (use (plus:DI (reg:DI 1 dx [95])
+ (reg:DI 5 di [92]))) "pr93402.c":10:1 -1
(nil))
A USE insn is not a normal insn and verify_changes called from
apply_change_group is happy about any changes into it.
The following patch avoids this optimization if we were to change
the USE operand (this routine only changes a reg into (plus reg reg2)).
2020-01-23 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/93402
* postreload.c (reload_combine_recognize_pattern): Don't try to adjust
USE insns.
* gcc.c-torture/execute/pr93402.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/postreload.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/pr93402.c | 21 |
4 files changed, 36 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 840668d..f2f77b7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2020-01-23 Jakub Jelinek <jakub@redhat.com> + + PR rtl-optimization/93402 + * postreload.c (reload_combine_recognize_pattern): Don't try to adjust + USE insns. + 2020-01-23 Dragan Mladjenovic <dmladjenovic@wavecomp.com> * config.in: Regenerated. diff --git a/gcc/postreload.c b/gcc/postreload.c index b068326..7cd5c7f 100644 --- a/gcc/postreload.c +++ b/gcc/postreload.c @@ -1078,6 +1078,10 @@ reload_combine_recognize_pattern (rtx_insn *insn) struct reg_use *use = reg_state[regno].reg_use + i; if (GET_MODE (*use->usep) != mode) return false; + /* Don't try to adjust (use (REGX)). */ + if (GET_CODE (PATTERN (use->insn)) == USE + && &XEXP (PATTERN (use->insn), 0) == use->usep) + return false; } /* Look for (set (REGX) (CONST_INT)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 93fb3be..05b239f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-01-23 Jakub Jelinek <jakub@redhat.com> + + PR rtl-optimization/93402 + * gcc.c-torture/execute/pr93402.c: New test. + 2020-01-23 Paolo Carlini <paolo.carlini@oracle.com> PR c++/92804 diff --git a/gcc/testsuite/gcc.c-torture/execute/pr93402.c b/gcc/testsuite/gcc.c-torture/execute/pr93402.c new file mode 100644 index 0000000..6487797 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr93402.c @@ -0,0 +1,21 @@ +/* PR rtl-optimization/93402 */ + +struct S { unsigned int a; unsigned long long b; }; + +__attribute__((noipa)) struct S +foo (unsigned long long x) +{ + struct S ret; + ret.a = 0; + ret.b = x * 11111111111ULL + 111111111111ULL; + return ret; +} + +int +main () +{ + struct S a = foo (1); + if (a.a != 0 || a.b != 122222222222ULL) + __builtin_abort (); + return 0; +} |