Strictness in data declaration not matched in assembler?

Tyson Whitehead twhitehead at
Wed Oct 15 10:35:32 EDT 2008

Consider the following code

data Data = Data { unData :: !Int }

func :: Data -> Int
func x = case unData x of
           1 -> 2
           _ -> 0

Compiling with GHC 6.8.2 gives the following stg code

Main.func =
    \r [x_slg]
        case x_slg of tpl_slx {
          Main.Data ipv_slj ->
              case ipv_slj of wild_sly {
                GHC.Base.I# ds_slm ->
                    case ds_slm of ds1_slz {
                      __DEFAULT -> Main.lvl1;
                      1 -> Main.lvl;

The native code generator turns it into the following x86_64 assembler

	leaq -8(%rbp),%rax
	cmpq %r14,%rax
	jb .LcnU
	movq %rsi,%rbx
	movq $sni_info,-8(%rbp)
	addq $-8,%rbp
	testq $7,%rbx
	jne sni_info
	jmp *(%rbx)
	movl $Main_func_closure,%ebx
	jmp *-8(%r13)

	movq 7(%rbx),%rbx
	movq $snj_info,(%rbp)
	testq $7,%rbx
	jne snj_info
	jmp *(%rbx)

	cmpq $1,7(%rbx)
	jne .LcnE
	movl $Main_lvl_closure+1,%ebx
	addq $8,%rbp
	jmp *(%rbp)
	movl $Main_lvl1_closure+1,%ebx
	addq $8,%rbp
	jmp *(%rbp)

It seems to me that the !Int member of the Data constructor is being treated 
like it might be a thunk in sni_info (i.e., the whole "testq $7,%rbx" thing).

Isn't this unnecessary as the "!" strictness flag means the Int argument must 
be forced by the Data constructor before being captured?

Thanks! -Tyson

More information about the Glasgow-haskell-users mailing list