On Tue, Jun 28, 2022 at 5:47 AM 'Dan Kortschak' via golang-nuts
<golang-nuts@googlegroups.com> wrote:
>
> On Mon, 2022-06-27 at 23:32 -0700, iori yamada wrote:
> > Running the code in the link below times out, is this a bug?
> > Looking at the assembly, it seems that the instructions corresponding
> > to the if statement have been removed due to optimization.
> >
> > https://go.dev/play/p/CZX4mbyrp37
> >
> > The following is a description of how I thought it was a bug.
> >
> > In the first loop, the value of i is 9223372036854775807 (the maximum
> > value of type int), which is incremented and overflows. Then it
> > becomes -9223372036854775808 (minimum value of type int) and I
> > thought the condition in the if statement exits from the true
> > neighbor loop.
> >
> > I couldn't figure out where the bug was happening, so I decided to
> > look at an assembly of the same code as above, built it locally, and
> > checked it with objdump.
> > Perhaps, the CMP instruction that compares the conditions of the if
> > statement has been removed due to optimization.
> >
> > ```
> > ...
> > TEXT main.main(SB) Path/main.go
> >   main.go:3 0x100051550 92f00000 MOVD $9223372036854775807, R0
> >   main.go:4 0x100051554 14000002 JMP 2(PC)
> >   main.go:4 0x100051558 91000400 ADD $1, R0, R0
> >   main.go:4 0x10005155c 92f0001b MOVD $9223372036854775807, R27
> >   main.go:4 0x100051560 eb1b001f CMP R27, R0
> >   main.go:4 0x100051564 54ffffad BLE -3(PC)
> >   main.go:9 0x100051568 d65f03c0 RET
> >   main.go:9 0x10005156c 00000000 ?
> > ```
> >
> > So I compiled it without optimization (go build -gcflags '-N -l') and
> > the program terminated immediately as intended.
> >
> > I may have misunderstood something, may I ask anyone to check once?
>
> Yes, I see the same behaviour when I run this locally (also tried with
> an old version go1.14.9).
>
> Also, the assembly generated at godbolt shows that no code is generated
> for the terminating branch  https://godbolt.org/z/9jW1GaKfv unless
> optimisation is turned off https://godbolt.org/z/o7o6x3bzd.

Interesting.  Looks like Go 1.10 got this right, but 1.11 and higher
go into an endless loop.  gccgo gets it right.

Please open an issue.  Thanks.

Ian

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CAOyqgcUPy6VdKbmc%2BOCaMDAw3c6FdtJVcLiJBGji1BK-DPzKaQ%40mail.gmail.com.

Reply via email to