I can confirm that it is six zeroes.  That is indeed weird and highlights
that it's not just a simple switching of the fields.

I will file a ticket now.  Thank you!

-Tim

On Tue, Nov 28, 2023 at 8:30 PM 'Keith Randall' via golang-nuts <
golang-nuts@googlegroups.com> wrote:

> It seems strange that the bad result is ABCDEF12000000 and not
> ABCDEF1200000000. i.e., 6 zeros and not 8. Can you confirm?
>
> Definitely sounds like a bug to me. You should open an issue.
> On Tuesday, November 28, 2023 at 1:44:59 PM UTC-8 Timothy Olsen wrote:
>
>> A coworker suggested I try with optimizations off:
>>
>> [tol...@rhel74-z-dev.dallasisv.build ~]$ go version
>> go version go1.21.4 linux/s390x
>> [tol...@rhel74-z-dev.dallasisv.build ~]$ go build -o /tmp/scratch_1
>> scratch_1.go
>> [tol...@rhel74-z-dev.dallasisv.build ~]$ /tmp/scratch_1
>> ABCDEF12
>> ABCDEF12000000
>> [tol...@rhel74-z-dev.dallasisv.build ~]$ go build -gcflags='-N' -o
>> /tmp/scratch_1 scratch_1.go
>> [tol...@rhel74-z-dev.dallasisv.build ~]$ /tmp/scratch_1
>> ABCDEF12
>> ABCDEF12
>> [tol...@rhel74-z-dev.dallasisv.build ~]$ export
>> GOROOT=/opt/golang/go1.20.11
>> [tol...@rhel74-z-dev.dallasisv.build ~]$ export
>> PATH=${GOROOT}/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/ibm/java-s390x-80/bin:/home/tolsen/.local/bin:/home/tolsen/bin
>> [tol...@rhel74-z-dev.dallasisv.build ~]$ go build -o /tmp/scratch_1
>> scratch_1.go
>> [tol...@rhel74-z-dev.dallasisv.build ~]$ /tmp/scratch_1
>> ABCDEF12
>> ABCDEF12
>> [tol...@rhel74-z-dev.dallasisv.build ~]$
>>
>> That further confirms a bug with optimizations on s390x (and possibly
>> other big endian machines?) .
>>
>> -Tim
>>
>> On Tue, Nov 28, 2023 at 4:36 PM 'tim....@mongodb.com' via golang-nuts <
>> golan...@googlegroups.com> wrote:
>>
>>> Hello,
>>>
>>> I believe I've found a code-optimization bug in Go 1.21.4 on Linux
>>> s390x.  This is what I was able to narrow the code sample down to:
>>>
>>> //////////
>>> package main
>>>
>>> import "fmt"
>>>
>>> type myStruct struct {
>>> A uint32
>>> B uint32
>>> }
>>>
>>> func doOpOnStructElems(a, b uint32) uint64 {
>>> return (uint64(a) << 32) | uint64(b)
>>> }
>>>
>>> func main() {
>>> myVal := myStruct{0, 0xABCDEF12}
>>>
>>> passAsMyStructAndThenDoOp(myVal)
>>> passAsIfaceAndThenDoOp(myVal)
>>> }
>>>
>>> func passAsMyStructAndThenDoOp(myVal myStruct) {
>>> fmt.Printf("%X\n", doOpOnStructElems(myVal.A, myVal.B))
>>> }
>>>
>>> func passAsIfaceAndThenDoOp(myIface interface{}) {
>>> fmt.Printf("%X\n", doOpOnStructElems(myIface.(myStruct).A,
>>> myIface.(myStruct).B))
>>> }
>>> ////////
>>>
>>> When I run it I get:
>>>
>>> /////
>>>
>>> $ go run scratch_1.go
>>>
>>> ABCDEF12
>>>
>>> ABCDEF12000000
>>> //////
>>>
>>> If I run it on Linux zSeries w/ Go 1.20.11 or on Linux AMD64, Linux
>>> ARM64, or macOS w/ Go 1.21.4, I get what I believe is the correct answer:
>>>
>>> ////
>>>
>>> $ go run scratch_1.go
>>>
>>> ABCDEF12
>>>
>>> ABCDEF12
>>>
>>> ////
>>>
>>> In other words, with Go 1.21.4 and s390x it appears that A & B are
>>> switched in the 2nd call which passes the struct as an interface{} .
>>>
>>> s390x is the only big endian platform I am able to test on.  So I
>>> suspect there may be an endianness issue here.  I suspect something has
>>> gone wrong with some sort of code optimization because if I insert
>>> Println() at the beginning of doOpOnStructElems(), the problem goes away.
>>> So it's possible there's some bug with code inlining when what is being
>>> passed in was originally passed in as an interface in the caller?
>>>
>>> If someone could confirm that this is indeed a bug I will be happy to
>>> file an issue.
>>>
>>> Thank you,
>>>
>>> Tim
>>>
>> --
> You received this message because you are subscribed to a topic in the
> Google Groups "golang-nuts" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/golang-nuts/TYGuzUTTsN8/unsubscribe.
> To unsubscribe from this group and all its topics, 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/b2a37dfc-7b6a-412a-8cbb-40a2210d6921n%40googlegroups.com
> <https://groups.google.com/d/msgid/golang-nuts/b2a37dfc-7b6a-412a-8cbb-40a2210d6921n%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>

-- 
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/CAJJHkeivsiYLkg4aM6JL8Q%3DiTb-xi8J7JHgf33_fsP98%2BVxCYg%40mail.gmail.com.

Reply via email to