Dear all,

I stumbled over a strange performance degradation when using unsafe 
pointers. I took a look at the assembly and was surprised to see a number 
seemingly redundant nil checks using the LEAQ and TESTB instructions.

A minimal reproducer is the following function:
func getOff(a *uint64, i int) uint64 {
 return *(*uint64)(Pointer(uintptr(Pointer(a)) + uintptr(i)*8))
}
, which generates this assembly (removed the boilerplate):
AX: i int
CX: a *uint64

 v16    00005 (55)      LEAQ    (CX)(AX*8), DX
 v18    00006 (55)      TESTB   AX, (DX)
 v19    00007 (55)      MOVQ    (CX)(AX*8), AX

AX: return value uint64
As you can see the MOVQ (7) is preceeded by LEAQ (5) calculating the same 
address and then TESTB (6) on said address. This is presumably a nil check, 
but I do not understand what this accomplishes.
I'm confused what's going on here. I attached the ssa.html for further 
analysis.

Another question: Why does the nil check take two instructions. Can't it be 
done using MOVQ?

Best regards,
Florian


-- 
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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to