In the following code I marked the tree 'node.0' as address taken using 'c_mark_addressable'. Now in the assembly code, isn't the return value of the second call to malloc completely discarded?
This problem does not arise in -O0. Here I'm using -O2. main () { void * D.2897; struct node * D.2898; struct node * node.0; void * D.2900; int * D.2901; int * D.2902; struct node * node; D.2897 = malloc (8); D.2898 = (struct node *) D.2897; node = D.2898; node.0 = node; D.2900 = malloc (4); D.2901 = (int *) D.2900; node.0->item = D.2901; <------ node.0 = node; D.2902 = node.0->item; printf (&"%p %p\n"[0], D.2902, &node); } main: .LFB5: subq $24, %rsp .LCFI0: movl $8, %edi call malloc movl $4, %edi movq %rax, 16(%rsp) call malloc movq 16(%rsp), %rax leaq 16(%rsp), %rdx movl $.LC0, %edi movq (%rax), %rsi xorl %eax, %eax call printf addq $24, %rsp ret The code that is generated when I do not modify the flag. main: .LFB5: pushq %rbx .LCFI0: movl $8, %edi subq $16, %rsp .LCFI1: call malloc movl $4, %edi movq %rax, %rbx movq %rax, 8(%rsp) call malloc movq %rax, (%rbx) movq 8(%rsp), %rax leaq 8(%rsp), %rdx movl $.LC0, %edi movq (%rax), %rsi xorl %eax, %eax call printf addq $16, %rsp popq %rbx ret thanks, -- dasarath