public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug rtl-optimization/105091] New: RTL dse1 remove stack mem storing incorrectly
@ 2022-03-29 2:27 guojiufu at gcc dot gnu.org
2022-03-29 2:41 ` [Bug rtl-optimization/105091] " guojiufu at gcc dot gnu.org
` (16 more replies)
0 siblings, 17 replies; 18+ messages in thread
From: guojiufu at gcc dot gnu.org @ 2022-03-29 2:27 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105091
Bug ID: 105091
Summary: RTL dse1 remove stack mem storing incorrectly
Product: gcc
Version: 12.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: rtl-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: guojiufu at gcc dot gnu.org
Target Milestone: ---
Code is narrowed from math/big which passes at the early of r12(r12-656).
With -fdisable-rtl-dse1, the case also passes.
----_testmain.go
package main
import "fmt"
import "testing"
import "testing/internal/testdeps"
import __os__ "os"
type Bits []int
func TestMulBits(t *testing.T) {
for _, test := range []struct {
x, y, want Bits
}{
{Bits{}, Bits{}, nil},
{Bits{0}, Bits{0}, Bits{0}},
} {
p := test.x
fmt.Printf("%v", p)
}
}
var tests = []testing.InternalTest {
{"TestMulBits", TestMulBits},
}
var benchmarks = []testing.InternalBenchmark{
}
var fuzzTargets = []testing.InternalFuzzTarget{
}
var examples = []testing.InternalExample{
}
func main() {
m := testing.MainStart(testdeps.TestDeps{}, tests, benchmarks,
fuzzTargets, examples)
__os__.Exit(m.Run())
}
-----
> gccgo -O2 _testmain.go && ./a.out -test.v
=== RUN TestMulBits
[35185086168544 32199672319005300 268454424 268599296 35185086167968 15 32
35185086167968 15 35184405205936 824635867296 15 35184393891632 0
35185086168112]--- FAIL: TestMulBits (0.00s)
panic: runtime error: invalid memory address or nil pointer dereference
[recovered]
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x200000d08280]
goroutine 17 [running]:
testing.tRunner..func3
/home/guojiufu/gcc/gcc-mainline-base/libgo/go/testing/testing.go:1425
testing.tRunner..func1
/home/guojiufu/gcc/gcc-mainline-base/libgo/go/testing/testing.go:1342
panic
/home/guojiufu/gcc/gcc-mainline-base/libgo/go/runtime/panic.go:714
reflect.typedmemmove
/home/guojiufu/gcc/gcc-mainline-base/libgo/go/runtime/mbarrier.go:197
reflect.packEface
/home/guojiufu/gcc/gcc-mainline-base/libgo/go/reflect/value.go:123
reflect.valueInterface
/home/guojiufu/gcc/gcc-mainline-base/libgo/go/reflect/value.go:930
reflect.Value.Interface
/home/guojiufu/gcc/gcc-mainline-base/libgo/go/reflect/value.go:890
fmt.pp.printValue
/home/guojiufu/gcc/gcc-mainline-base/libgo/go/fmt/print.go:722
....
> gccgo -O2 _testmain.go -fdisable-rtl-dse1 && ./a.out -test.v
go1: note: disable pass rtl-dse1 for functions in the range of [0, 4294967295]
=== RUN TestMulBits
[][0]--- PASS: TestMulBits (0.00s)
PASS
> gccgo -v
Using built-in specs.
COLLECT_GCC=/home/guojiufu/gcc/install/gcc-mainline-base-debug/bin/gccgo
COLLECT_LTO_WRAPPER=/home/guojiufu/gcc/install/gcc-mainline-base-debug/libexec/gcc/powerpc64le-unknown-linux-gnu/12.0.1/lto-wrapper
Target: powerpc64le-unknown-linux-gnu
Configured with: /home/guojiufu/gcc/gcc-mainline-base/configure
--enable-languages=c,c++,go --with-cpu=native --enable-checking
--with-long-double-128
--prefix=/home/guojiufu/gcc/install/gcc-mainline-base-debug --disable-bootstrap
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 12.0.1 20220318 (experimental) (GCC)
I encounter this on ppc64le and did not reproduce it x86_64.
^ permalink raw reply [flat|nested] 18+ messages in thread
* [Bug rtl-optimization/105091] RTL dse1 remove stack mem storing incorrectly
2022-03-29 2:27 [Bug rtl-optimization/105091] New: RTL dse1 remove stack mem storing incorrectly guojiufu at gcc dot gnu.org
@ 2022-03-29 2:41 ` guojiufu at gcc dot gnu.org
2022-03-29 2:56 ` guojiufu at gcc dot gnu.org
` (15 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: guojiufu at gcc dot gnu.org @ 2022-03-29 2:41 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105091
--- Comment #1 from Jiu Fu Guo <guojiufu at gcc dot gnu.org> ---
Checking the dumps from dse1, some "stack memory store" are deleted
incorrectly.
12: %3:DI=call [`runtime.newobject'] argc:0
REG_CALL_DECL `runtime.newobject'
13: r117:DI=%3:DI
REG_DEAD %3:DI
14: [sfp:DI+0x20]=r117:DI
REG_DEAD r117:DI
dse1 removes instruction 14.
^ permalink raw reply [flat|nested] 18+ messages in thread
* [Bug rtl-optimization/105091] RTL dse1 remove stack mem storing incorrectly
2022-03-29 2:27 [Bug rtl-optimization/105091] New: RTL dse1 remove stack mem storing incorrectly guojiufu at gcc dot gnu.org
2022-03-29 2:41 ` [Bug rtl-optimization/105091] " guojiufu at gcc dot gnu.org
@ 2022-03-29 2:56 ` guojiufu at gcc dot gnu.org
2022-03-29 7:45 ` rguenth at gcc dot gnu.org
` (14 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: guojiufu at gcc dot gnu.org @ 2022-03-29 2:56 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105091
--- Comment #2 from Jiu Fu Guo <guojiufu at gcc dot gnu.org> ---
starting to process insn 14
v: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131,
132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147,
148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
164, 165, 166, 167, 168, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203,
204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216
i = 32, index = 1
i = 33, index = 2
i = 34, index = 3
i = 35, index = 4
i = 36, index = 5
i = 37, index = 6
i = 38, index = 7
i = 39, index = 8
deferring deletion of insn with uid = 14.
^ permalink raw reply [flat|nested] 18+ messages in thread
* [Bug rtl-optimization/105091] RTL dse1 remove stack mem storing incorrectly
2022-03-29 2:27 [Bug rtl-optimization/105091] New: RTL dse1 remove stack mem storing incorrectly guojiufu at gcc dot gnu.org
2022-03-29 2:41 ` [Bug rtl-optimization/105091] " guojiufu at gcc dot gnu.org
2022-03-29 2:56 ` guojiufu at gcc dot gnu.org
@ 2022-03-29 7:45 ` rguenth at gcc dot gnu.org
2022-03-29 11:17 ` guojiufu at gcc dot gnu.org
` (13 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: rguenth at gcc dot gnu.org @ 2022-03-29 7:45 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105091
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |wrong-code
Target| |powerpc64le-unknown-linux-g
| |nu
CC| |iant at google dot com,
| |segher at gcc dot gnu.org
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
Can you attach the full RTL dump before dse1 and the dse1 dump (don't use -slim
please).
Maybe it's possible to reduce a go testcase to something that can be consumed
by go1 of a cross compiler w/o building target libgo (a "cc1-cross").
^ permalink raw reply [flat|nested] 18+ messages in thread
* [Bug rtl-optimization/105091] RTL dse1 remove stack mem storing incorrectly
2022-03-29 2:27 [Bug rtl-optimization/105091] New: RTL dse1 remove stack mem storing incorrectly guojiufu at gcc dot gnu.org
` (2 preceding siblings ...)
2022-03-29 7:45 ` rguenth at gcc dot gnu.org
@ 2022-03-29 11:17 ` guojiufu at gcc dot gnu.org
2022-03-29 11:18 ` guojiufu at gcc dot gnu.org
` (12 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: guojiufu at gcc dot gnu.org @ 2022-03-29 11:17 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105091
--- Comment #4 from Jiu Fu Guo <guojiufu at gcc dot gnu.org> ---
Created attachment 52708
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=52708&action=edit
279r.cse2
^ permalink raw reply [flat|nested] 18+ messages in thread
* [Bug rtl-optimization/105091] RTL dse1 remove stack mem storing incorrectly
2022-03-29 2:27 [Bug rtl-optimization/105091] New: RTL dse1 remove stack mem storing incorrectly guojiufu at gcc dot gnu.org
` (3 preceding siblings ...)
2022-03-29 11:17 ` guojiufu at gcc dot gnu.org
@ 2022-03-29 11:18 ` guojiufu at gcc dot gnu.org
2022-03-29 11:41 ` guojiufu at gcc dot gnu.org
` (11 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: guojiufu at gcc dot gnu.org @ 2022-03-29 11:18 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105091
--- Comment #5 from Jiu Fu Guo <guojiufu at gcc dot gnu.org> ---
Created attachment 52709
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=52709&action=edit
280r.dse1
^ permalink raw reply [flat|nested] 18+ messages in thread
* [Bug rtl-optimization/105091] RTL dse1 remove stack mem storing incorrectly
2022-03-29 2:27 [Bug rtl-optimization/105091] New: RTL dse1 remove stack mem storing incorrectly guojiufu at gcc dot gnu.org
` (4 preceding siblings ...)
2022-03-29 11:18 ` guojiufu at gcc dot gnu.org
@ 2022-03-29 11:41 ` guojiufu at gcc dot gnu.org
2022-03-29 12:43 ` guojiufu at gcc dot gnu.org
` (10 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: guojiufu at gcc dot gnu.org @ 2022-03-29 11:41 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105091
--- Comment #6 from Jiu Fu Guo <guojiufu at gcc dot gnu.org> ---
---bits_test.go
package big
import (
"fmt"
"testing"
)
type Bits []int
func TestMulBits(t *testing.T) {
for _, test := range []struct {
x, y, want Bits
}{
{Bits{}, Bits{}, nil},
{Bits{0}, Bits{0}, Bits{0}},
} {
p := test.x
fmt.Printf("%v", p)
}
}
---
Hi Richard!
The dumps are attached. Thanks.
One interesting thing: after r12-656, it seems no changes on dse.cc relates to
this issue.
^ permalink raw reply [flat|nested] 18+ messages in thread
* [Bug rtl-optimization/105091] RTL dse1 remove stack mem storing incorrectly
2022-03-29 2:27 [Bug rtl-optimization/105091] New: RTL dse1 remove stack mem storing incorrectly guojiufu at gcc dot gnu.org
` (5 preceding siblings ...)
2022-03-29 11:41 ` guojiufu at gcc dot gnu.org
@ 2022-03-29 12:43 ` guojiufu at gcc dot gnu.org
2022-03-30 2:51 ` ian at airs dot com
` (9 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: guojiufu at gcc dot gnu.org @ 2022-03-29 12:43 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105091
--- Comment #7 from Jiu Fu Guo <guojiufu at gcc dot gnu.org> ---
tried to remove 'fmt' from the narrowed code, but it is still in code :)
^ permalink raw reply [flat|nested] 18+ messages in thread
* [Bug rtl-optimization/105091] RTL dse1 remove stack mem storing incorrectly
2022-03-29 2:27 [Bug rtl-optimization/105091] New: RTL dse1 remove stack mem storing incorrectly guojiufu at gcc dot gnu.org
` (6 preceding siblings ...)
2022-03-29 12:43 ` guojiufu at gcc dot gnu.org
@ 2022-03-30 2:51 ` ian at airs dot com
2022-03-30 8:39 ` guojiufu at gcc dot gnu.org
` (8 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: ian at airs dot com @ 2022-03-30 2:51 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105091
Ian Lance Taylor <ian at airs dot com> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |ian at airs dot com
--- Comment #8 from Ian Lance Taylor <ian at airs dot com> ---
This program should print
0
1
but when I run it on gcc112.fsffrance.org, compiling with -O2, it prints
1
824633846216
package main
func main() {
for _, test := range []struct {
x, y, want []int
}{
{[]int{}, []int{}, nil},
{[]int{0}, []int{0}, []int{0}},
} {
p := test.x
F(p)
}
}
func F(v interface{}) {
recover()
println(cap(v.([]int)))
}
This can be compiled (though not run) using a cross-compiler without building
libgo.
The code coming into 280r.dse1 seems to be indexing from the end of the array.
I see
code_label 96 126 55 4 118 (nil) [0 uses])
(note 55 96 56 4 [bb 4] NOTE_INSN_BASIC_BLOCK)
(insn 56 55 57 4 (set (reg:DI 144)
(mult:DI (reg:DI 121 [ ivtmp_47 ])
(const_int -72 [0xffffffffffffffb8]))) "foo.go":4:2 154 {muldi3}
(nil))
(insn 57 56 59 4 (set (reg/f:DI 145)
(plus:DI (reg/f:DI 173)
(reg:DI 144))) "foo.go":4:2 66 {*adddi3}
(expr_list:REG_DEAD (reg/f:DI 173)
(expr_list:REG_DEAD (reg:DI 144)
(nil))))
where earlier I see
(insn 17 16 19 2 (set (mem/f/c:DI (plus:DI (reg/f:DI 110 sfp)
(const_int 32 [0x20])) [8 GOTMP.5[0].x.__values+0 S8 A128])
(reg/f:DI 117 [ _11 ])) "foo.go":4:23 670 {*movdi_internal64}
(expr_list:REG_DEAD (reg/f:DI 117 [ _11 ])
(nil)))
and
(insn 120 4 121 2 (set (reg/f:DI 173)
(plus:DI (reg/f:DI 110 sfp)
(const_int 32 [0x20]))) 66 {*adddi3}
(nil))
So register 173 is &GOTMP.5 although insn 120 doesn't indicate that. Then the
280r.dse1 pass drops out all the assignments to GOTMP.5, presumably because it
doesn't understand that register 173 points to it.
^ permalink raw reply [flat|nested] 18+ messages in thread
* [Bug rtl-optimization/105091] RTL dse1 remove stack mem storing incorrectly
2022-03-29 2:27 [Bug rtl-optimization/105091] New: RTL dse1 remove stack mem storing incorrectly guojiufu at gcc dot gnu.org
` (7 preceding siblings ...)
2022-03-30 2:51 ` ian at airs dot com
@ 2022-03-30 8:39 ` guojiufu at gcc dot gnu.org
2022-03-30 13:46 ` guojiufu at gcc dot gnu.org
` (7 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: guojiufu at gcc dot gnu.org @ 2022-03-30 8:39 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105091
--- Comment #9 from Jiu Fu Guo <guojiufu at gcc dot gnu.org> ---
(In reply to Ian Lance Taylor from comment #8)
...
>
> package main
>
> func main() {
> for _, test := range []struct {
> x, y, want []int
> }{
> {[]int{}, []int{}, nil},
> {[]int{0}, []int{0}, []int{0}},
> } {
> p := test.x
> F(p)
> }
> }
>
> func F(v interface{}) {
> recover()
> println(cap(v.([]int)))
> }
>
> This can be compiled (though not run) using a cross-compiler without
> building libgo.
>
> The code coming into 280r.dse1 seems to be indexing from the end of the
> array. I see
>
> code_label 96 126 55 4 118 (nil) [0 uses])
> (note 55 96 56 4 [bb 4] NOTE_INSN_BASIC_BLOCK)
> (insn 56 55 57 4 (set (reg:DI 144)
> (mult:DI (reg:DI 121 [ ivtmp_47 ])
> (const_int -72 [0xffffffffffffffb8]))) "foo.go":4:2 154 {muldi3}
> (nil))
> (insn 57 56 59 4 (set (reg/f:DI 145)
> (plus:DI (reg/f:DI 173)
> (reg:DI 144))) "foo.go":4:2 66 {*adddi3}
> (expr_list:REG_DEAD (reg/f:DI 173)
> (expr_list:REG_DEAD (reg:DI 144)
> (nil))))
>
> where earlier I see
>
> (insn 17 16 19 2 (set (mem/f/c:DI (plus:DI (reg/f:DI 110 sfp)
> (const_int 32 [0x20])) [8 GOTMP.5[0].x.__values+0 S8 A128])
> (reg/f:DI 117 [ _11 ])) "foo.go":4:23 670 {*movdi_internal64}
> (expr_list:REG_DEAD (reg/f:DI 117 [ _11 ])
> (nil)))
>
> and
>
> (insn 120 4 121 2 (set (reg/f:DI 173)
> (plus:DI (reg/f:DI 110 sfp)
> (const_int 32 [0x20]))) 66 {*adddi3}
> (nil))
>
> So register 173 is &GOTMP.5 although insn 120 doesn't indicate that. Then
> the 280r.dse1 pass drops out all the assignments to GOTMP.5, presumably
> because it doesn't understand that register 173 points to it.
Hi Ian!
Thanks for your great help!
^ permalink raw reply [flat|nested] 18+ messages in thread
* [Bug rtl-optimization/105091] RTL dse1 remove stack mem storing incorrectly
2022-03-29 2:27 [Bug rtl-optimization/105091] New: RTL dse1 remove stack mem storing incorrectly guojiufu at gcc dot gnu.org
` (8 preceding siblings ...)
2022-03-30 8:39 ` guojiufu at gcc dot gnu.org
@ 2022-03-30 13:46 ` guojiufu at gcc dot gnu.org
2022-03-30 13:55 ` guojiufu at gcc dot gnu.org
` (6 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: guojiufu at gcc dot gnu.org @ 2022-03-30 13:46 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105091
--- Comment #10 from Jiu Fu Guo <guojiufu at gcc dot gnu.org> ---
Created attachment 52718
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=52718&action=edit
m.go sub1.go
Based on Ian's code, the below code also reproduce this issue.
package sub1
func TestBits(callback func(interface{})) {
for _, test := range []struct {
x, y, want []int
}{
{[]int{}, nil, nil},
{[]int{0}, nil, nil},
} {
p := test.x
callback(p)
}
}
---
> go1 sub1.go -quiet -O2 -o sub1.s
^ permalink raw reply [flat|nested] 18+ messages in thread
* [Bug rtl-optimization/105091] RTL dse1 remove stack mem storing incorrectly
2022-03-29 2:27 [Bug rtl-optimization/105091] New: RTL dse1 remove stack mem storing incorrectly guojiufu at gcc dot gnu.org
` (9 preceding siblings ...)
2022-03-30 13:46 ` guojiufu at gcc dot gnu.org
@ 2022-03-30 13:55 ` guojiufu at gcc dot gnu.org
2022-03-30 14:14 ` guojiufu at gcc dot gnu.org
` (5 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: guojiufu at gcc dot gnu.org @ 2022-03-30 13:55 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105091
--- Comment #11 from Jiu Fu Guo <guojiufu at gcc dot gnu.org> ---
Find one difference between trunk and r12-656:
On trunk:
tree expr = MEM_EXPR (mem);
where mem is
(mem/f/c:DI (plus:DI (reg/f:DI 110 sfp)
(const_int 32 [0x20])) [3 GOTMP.2[0].x.__values+0 S8 A128])
and then expr is GOTMP.2[0].x.__values
base = get_base_address (expr); base is "GOTMP.2"
"may_be_aliased (base)" returns false.
On r12-656: "may_be_aliased (base)" returns true.
may_be_aliased checks TREE_ADDRESSABLE which also returns differences between
trunk and r12-656.
^ permalink raw reply [flat|nested] 18+ messages in thread
* [Bug rtl-optimization/105091] RTL dse1 remove stack mem storing incorrectly
2022-03-29 2:27 [Bug rtl-optimization/105091] New: RTL dse1 remove stack mem storing incorrectly guojiufu at gcc dot gnu.org
` (10 preceding siblings ...)
2022-03-30 13:55 ` guojiufu at gcc dot gnu.org
@ 2022-03-30 14:14 ` guojiufu at gcc dot gnu.org
2022-03-30 14:16 ` rguenth at gcc dot gnu.org
` (4 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: guojiufu at gcc dot gnu.org @ 2022-03-30 14:14 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105091
--- Comment #12 from Jiu Fu Guo <guojiufu at gcc dot gnu.org> ---
In dse.cc, "may_be_aliased" affects "can_escape" and then affects
"kill_on_calls".
^ permalink raw reply [flat|nested] 18+ messages in thread
* [Bug rtl-optimization/105091] RTL dse1 remove stack mem storing incorrectly
2022-03-29 2:27 [Bug rtl-optimization/105091] New: RTL dse1 remove stack mem storing incorrectly guojiufu at gcc dot gnu.org
` (11 preceding siblings ...)
2022-03-30 14:14 ` guojiufu at gcc dot gnu.org
@ 2022-03-30 14:16 ` rguenth at gcc dot gnu.org
2022-03-31 6:09 ` guojiufu at gcc dot gnu.org
` (3 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: rguenth at gcc dot gnu.org @ 2022-03-30 14:16 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105091
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Assignee|unassigned at gcc dot gnu.org |rguenth at gcc dot gnu.org
Status|UNCONFIRMED |ASSIGNED
Ever confirmed|0 |1
Last reconfirmed| |2022-03-30
--- Comment #13 from Richard Biener <rguenth at gcc dot gnu.org> ---
<bb 3> [local count: 715863673]:
# ivtmp_47 = PHI <1(3), 2(2)>
_43 = ivtmp_47 * 18446744073709551544;
GOTMP.8 = MEM[(struct *)&GOTMP.5 + 144B + _43 * 1];
GOTMP.13 = GOTMP.8;
test = GOTMP.13;
p = test.x;
D.483.__type_descriptor = &g.type.._6_7int;
GOTMP.14 = p;
D.483.__object = &GOTMP.14;
main.F (D.483);
p ={v} {CLOBBER(eol)};
if (ivtmp_47 != 1)
goto <bb 3>; [66.67%]
else
goto <bb 4>; [33.33%]
<bb 4> [local count: 357878152]:
test ={v} {CLOBBER(eol)};
return;
that's an interesting sequence of aggregate copies (meh - SRA should
optimize those!) and an interesting choice of IVs but nothing invalid.
We expand the
GOTMP.8 = MEM[(struct *)&GOTMP.5 + 144B + _43 * 1];
stmt to memcpy() but GOTMP.5 is not TREE_ADDRESSABLE here. That might
in the end lead DSE to remove the stores. When setting the flag
inside gdb during expansion I see the stores are retained.
Now, emit_block_op_via_libcall does
/* Since dst and src are passed to a libcall, mark the corresponding
tree EXPR as addressable. */
tree dst_expr = MEM_EXPR (dst);
tree src_expr = MEM_EXPR (src);
if (dst_expr)
mark_addressable (dst_expr);
if (src_expr)
mark_addressable (src_expr);
but mark_addressable doesn't handle TARGET_MEM_REF.
Does the following fix the runtime error? The RTL after DSE seems to be OK.
diff --git a/gcc/gimple-expr.cc b/gcc/gimple-expr.cc
index f9a650b5daf..5faaf43eaf5 100644
--- a/gcc/gimple-expr.cc
+++ b/gcc/gimple-expr.cc
@@ -910,7 +910,8 @@ mark_addressable (tree x)
x = TREE_OPERAND (x, 0);
while (handled_component_p (x))
x = TREE_OPERAND (x, 0);
- if (TREE_CODE (x) == MEM_REF
+ if ((TREE_CODE (x) == MEM_REF
+ || TREE_CODE (x) == TARGET_MEM_REF)
&& TREE_CODE (TREE_OPERAND (x, 0)) == ADDR_EXPR)
x = TREE_OPERAND (TREE_OPERAND (x, 0), 0);
if (!VAR_P (x)
^ permalink raw reply [flat|nested] 18+ messages in thread
* [Bug rtl-optimization/105091] RTL dse1 remove stack mem storing incorrectly
2022-03-29 2:27 [Bug rtl-optimization/105091] New: RTL dse1 remove stack mem storing incorrectly guojiufu at gcc dot gnu.org
` (12 preceding siblings ...)
2022-03-30 14:16 ` rguenth at gcc dot gnu.org
@ 2022-03-31 6:09 ` guojiufu at gcc dot gnu.org
2022-03-31 7:19 ` cvs-commit at gcc dot gnu.org
` (2 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: guojiufu at gcc dot gnu.org @ 2022-03-31 6:09 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105091
--- Comment #14 from Jiu Fu Guo <guojiufu at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #13)
...
> Does the following fix the runtime error? The RTL after DSE seems to be OK.
>
> diff --git a/gcc/gimple-expr.cc b/gcc/gimple-expr.cc
> index f9a650b5daf..5faaf43eaf5 100644
> --- a/gcc/gimple-expr.cc
> +++ b/gcc/gimple-expr.cc
> @@ -910,7 +910,8 @@ mark_addressable (tree x)
> x = TREE_OPERAND (x, 0);
> while (handled_component_p (x))
> x = TREE_OPERAND (x, 0);
> - if (TREE_CODE (x) == MEM_REF
> + if ((TREE_CODE (x) == MEM_REF
> + || TREE_CODE (x) == TARGET_MEM_REF)
> && TREE_CODE (TREE_OPERAND (x, 0)) == ADDR_EXPR)
> x = TREE_OPERAND (TREE_OPERAND (x, 0), 0);
> if (!VAR_P (x)
Hi Richard!
Thanks a lot, so great! This fix works, also pass bootstrap®test for
ppc64/ppc64le and x86_64.
^ permalink raw reply [flat|nested] 18+ messages in thread
* [Bug rtl-optimization/105091] RTL dse1 remove stack mem storing incorrectly
2022-03-29 2:27 [Bug rtl-optimization/105091] New: RTL dse1 remove stack mem storing incorrectly guojiufu at gcc dot gnu.org
` (13 preceding siblings ...)
2022-03-31 6:09 ` guojiufu at gcc dot gnu.org
@ 2022-03-31 7:19 ` cvs-commit at gcc dot gnu.org
2022-03-31 7:26 ` rguenth at gcc dot gnu.org
2022-03-31 19:05 ` ian at airs dot com
16 siblings, 0 replies; 18+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2022-03-31 7:19 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105091
--- Comment #15 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Richard Biener <rguenth@gcc.gnu.org>:
https://gcc.gnu.org/g:b75f996e846d079251f3a6134617f0405c3ed535
commit r12-7932-gb75f996e846d079251f3a6134617f0405c3ed535
Author: Richard Biener <rguenther@suse.de>
Date: Thu Mar 31 08:20:43 2022 +0200
rtl-optimization/105091 - wrong DSE with missed TREE_ADDRESSABLE
When expanding an aggregate copy into a memcpy call RTL expansion
uses mark_addressable to ensure the base object is addressable but
that function doesn't handle TARGET_MEM_REF bases. Fixed as follows.
2022-03-31 Richard Biener <rguenther@suse.de>
PR rtl-optimization/105091
* gimple-expr.cc (mark_addressable): Handle TARGET_MEM_REF
bases.
^ permalink raw reply [flat|nested] 18+ messages in thread
* [Bug rtl-optimization/105091] RTL dse1 remove stack mem storing incorrectly
2022-03-29 2:27 [Bug rtl-optimization/105091] New: RTL dse1 remove stack mem storing incorrectly guojiufu at gcc dot gnu.org
` (14 preceding siblings ...)
2022-03-31 7:19 ` cvs-commit at gcc dot gnu.org
@ 2022-03-31 7:26 ` rguenth at gcc dot gnu.org
2022-03-31 19:05 ` ian at airs dot com
16 siblings, 0 replies; 18+ messages in thread
From: rguenth at gcc dot gnu.org @ 2022-03-31 7:26 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105091
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Resolution|--- |FIXED
Status|ASSIGNED |RESOLVED
--- Comment #16 from Richard Biener <rguenth at gcc dot gnu.org> ---
Fixed. Btw, this latent issue was likely exposed by r12-910-g35a16e4b38eb9f
^ permalink raw reply [flat|nested] 18+ messages in thread
* [Bug rtl-optimization/105091] RTL dse1 remove stack mem storing incorrectly
2022-03-29 2:27 [Bug rtl-optimization/105091] New: RTL dse1 remove stack mem storing incorrectly guojiufu at gcc dot gnu.org
` (15 preceding siblings ...)
2022-03-31 7:26 ` rguenth at gcc dot gnu.org
@ 2022-03-31 19:05 ` ian at airs dot com
16 siblings, 0 replies; 18+ messages in thread
From: ian at airs dot com @ 2022-03-31 19:05 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105091
--- Comment #17 from Ian Lance Taylor <ian at airs dot com> ---
Thanks.
^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2022-03-31 19:05 UTC | newest]
Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-03-29 2:27 [Bug rtl-optimization/105091] New: RTL dse1 remove stack mem storing incorrectly guojiufu at gcc dot gnu.org
2022-03-29 2:41 ` [Bug rtl-optimization/105091] " guojiufu at gcc dot gnu.org
2022-03-29 2:56 ` guojiufu at gcc dot gnu.org
2022-03-29 7:45 ` rguenth at gcc dot gnu.org
2022-03-29 11:17 ` guojiufu at gcc dot gnu.org
2022-03-29 11:18 ` guojiufu at gcc dot gnu.org
2022-03-29 11:41 ` guojiufu at gcc dot gnu.org
2022-03-29 12:43 ` guojiufu at gcc dot gnu.org
2022-03-30 2:51 ` ian at airs dot com
2022-03-30 8:39 ` guojiufu at gcc dot gnu.org
2022-03-30 13:46 ` guojiufu at gcc dot gnu.org
2022-03-30 13:55 ` guojiufu at gcc dot gnu.org
2022-03-30 14:14 ` guojiufu at gcc dot gnu.org
2022-03-30 14:16 ` rguenth at gcc dot gnu.org
2022-03-31 6:09 ` guojiufu at gcc dot gnu.org
2022-03-31 7:19 ` cvs-commit at gcc dot gnu.org
2022-03-31 7:26 ` rguenth at gcc dot gnu.org
2022-03-31 19:05 ` ian at airs dot 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).