I did mention about this in my previous blog here. Now slightly extending the condition to this
int test(unsigned int k)
{
if (k <= 0)
printf("BUG IN COMPILER: THIS IS ABSURD BLOCK\n");
}
We can expect few changes by compiler. Now this has two conditions, one for comparing for zero and other for comparing for Sign bit. What does compiler emit?
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movl %edi, -4(%rbp)
cmpl $0, -4(%rbp)<-- Just compare with zero and kick programmer
jne .L3
movl $.LC0, %edi
call puts
As expected it emits only condition for comparing with zero :D. gcc is very smart with this case too! Everything remains same except we have "call puts" now to print in case of condition is true.
int test(unsigned int k)
{
if (k <= 0)
printf("BUG IN COMPILER: THIS IS ABSURD BLOCK\n");
}
We can expect few changes by compiler. Now this has two conditions, one for comparing for zero and other for comparing for Sign bit. What does compiler emit?
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movl %edi, -4(%rbp)
cmpl $0, -4(%rbp)<-- Just compare with zero and kick programmer
jne .L3
movl $.LC0, %edi
call puts
As expected it emits only condition for comparing with zero :D. gcc is very smart with this case too! Everything remains same except we have "call puts" now to print in case of condition is true.
No comments:
Post a Comment