public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug rtl-optimization/99221] New: copyprop_hardreg_forward_1 deletes insn by mistake
@ 2021-02-23 17:08 stefansf at linux dot ibm.com
2021-02-23 17:08 ` [Bug rtl-optimization/99221] " stefansf at linux dot ibm.com
0 siblings, 1 reply; 2+ messages in thread
From: stefansf at linux dot ibm.com @ 2021-02-23 17:08 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99221
Bug ID: 99221
Summary: copyprop_hardreg_forward_1 deletes insn by mistake
Product: gcc
Version: 11.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: rtl-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: stefansf at linux dot ibm.com
Target Milestone: ---
Created attachment 50242
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=50242&action=edit
a-foo.i.301r.jump2
Consider the following reduced example:
int g = 9, h, i, b;
char j, k;
long m;
char *a = &j;
char n() { return 0; }
void o(short o) {}
short p(short o, short q) { return q; }
long r(long s) { return s; }
long t(long s) { return 0; }
long u(long s) { return 0; }
short v() { return 0; }
void x(int **s, unsigned q) {
short c = 0, d = 0;
int e = 4;
if (g) {
int f = 4;
q = 1;
for (; q <= 4; q++) {
m = q;
d = i = u(d);
if (0 == r(1)) {
if (u(0)) {
h = t(q) != **s;
for (; e; e = f &= 0 <= 0)
;
}
} else {
b = c;
c = v();
o(q);
k = n();
j = p(k || q, q);
}
}
}
}
int main() {
x(0, 0);
printf("%d\n", j);
return 0;
}
Command line: gcc -march=arch11 -w -Og foo.i && ./a.out
Expected output: 4
Actual output: 0
On IBM Z we have prior pass cprop_hardreg the following insns of interest:
(insn 24 23 25 4 (set (reg:DI 24 %f8 [orig:61 _2 ] [61])
(reg/v:DI 12 %r12 [orig:85 q+-4 ] [85])) "./foo.i":19:10 1462
{*movdi_64}
(nil))
...
(insn 80 79 81 10 (set (reg:HI 24 %f8 [orig:74 _15 ] [74])
(reg:HI 12 %r12 [orig:85 q+2 ] [85])) "./foo.i":30:10 1474 {*movhi}
(nil))
...
(insn 155 96 97 15 (set (reg:HI 1 %r1 [orig:74 _15 ] [74])
(reg:HI 24 %f8 [orig:74 _15 ] [74])) "./foo.i":32:14 1474 {*movhi}
(nil))
Register f8 is set to a 64-bit value in insn 24 and to a 16-bit value in insn
80, respectively, while using the same source register r12. During
copyprop_hardreg_forward_1 it is then wrongly detected that insn 80 is a noop
set and is subsequently removed. Due to different alignments of different modes
in FPRs we have that in insn 155 the wrong part of register f8 is then accessed
which results in constant value zero.
In order to decide whether an insn is a noop set or not I gave it a try by
additionally testing whether the prior set and the current are done in
compatible modes by asking the backend:
diff --git a/gcc/regcprop.c b/gcc/regcprop.c
index e1342f56bd1..02753a12510 100644
--- a/gcc/regcprop.c
+++ b/gcc/regcprop.c
@@ -474,7 +474,8 @@ find_oldest_value_reg (enum reg_class cl, rtx reg, struct
value_data *vd)
(set (...) (reg:DI r9))
Replacing r9 with r11 is invalid. */
if (mode != vd->e[regno].mode
- && REG_NREGS (reg) > hard_regno_nregs (regno, vd->e[regno].mode))
+ && (REG_NREGS (reg) > hard_regno_nregs (regno, vd->e[regno].mode)
+ || !REG_CAN_CHANGE_MODE_P (regno, mode, vd->e[regno].mode)))
return NULL_RTX;
for (i = vd->e[regno].oldest_regno; i != regno; i = vd->e[i].next_regno)
Any thoughts about this fix?
^ permalink raw reply [flat|nested] 2+ messages in thread
* [Bug rtl-optimization/99221] copyprop_hardreg_forward_1 deletes insn by mistake
2021-02-23 17:08 [Bug rtl-optimization/99221] New: copyprop_hardreg_forward_1 deletes insn by mistake stefansf at linux dot ibm.com
@ 2021-02-23 17:08 ` stefansf at linux dot ibm.com
0 siblings, 0 replies; 2+ messages in thread
From: stefansf at linux dot ibm.com @ 2021-02-23 17:08 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99221
--- Comment #1 from Stefan Schulze Frielinghaus <stefansf at linux dot ibm.com> ---
Created attachment 50243
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=50243&action=edit
a-foo.i.307r.cprop_hardreg
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2021-02-23 17:08 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-02-23 17:08 [Bug rtl-optimization/99221] New: copyprop_hardreg_forward_1 deletes insn by mistake stefansf at linux dot ibm.com
2021-02-23 17:08 ` [Bug rtl-optimization/99221] " stefansf at linux dot ibm.com
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).