https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61236
--- Comment #1 from Mukund Sivaraman <muks at banu dot com> --- The following is _correct_ generated x8t_64 code for dns_rdataslab_fromrdataset() as compiled with: gcc version 4.8.2 20131212 (Red Hat 4.8.2-7) (GCC) Under free_rdatas label, you can see that there is a 0 check for x (%r14) as in the C code. It was not deleted by the compiler. 0000000000521450 <dns_rdataslab_fromrdataset>: ; find dns_rdata_set_first() call below: 521450: 41 57 push %r15 521452: 49 89 f7 mov %rsi,%r15 521455: 41 56 push %r14 521457: 41 55 push %r13 521459: 41 54 push %r12 52145b: 49 89 fc mov %rdi,%r12 52145e: 55 push %rbp 52145f: 53 push %rbx 521460: 48 83 ec 38 sub $0x38,%rsp 521464: 48 89 54 24 10 mov %rdx,0x10(%rsp) 521469: 89 4c 24 0c mov %ecx,0xc(%rsp) 52146d: e8 ce e7 ff ff callq 51fc40 <dns_rdataset_count> 521472: 41 89 c5 mov %eax,%r13d 521475: 45 85 ed test %r13d,%r13d 521478: 75 26 jne 5214a0 <dns_rdataslab_fromrdataset+0x50> 52147a: 45 31 f6 xor %r14d,%r14d 52147d: 66 41 83 7c 24 22 00 cmpw $0x0,0x22(%r12) 521484: b8 19 00 00 00 mov $0x19,%eax 521489: 74 4c je 5214d7 <dns_rdataslab_fromrdataset+0x87> 52148b: 48 83 c4 38 add $0x38,%rsp 52148f: 5b pop %rbx 521490: 5d pop %rbp 521491: 41 5c pop %r12 521493: 41 5d pop %r13 521495: 41 5e pop %r14 521497: 41 5f pop %r15 521499: c3 retq 52149a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 5214a0: 41 81 fd ff ff 00 00 cmp $0xffff,%r13d 5214a7: b8 13 00 00 00 mov $0x13,%eax 5214ac: 77 dd ja 52148b <dns_rdataslab_fromrdataset+0x3b> 5214ae: 44 89 e8 mov %r13d,%eax 5214b1: b9 a1 00 00 00 mov $0xa1,%ecx 5214b6: ba eb 20 64 00 mov $0x6420eb,%edx 5214bb: 48 8d 34 40 lea (%rax,%rax,2),%rsi 5214bf: 4c 89 ff mov %r15,%rdi 5214c2: 48 c1 e6 04 shl $0x4,%rsi 5214c6: e8 45 c2 0a 00 callq 5cd710 <isc__mem_get> 5214cb: 48 85 c0 test %rax,%rax 5214ce: 49 89 c6 mov %rax,%r14 5214d1: 0f 84 a7 00 00 00 je 52157e <dns_rdataslab_fromrdataset+0x12e> 5214d7: 4c 89 e7 mov %r12,%rdi ; result = dns_rdataset_first(rdataset); 5214da: e8 41 e8 ff ff callq 51fd20 <dns_rdataset_first> ; if (result != ISC_R_SUCCESS && result != ISC_R_NOMORE) ; goto free_rdatas; ; 0x1d (ISC_R_NOMORE) 5214df: 83 f8 1d cmp $0x1d,%eax 5214e2: 74 04 je 5214e8 <dns_rdataslab_fromrdataset+0x98> ; 0x0 (ISC_R_SUCCESS). if (result != ISC_R_SUCCESS && result != ; ISC_R_NOMORE), jmp to 52153f (free_rdatas) below. ;; test instruction does logical AND of operands and sets zero flag if ;; %eax is 0. jne (same as jnz) tests ZF and performs conditional jump ;; if ZF=0. 5214e4: 85 c0 test %eax,%eax 5214e6: 75 57 jne 52153f <dns_rdataslab_fromrdataset+0xef> ; go below to free_rdatas. ; ignore: for loop 5214e8: 31 db xor %ebx,%ebx 5214ea: 85 c0 test %eax,%eax 5214ec: 75 4c jne 52153a <dns_rdataslab_fromrdataset+0xea> 5214ee: 45 85 ed test %r13d,%r13d 5214f1: 75 0a jne 5214fd <dns_rdataslab_fromrdataset+0xad> 5214f3: eb 45 jmp 52153a <dns_rdataslab_fromrdataset+0xea> 5214f5: 0f 1f 00 nopl (%rax) ; ignore: for loop iterate (continue;) 5214f8: 41 39 dd cmp %ebx,%r13d 5214fb: 76 3d jbe 52153a <dns_rdataslab_fromrdataset+0xea> 5214fd: 89 d8 mov %ebx,%eax 5214ff: 48 8d 2c 40 lea (%rax,%rax,2),%rbp 521503: 48 c1 e5 04 shl $0x4,%rbp 521507: 4c 01 f5 add %r14,%rbp 52150a: 48 89 ef mov %rbp,%rdi 52150d: e8 4e 9e fd ff callq 4fb360 <dns_rdata_init> 521512: 48 89 ee mov %rbp,%rsi 521515: 4c 89 e7 mov %r12,%rdi 521518: e8 a3 e8 ff ff callq 51fdc0 <dns_rdataset_current> ; Second INSIST() inside for loop. First INSIST() is redundant. 52151d: 48 81 7d 00 a8 c6 8b cmpq $0x8bc6a8,0x0(%rbp) 521524: 00 521525: 0f 84 00 02 00 00 je 52172b <dns_rdataslab_fromrdataset+0x2db> 52152b: 4c 89 e7 mov %r12,%rdi 52152e: 83 c3 01 add $0x1,%ebx 521531: e8 3a e8 ff ff callq 51fd70 <dns_rdataset_next> 521536: 85 c0 test %eax,%eax 521538: 74 be je 5214f8 <dns_rdataslab_fromrdataset+0xa8> 52153a: 83 f8 1d cmp $0x1d,%eax 52153d: 74 49 je 521588 <dns_rdataslab_fromrdataset+0x138> ; free_rdatas: ; if (x != NULL) ; isc_mem_put(mctx, x, nalloc * sizeof(struct xrdata)); ; return (result); 52153f: 4d 85 f6 test %r14,%r14 521542: 0f 84 43 ff ff ff je 52148b <dns_rdataslab_fromrdataset+0x3b> ; x is not NULL. Call isc__mem_put(), pop frame and return: 521548: 4b 8d 54 6d 00 lea 0x0(%r13,%r13,2),%rdx 52154d: 4c 89 f6 mov %r14,%rsi 521550: 4c 89 ff mov %r15,%rdi 521553: 41 b8 4e 01 00 00 mov $0x14e,%r8d 521559: b9 eb 20 64 00 mov $0x6420eb,%ecx 52155e: 89 44 24 0c mov %eax,0xc(%rsp) 521562: 48 c1 e2 04 shl $0x4,%rdx 521566: e8 85 d2 0a 00 callq 5ce7f0 <isc__mem_put> 52156b: 8b 44 24 0c mov 0xc(%rsp),%eax 52156f: 48 83 c4 38 add $0x38,%rsp 521573: 5b pop %rbx 521574: 5d pop %rbp 521575: 41 5c pop %r12 521577: 41 5d pop %r13 521579: 41 5e pop %r14 52157b: 41 5f pop %r15 52157d: c3 retq ; ... you can skip the rest of this comment. 52157e: b8 01 00 00 00 mov $0x1,%eax 521583: e9 03 ff ff ff jmpq 52148b <dns_rdataslab_fromrdataset+0x3b> 521588: 44 39 eb cmp %r13d,%ebx 52158b: b0 19 mov $0x19,%al 52158d: 75 b0 jne 52153f <dns_rdataslab_fromrdataset+0xef> 52158f: 8b 44 24 0c mov 0xc(%rsp),%eax 521593: 89 de mov %ebx,%esi 521595: b9 c0 13 52 00 mov $0x5213c0,%ecx 52159a: ba 30 00 00 00 mov $0x30,%edx 52159f: 4c 89 f7 mov %r14,%rdi 5215a2: 8d 68 02 lea 0x2(%rax),%ebp 5215a5: e8 86 57 ee ff callq 406d30 <qsort@plt> 5215aa: 83 fb 01 cmp $0x1,%ebx 5215ad: 0f 86 91 01 00 00 jbe 521744 <dns_rdataslab_fromrdataset+0x2f4> 5215b3: 4c 89 f2 mov %r14,%rdx 5215b6: 89 5c 24 2c mov %ebx,0x2c(%rsp) 5215ba: b9 01 00 00 00 mov $0x1,%ecx 5215bf: eb 16 jmp 5215d7 <dns_rdataslab_fromrdataset+0x187> 5215c1: 83 6c 24 2c 01 subl $0x1,0x2c(%rsp) 5215c6: 48 c7 02 a8 c6 8b 00 movq $0x8bc6a8,(%rdx) 5215cd: 83 c1 01 add $0x1,%ecx 5215d0: 39 d9 cmp %ebx,%ecx 5215d2: 74 49 je 52161d <dns_rdataslab_fromrdataset+0x1cd> 5215d4: 4c 89 c2 mov %r8,%rdx 5215d7: 4c 8d 42 30 lea 0x30(%rdx),%r8 5215db: 48 89 d7 mov %rdx,%rdi 5215de: 89 4c 24 28 mov %ecx,0x28(%rsp) 5215e2: 48 89 54 24 18 mov %rdx,0x18(%rsp) 5215e7: 4c 89 c6 mov %r8,%rsi 5215ea: 4c 89 44 24 20 mov %r8,0x20(%rsp) 5215ef: e8 8c d3 fd ff callq 4fe980 <dns_rdata_compare> 5215f4: 85 c0 test %eax,%eax 5215f6: 48 8b 54 24 18 mov 0x18(%rsp),%rdx 5215fb: 4c 8b 44 24 20 mov 0x20(%rsp),%r8 521600: 8b 4c 24 28 mov 0x28(%rsp),%ecx 521604: 74 bb je 5215c1 <dns_rdataslab_fromrdataset+0x171> 521606: 8b 42 08 mov 0x8(%rdx),%eax 521609: 01 e8 add %ebp,%eax 52160b: 8d 68 02 lea 0x2(%rax),%ebp 52160e: 83 c0 03 add $0x3,%eax 521611: 66 41 83 7c 24 22 2e cmpw $0x2e,0x22(%r12) 521618: 0f 44 e8 cmove %eax,%ebp 52161b: eb b0 jmp 5215cd <dns_rdataslab_fromrdataset+0x17d> 52161d: 89 d8 mov %ebx,%eax 52161f: 83 e8 01 sub $0x1,%eax 521622: 48 8d 04 40 lea (%rax,%rax,2),%rax 521626: 48 c1 e0 04 shl $0x4,%rax 52162a: 41 8b 44 06 08 mov 0x8(%r14,%rax,1),%eax 52162f: 8d 6c 05 02 lea 0x2(%rbp,%rax,1),%ebp 521633: 41 0f b7 44 24 22 movzwl 0x22(%r12),%eax 521639: 31 d2 xor %edx,%edx 52163b: 66 83 f8 2e cmp $0x2e,%ax 52163f: 0f 94 c2 sete %dl 521642: 01 d5 add %edx,%ebp 521644: 83 7c 24 2c 01 cmpl $0x1,0x2c(%rsp) 521649: 76 16 jbe 521661 <dns_rdataslab_fromrdataset+0x211> 52164b: 0f b7 f8 movzwl %ax,%edi 52164e: e8 3d d7 ff ff callq 51ed90 <dns_rdatatype_issingleton> 521653: 85 c0 test %eax,%eax 521655: 74 0a je 521661 <dns_rdataslab_fromrdataset+0x211> 521657: b8 48 00 01 00 mov $0x10048,%eax 52165c: e9 de fe ff ff jmpq 52153f <dns_rdataslab_fromrdataset+0xef> 521661: 89 ee mov %ebp,%esi 521663: b9 0a 01 00 00 mov $0x10a,%ecx 521668: ba eb 20 64 00 mov $0x6420eb,%edx 52166d: 4c 89 ff mov %r15,%rdi 521670: e8 9b c0 0a 00 callq 5cd710 <isc__mem_get> 521675: 48 85 c0 test %rax,%rax 521678: 0f 84 d7 00 00 00 je 521755 <dns_rdataslab_fromrdataset+0x305> 52167e: 48 8b 4c 24 10 mov 0x10(%rsp),%rcx 521683: 8b 54 24 0c mov 0xc(%rsp),%edx 521687: 8b 74 24 2c mov 0x2c(%rsp),%esi 52168b: 48 89 01 mov %rax,(%rcx) 52168e: 89 69 08 mov %ebp,0x8(%rcx) 521691: 48 89 f1 mov %rsi,%rcx 521694: 48 01 d0 add %rdx,%rax 521697: 85 db test %ebx,%ebx 521699: 0f b6 d5 movzbl %ch,%edx 52169c: 40 88 70 01 mov %sil,0x1(%rax) 5216a0: 88 10 mov %dl,(%rax) 5216a2: 48 8d 50 02 lea 0x2(%rax),%rdx 5216a6: 74 7c je 521724 <dns_rdataslab_fromrdataset+0x2d4> 5216a8: 83 eb 01 sub $0x1,%ebx 5216ab: 4c 89 f5 mov %r14,%rbp 5216ae: 48 8d 04 5b lea (%rbx,%rbx,2),%rax 5216b2: 48 c1 e0 04 shl $0x4,%rax 5216b6: 49 8d 5c 06 30 lea 0x30(%r14,%rax,1),%rbx 5216bb: eb 21 jmp 5216de <dns_rdataslab_fromrdataset+0x28e> 5216bd: 0f 1f 00 nopl (%rax) 5216c0: 8b 55 08 mov 0x8(%rbp),%edx 5216c3: 48 8b 75 00 mov 0x0(%rbp),%rsi 5216c7: 48 89 cf mov %rcx,%rdi 5216ca: e8 11 54 ee ff callq 406ae0 <memmove@plt> 5216cf: 8b 55 08 mov 0x8(%rbp),%edx 5216d2: 48 01 c2 add %rax,%rdx 5216d5: 48 83 c5 30 add $0x30,%rbp 5216d9: 48 39 dd cmp %rbx,%rbp 5216dc: 74 46 je 521724 <dns_rdataslab_fromrdataset+0x2d4> 5216de: 48 81 7d 00 a8 c6 8b cmpq $0x8bc6a8,0x0(%rbp) 5216e5: 00 5216e6: 74 ed je 5216d5 <dns_rdataslab_fromrdataset+0x285> 5216e8: 31 c0 xor %eax,%eax 5216ea: 66 41 83 7c 24 22 2e cmpw $0x2e,0x22(%r12) 5216f1: 0f 94 c0 sete %al 5216f4: 03 45 08 add 0x8(%rbp),%eax 5216f7: 3d ff ff 00 00 cmp $0xffff,%eax 5216fc: 77 61 ja 52175f <dns_rdataslab_fromrdataset+0x30f> 5216fe: 0f b6 cc movzbl %ah,%ecx 521701: 88 42 01 mov %al,0x1(%rdx) 521704: 88 0a mov %cl,(%rdx) 521706: 66 41 83 7c 24 22 2e cmpw $0x2e,0x22(%r12) 52170d: 48 8d 4a 02 lea 0x2(%rdx),%rcx 521711: 75 ad jne 5216c0 <dns_rdataslab_fromrdataset+0x270> 521713: 8b 45 10 mov 0x10(%rbp),%eax 521716: 48 8d 4a 03 lea 0x3(%rdx),%rcx 52171a: d1 e8 shr %eax 52171c: 83 e0 01 and $0x1,%eax 52171f: 08 42 02 or %al,0x2(%rdx) 521722: eb 9c jmp 5216c0 <dns_rdataslab_fromrdataset+0x270> 521724: 31 c0 xor %eax,%eax 521726: e9 14 fe ff ff jmpq 52153f <dns_rdataslab_fromrdataset+0xef> 52172b: b9 f7 20 64 00 mov $0x6420f7,%ecx 521730: ba 02 00 00 00 mov $0x2,%edx 521735: be b1 00 00 00 mov $0xb1,%esi 52173a: bf eb 20 64 00 mov $0x6420eb,%edi 52173f: e8 dc 92 09 00 callq 5baa20 <isc_assertion_failed> 521744: 85 db test %ebx,%ebx 521746: 75 30 jne 521778 <dns_rdataslab_fromrdataset+0x328> 521748: c7 44 24 2c 00 00 00 movl $0x0,0x2c(%rsp) 52174f: 00 521750: e9 de fe ff ff jmpq 521633 <dns_rdataslab_fromrdataset+0x1e3> 521755: b8 01 00 00 00 mov $0x1,%eax 52175a: e9 e0 fd ff ff jmpq 52153f <dns_rdataslab_fromrdataset+0xef> 52175f: b9 33 6c 5f 00 mov $0x5f6c33,%ecx 521764: ba 02 00 00 00 mov $0x2,%edx 521769: be 34 01 00 00 mov $0x134,%esi 52176e: bf eb 20 64 00 mov $0x6420eb,%edi 521773: e8 a8 92 09 00 callq 5baa20 <isc_assertion_failed> 521778: 89 5c 24 2c mov %ebx,0x2c(%rsp) 52177c: b8 01 00 00 00 mov $0x1,%eax 521781: e9 99 fe ff ff jmpq 52161f <dns_rdataslab_fromrdataset+0x1cf> 521786: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 52178d: 00 00 00