1573 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc %s -o - -enable-shrink-wrap=true -pass-remarks-output=%t -disable-cgp-delete-phis | FileCheck %s --check-prefix=ENABLE3; RUN: cat %t | FileCheck %s --check-prefix=REMARKS4; RUN: llc %s -o - -enable-shrink-wrap=false -disable-cgp-delete-phis | FileCheck %s --check-prefix=DISABLE5;6; Note: Lots of tests use inline asm instead of regular calls.7; This allows to have a better control on what the allocation will do.8; Otherwise, we may have spill right in the entry block, defeating9; shrink-wrapping. Moreover, some of the inline asm statement (nop)10; are here to ensure that the related paths do not end up as critical11; edges.12target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"13target triple = "x86_64-apple-macosx"14 15 16; Initial motivating example: Simple diamond with a call just on one side.17define i32 @foo(i32 %a, i32 %b) {18; ENABLE-LABEL: foo:19; ENABLE: ## %bb.0:20; ENABLE-NEXT: movl %edi, %eax21; ENABLE-NEXT: cmpl %esi, %edi22; ENABLE-NEXT: jge LBB0_223; ENABLE-NEXT: ## %bb.1: ## %true24; ENABLE-NEXT: pushq %rax25; ENABLE-NEXT: .cfi_def_cfa_offset 1626; ENABLE-NEXT: movl %eax, {{[0-9]+}}(%rsp)27; ENABLE-NEXT: leaq {{[0-9]+}}(%rsp), %rsi28; ENABLE-NEXT: xorl %edi, %edi29; ENABLE-NEXT: callq _doSomething30; ENABLE-NEXT: addq $8, %rsp31; ENABLE-NEXT: LBB0_2: ## %false32; ENABLE-NEXT: retq33;34; DISABLE-LABEL: foo:35; DISABLE: ## %bb.0:36; DISABLE-NEXT: pushq %rax37; DISABLE-NEXT: .cfi_def_cfa_offset 1638; DISABLE-NEXT: movl %edi, %eax39; DISABLE-NEXT: cmpl %esi, %edi40; DISABLE-NEXT: jge LBB0_241; DISABLE-NEXT: ## %bb.1: ## %true42; DISABLE-NEXT: movl %eax, {{[0-9]+}}(%rsp)43; DISABLE-NEXT: leaq {{[0-9]+}}(%rsp), %rsi44; DISABLE-NEXT: xorl %edi, %edi45; DISABLE-NEXT: callq _doSomething46; DISABLE-NEXT: LBB0_2: ## %false47; DISABLE-NEXT: popq %rcx48; DISABLE-NEXT: retq49 %tmp = alloca i32, align 450 %tmp2 = icmp slt i32 %a, %b51 br i1 %tmp2, label %true, label %false52 53true:54 store i32 %a, ptr %tmp, align 455 %tmp4 = call i32 @doSomething(i32 0, ptr %tmp)56 br label %false57 58false:59 %tmp.0 = phi i32 [ %tmp4, %true ], [ %a, %0 ]60 ret i32 %tmp.061}62 63; Function Attrs: optsize64declare i32 @doSomething(i32, ptr)65 66 67; Check that we do not perform the restore inside the loop whereas the save68; is outside.69define i32 @freqSaveAndRestoreOutsideLoop(i32 %cond, i32 %N) {70; ENABLE-LABEL: freqSaveAndRestoreOutsideLoop:71; ENABLE: ## %bb.0: ## %entry72; ENABLE-NEXT: testl %edi, %edi73; ENABLE-NEXT: je LBB1_474; ENABLE-NEXT: ## %bb.1: ## %for.preheader75; ENABLE-NEXT: pushq %rbx76; ENABLE-NEXT: .cfi_def_cfa_offset 1677; ENABLE-NEXT: .cfi_offset %rbx, -1678; ENABLE-NEXT: ## InlineAsm Start79; ENABLE-NEXT: nop80; ENABLE-NEXT: ## InlineAsm End81; ENABLE-NEXT: xorl %eax, %eax82; ENABLE-NEXT: movl $10, %ecx83; ENABLE-NEXT: .p2align 484; ENABLE-NEXT: LBB1_2: ## %for.body85; ENABLE-NEXT: ## =>This Inner Loop Header: Depth=186; ENABLE-NEXT: ## InlineAsm Start87; ENABLE-NEXT: movl $1, %edx88; ENABLE-NEXT: ## InlineAsm End89; ENABLE-NEXT: addl %edx, %eax90; ENABLE-NEXT: decl %ecx91; ENABLE-NEXT: jne LBB1_292; ENABLE-NEXT: ## %bb.3: ## %for.end93; ENABLE-NEXT: shll $3, %eax94; ENABLE-NEXT: popq %rbx95; ENABLE-NEXT: retq96; ENABLE-NEXT: LBB1_4: ## %if.else97; ENABLE-NEXT: movl %esi, %eax98; ENABLE-NEXT: addl %esi, %eax99; ENABLE-NEXT: retq100;101; DISABLE-LABEL: freqSaveAndRestoreOutsideLoop:102; DISABLE: ## %bb.0: ## %entry103; DISABLE-NEXT: pushq %rbx104; DISABLE-NEXT: .cfi_def_cfa_offset 16105; DISABLE-NEXT: .cfi_offset %rbx, -16106; DISABLE-NEXT: testl %edi, %edi107; DISABLE-NEXT: je LBB1_4108; DISABLE-NEXT: ## %bb.1: ## %for.preheader109; DISABLE-NEXT: ## InlineAsm Start110; DISABLE-NEXT: nop111; DISABLE-NEXT: ## InlineAsm End112; DISABLE-NEXT: xorl %eax, %eax113; DISABLE-NEXT: movl $10, %ecx114; DISABLE-NEXT: .p2align 4115; DISABLE-NEXT: LBB1_2: ## %for.body116; DISABLE-NEXT: ## =>This Inner Loop Header: Depth=1117; DISABLE-NEXT: ## InlineAsm Start118; DISABLE-NEXT: movl $1, %edx119; DISABLE-NEXT: ## InlineAsm End120; DISABLE-NEXT: addl %edx, %eax121; DISABLE-NEXT: decl %ecx122; DISABLE-NEXT: jne LBB1_2123; DISABLE-NEXT: ## %bb.3: ## %for.end124; DISABLE-NEXT: shll $3, %eax125; DISABLE-NEXT: popq %rbx126; DISABLE-NEXT: retq127; DISABLE-NEXT: LBB1_4: ## %if.else128; DISABLE-NEXT: movl %esi, %eax129; DISABLE-NEXT: addl %esi, %eax130; DISABLE-NEXT: popq %rbx131; DISABLE-NEXT: retq132entry:133 %tobool = icmp eq i32 %cond, 0134 br i1 %tobool, label %if.else, label %for.preheader135 136for.preheader:137 tail call void asm "nop", ""()138 br label %for.body139 140for.body: ; preds = %entry, %for.body141 %i.05 = phi i32 [ %inc, %for.body ], [ 0, %for.preheader ]142 %sum.04 = phi i32 [ %add, %for.body ], [ 0, %for.preheader ]143 %call = tail call i32 asm sideeffect "movl $$1, $0", "=r,~{ebx}"()144 %add = add nsw i32 %call, %sum.04145 %inc = add nuw nsw i32 %i.05, 1146 %exitcond = icmp eq i32 %inc, 10147 br i1 %exitcond, label %for.end, label %for.body148 149for.end: ; preds = %for.body150 %shl = shl i32 %add, 3151 br label %if.end152 153if.else: ; preds = %entry154 %mul = shl nsw i32 %N, 1155 br label %if.end156 157if.end: ; preds = %if.else, %for.end158 %sum.1 = phi i32 [ %shl, %for.end ], [ %mul, %if.else ]159 ret i32 %sum.1160}161 162declare i32 @something(...)163 164; Check that we do not perform the shrink-wrapping inside the loop even165; though that would be legal. The cost model must prevent that.166define i32 @freqSaveAndRestoreOutsideLoop2(i32 %cond) {167; ENABLE-LABEL: freqSaveAndRestoreOutsideLoop2:168; ENABLE: ## %bb.0: ## %entry169; ENABLE-NEXT: pushq %rbx170; ENABLE-NEXT: .cfi_def_cfa_offset 16171; ENABLE-NEXT: .cfi_offset %rbx, -16172; ENABLE-NEXT: ## InlineAsm Start173; ENABLE-NEXT: nop174; ENABLE-NEXT: ## InlineAsm End175; ENABLE-NEXT: xorl %eax, %eax176; ENABLE-NEXT: movl $10, %ecx177; ENABLE-NEXT: .p2align 4178; ENABLE-NEXT: LBB2_1: ## %for.body179; ENABLE-NEXT: ## =>This Inner Loop Header: Depth=1180; ENABLE-NEXT: ## InlineAsm Start181; ENABLE-NEXT: movl $1, %edx182; ENABLE-NEXT: ## InlineAsm End183; ENABLE-NEXT: addl %edx, %eax184; ENABLE-NEXT: decl %ecx185; ENABLE-NEXT: jne LBB2_1186; ENABLE-NEXT: ## %bb.2: ## %for.exit187; ENABLE-NEXT: ## InlineAsm Start188; ENABLE-NEXT: nop189; ENABLE-NEXT: ## InlineAsm End190; ENABLE-NEXT: popq %rbx191; ENABLE-NEXT: retq192;193; DISABLE-LABEL: freqSaveAndRestoreOutsideLoop2:194; DISABLE: ## %bb.0: ## %entry195; DISABLE-NEXT: pushq %rbx196; DISABLE-NEXT: .cfi_def_cfa_offset 16197; DISABLE-NEXT: .cfi_offset %rbx, -16198; DISABLE-NEXT: ## InlineAsm Start199; DISABLE-NEXT: nop200; DISABLE-NEXT: ## InlineAsm End201; DISABLE-NEXT: xorl %eax, %eax202; DISABLE-NEXT: movl $10, %ecx203; DISABLE-NEXT: .p2align 4204; DISABLE-NEXT: LBB2_1: ## %for.body205; DISABLE-NEXT: ## =>This Inner Loop Header: Depth=1206; DISABLE-NEXT: ## InlineAsm Start207; DISABLE-NEXT: movl $1, %edx208; DISABLE-NEXT: ## InlineAsm End209; DISABLE-NEXT: addl %edx, %eax210; DISABLE-NEXT: decl %ecx211; DISABLE-NEXT: jne LBB2_1212; DISABLE-NEXT: ## %bb.2: ## %for.exit213; DISABLE-NEXT: ## InlineAsm Start214; DISABLE-NEXT: nop215; DISABLE-NEXT: ## InlineAsm End216; DISABLE-NEXT: popq %rbx217; DISABLE-NEXT: retq218entry:219 br label %for.preheader220 221for.preheader:222 tail call void asm "nop", ""()223 br label %for.body224 225for.body: ; preds = %for.body, %entry226 %i.04 = phi i32 [ 0, %for.preheader ], [ %inc, %for.body ]227 %sum.03 = phi i32 [ 0, %for.preheader ], [ %add, %for.body ]228 %call = tail call i32 asm sideeffect "movl $$1, $0", "=r,~{ebx}"()229 %add = add nsw i32 %call, %sum.03230 %inc = add nuw nsw i32 %i.04, 1231 %exitcond = icmp eq i32 %inc, 10232 br i1 %exitcond, label %for.exit, label %for.body233 234for.exit:235 tail call void asm "nop", ""()236 br label %for.end237 238for.end: ; preds = %for.body239 ret i32 %add240}241 242; Check with a more complex case that we do not have save within the loop and243; restore outside.244define i32 @loopInfoSaveOutsideLoop(i32 %cond, i32 %N) {245; ENABLE-LABEL: loopInfoSaveOutsideLoop:246; ENABLE: ## %bb.0: ## %entry247; ENABLE-NEXT: testl %edi, %edi248; ENABLE-NEXT: je LBB3_4249; ENABLE-NEXT: ## %bb.1: ## %for.preheader250; ENABLE-NEXT: pushq %rbx251; ENABLE-NEXT: .cfi_def_cfa_offset 16252; ENABLE-NEXT: .cfi_offset %rbx, -16253; ENABLE-NEXT: ## InlineAsm Start254; ENABLE-NEXT: nop255; ENABLE-NEXT: ## InlineAsm End256; ENABLE-NEXT: xorl %eax, %eax257; ENABLE-NEXT: movl $10, %ecx258; ENABLE-NEXT: .p2align 4259; ENABLE-NEXT: LBB3_2: ## %for.body260; ENABLE-NEXT: ## =>This Inner Loop Header: Depth=1261; ENABLE-NEXT: ## InlineAsm Start262; ENABLE-NEXT: movl $1, %edx263; ENABLE-NEXT: ## InlineAsm End264; ENABLE-NEXT: addl %edx, %eax265; ENABLE-NEXT: decl %ecx266; ENABLE-NEXT: jne LBB3_2267; ENABLE-NEXT: ## %bb.3: ## %for.end268; ENABLE-NEXT: ## InlineAsm Start269; ENABLE-NEXT: nop270; ENABLE-NEXT: ## InlineAsm End271; ENABLE-NEXT: shll $3, %eax272; ENABLE-NEXT: popq %rbx273; ENABLE-NEXT: retq274; ENABLE-NEXT: LBB3_4: ## %if.else275; ENABLE-NEXT: movl %esi, %eax276; ENABLE-NEXT: addl %esi, %eax277; ENABLE-NEXT: retq278;279; DISABLE-LABEL: loopInfoSaveOutsideLoop:280; DISABLE: ## %bb.0: ## %entry281; DISABLE-NEXT: pushq %rbx282; DISABLE-NEXT: .cfi_def_cfa_offset 16283; DISABLE-NEXT: .cfi_offset %rbx, -16284; DISABLE-NEXT: testl %edi, %edi285; DISABLE-NEXT: je LBB3_4286; DISABLE-NEXT: ## %bb.1: ## %for.preheader287; DISABLE-NEXT: ## InlineAsm Start288; DISABLE-NEXT: nop289; DISABLE-NEXT: ## InlineAsm End290; DISABLE-NEXT: xorl %eax, %eax291; DISABLE-NEXT: movl $10, %ecx292; DISABLE-NEXT: .p2align 4293; DISABLE-NEXT: LBB3_2: ## %for.body294; DISABLE-NEXT: ## =>This Inner Loop Header: Depth=1295; DISABLE-NEXT: ## InlineAsm Start296; DISABLE-NEXT: movl $1, %edx297; DISABLE-NEXT: ## InlineAsm End298; DISABLE-NEXT: addl %edx, %eax299; DISABLE-NEXT: decl %ecx300; DISABLE-NEXT: jne LBB3_2301; DISABLE-NEXT: ## %bb.3: ## %for.end302; DISABLE-NEXT: ## InlineAsm Start303; DISABLE-NEXT: nop304; DISABLE-NEXT: ## InlineAsm End305; DISABLE-NEXT: shll $3, %eax306; DISABLE-NEXT: popq %rbx307; DISABLE-NEXT: retq308; DISABLE-NEXT: LBB3_4: ## %if.else309; DISABLE-NEXT: movl %esi, %eax310; DISABLE-NEXT: addl %esi, %eax311; DISABLE-NEXT: popq %rbx312; DISABLE-NEXT: retq313entry:314 %tobool = icmp eq i32 %cond, 0315 br i1 %tobool, label %if.else, label %for.preheader316 317for.preheader:318 tail call void asm "nop", ""()319 br label %for.body320 321for.body: ; preds = %entry, %for.body322 %i.05 = phi i32 [ %inc, %for.body ], [ 0, %for.preheader ]323 %sum.04 = phi i32 [ %add, %for.body ], [ 0, %for.preheader ]324 %call = tail call i32 asm sideeffect "movl $$1, $0", "=r,~{ebx}"()325 %add = add nsw i32 %call, %sum.04326 %inc = add nuw nsw i32 %i.05, 1327 %exitcond = icmp eq i32 %inc, 10328 br i1 %exitcond, label %for.end, label %for.body329 330for.end: ; preds = %for.body331 tail call void asm "nop", "~{ebx}"()332 %shl = shl i32 %add, 3333 br label %if.end334 335if.else: ; preds = %entry336 %mul = shl nsw i32 %N, 1337 br label %if.end338 339if.end: ; preds = %if.else, %for.end340 %sum.1 = phi i32 [ %shl, %for.end ], [ %mul, %if.else ]341 ret i32 %sum.1342}343 344; Check with a more complex case that we do not have restore within the loop and345; save outside.346define i32 @loopInfoRestoreOutsideLoop(i32 %cond, i32 %N) nounwind {347; ENABLE-LABEL: loopInfoRestoreOutsideLoop:348; ENABLE: ## %bb.0: ## %entry349; ENABLE-NEXT: testl %edi, %edi350; ENABLE-NEXT: je LBB4_4351; ENABLE-NEXT: ## %bb.1: ## %if.then352; ENABLE-NEXT: pushq %rbx353; ENABLE-NEXT: ## InlineAsm Start354; ENABLE-NEXT: nop355; ENABLE-NEXT: ## InlineAsm End356; ENABLE-NEXT: xorl %eax, %eax357; ENABLE-NEXT: movl $10, %ecx358; ENABLE-NEXT: .p2align 4359; ENABLE-NEXT: LBB4_2: ## %for.body360; ENABLE-NEXT: ## =>This Inner Loop Header: Depth=1361; ENABLE-NEXT: ## InlineAsm Start362; ENABLE-NEXT: movl $1, %edx363; ENABLE-NEXT: ## InlineAsm End364; ENABLE-NEXT: addl %edx, %eax365; ENABLE-NEXT: decl %ecx366; ENABLE-NEXT: jne LBB4_2367; ENABLE-NEXT: ## %bb.3: ## %for.end368; ENABLE-NEXT: shll $3, %eax369; ENABLE-NEXT: popq %rbx370; ENABLE-NEXT: retq371; ENABLE-NEXT: LBB4_4: ## %if.else372; ENABLE-NEXT: movl %esi, %eax373; ENABLE-NEXT: addl %esi, %eax374; ENABLE-NEXT: retq375;376; DISABLE-LABEL: loopInfoRestoreOutsideLoop:377; DISABLE: ## %bb.0: ## %entry378; DISABLE-NEXT: pushq %rbx379; DISABLE-NEXT: testl %edi, %edi380; DISABLE-NEXT: je LBB4_4381; DISABLE-NEXT: ## %bb.1: ## %if.then382; DISABLE-NEXT: ## InlineAsm Start383; DISABLE-NEXT: nop384; DISABLE-NEXT: ## InlineAsm End385; DISABLE-NEXT: xorl %eax, %eax386; DISABLE-NEXT: movl $10, %ecx387; DISABLE-NEXT: .p2align 4388; DISABLE-NEXT: LBB4_2: ## %for.body389; DISABLE-NEXT: ## =>This Inner Loop Header: Depth=1390; DISABLE-NEXT: ## InlineAsm Start391; DISABLE-NEXT: movl $1, %edx392; DISABLE-NEXT: ## InlineAsm End393; DISABLE-NEXT: addl %edx, %eax394; DISABLE-NEXT: decl %ecx395; DISABLE-NEXT: jne LBB4_2396; DISABLE-NEXT: ## %bb.3: ## %for.end397; DISABLE-NEXT: shll $3, %eax398; DISABLE-NEXT: popq %rbx399; DISABLE-NEXT: retq400; DISABLE-NEXT: LBB4_4: ## %if.else401; DISABLE-NEXT: movl %esi, %eax402; DISABLE-NEXT: addl %esi, %eax403; DISABLE-NEXT: popq %rbx404; DISABLE-NEXT: retq405entry:406 %tobool = icmp eq i32 %cond, 0407 br i1 %tobool, label %if.else, label %if.then408 409if.then: ; preds = %entry410 tail call void asm "nop", "~{ebx}"()411 br label %for.body412 413for.body: ; preds = %for.body, %if.then414 %i.05 = phi i32 [ 0, %if.then ], [ %inc, %for.body ]415 %sum.04 = phi i32 [ 0, %if.then ], [ %add, %for.body ]416 %call = tail call i32 asm sideeffect "movl $$1, $0", "=r,~{ebx}"()417 %add = add nsw i32 %call, %sum.04418 %inc = add nuw nsw i32 %i.05, 1419 %exitcond = icmp eq i32 %inc, 10420 br i1 %exitcond, label %for.end, label %for.body421 422for.end: ; preds = %for.body423 %shl = shl i32 %add, 3424 br label %if.end425 426if.else: ; preds = %entry427 %mul = shl nsw i32 %N, 1428 br label %if.end429 430if.end: ; preds = %if.else, %for.end431 %sum.1 = phi i32 [ %shl, %for.end ], [ %mul, %if.else ]432 ret i32 %sum.1433}434 435; Check that we handle function with no frame information correctly.436define i32 @emptyFrame() {437; ENABLE-LABEL: emptyFrame:438; ENABLE: ## %bb.0: ## %entry439; ENABLE-NEXT: xorl %eax, %eax440; ENABLE-NEXT: retq441;442; DISABLE-LABEL: emptyFrame:443; DISABLE: ## %bb.0: ## %entry444; DISABLE-NEXT: xorl %eax, %eax445; DISABLE-NEXT: retq446entry:447 ret i32 0448}449 450; Check that we handle inline asm correctly.451define i32 @inlineAsm(i32 %cond, i32 %N) {452; ENABLE-LABEL: inlineAsm:453; ENABLE: ## %bb.0: ## %entry454; ENABLE-NEXT: testl %edi, %edi455; ENABLE-NEXT: je LBB6_4456; ENABLE-NEXT: ## %bb.1: ## %for.preheader457; ENABLE-NEXT: pushq %rbx458; ENABLE-NEXT: .cfi_def_cfa_offset 16459; ENABLE-NEXT: .cfi_offset %rbx, -16460; ENABLE-NEXT: ## InlineAsm Start461; ENABLE-NEXT: nop462; ENABLE-NEXT: ## InlineAsm End463; ENABLE-NEXT: movl $10, %eax464; ENABLE-NEXT: .p2align 4465; ENABLE-NEXT: LBB6_2: ## %for.body466; ENABLE-NEXT: ## =>This Inner Loop Header: Depth=1467; ENABLE-NEXT: ## InlineAsm Start468; ENABLE-NEXT: addl $1, %ebx469; ENABLE-NEXT: ## InlineAsm End470; ENABLE-NEXT: decl %eax471; ENABLE-NEXT: jne LBB6_2472; ENABLE-NEXT: ## %bb.3: ## %for.exit473; ENABLE-NEXT: ## InlineAsm Start474; ENABLE-NEXT: nop475; ENABLE-NEXT: ## InlineAsm End476; ENABLE-NEXT: xorl %eax, %eax477; ENABLE-NEXT: popq %rbx478; ENABLE-NEXT: retq479; ENABLE-NEXT: LBB6_4: ## %if.else480; ENABLE-NEXT: movl %esi, %eax481; ENABLE-NEXT: addl %esi, %eax482; ENABLE-NEXT: retq483;484; DISABLE-LABEL: inlineAsm:485; DISABLE: ## %bb.0: ## %entry486; DISABLE-NEXT: pushq %rbx487; DISABLE-NEXT: .cfi_def_cfa_offset 16488; DISABLE-NEXT: .cfi_offset %rbx, -16489; DISABLE-NEXT: testl %edi, %edi490; DISABLE-NEXT: je LBB6_4491; DISABLE-NEXT: ## %bb.1: ## %for.preheader492; DISABLE-NEXT: ## InlineAsm Start493; DISABLE-NEXT: nop494; DISABLE-NEXT: ## InlineAsm End495; DISABLE-NEXT: movl $10, %eax496; DISABLE-NEXT: .p2align 4497; DISABLE-NEXT: LBB6_2: ## %for.body498; DISABLE-NEXT: ## =>This Inner Loop Header: Depth=1499; DISABLE-NEXT: ## InlineAsm Start500; DISABLE-NEXT: addl $1, %ebx501; DISABLE-NEXT: ## InlineAsm End502; DISABLE-NEXT: decl %eax503; DISABLE-NEXT: jne LBB6_2504; DISABLE-NEXT: ## %bb.3: ## %for.exit505; DISABLE-NEXT: ## InlineAsm Start506; DISABLE-NEXT: nop507; DISABLE-NEXT: ## InlineAsm End508; DISABLE-NEXT: xorl %eax, %eax509; DISABLE-NEXT: popq %rbx510; DISABLE-NEXT: retq511; DISABLE-NEXT: LBB6_4: ## %if.else512; DISABLE-NEXT: movl %esi, %eax513; DISABLE-NEXT: addl %esi, %eax514; DISABLE-NEXT: popq %rbx515; DISABLE-NEXT: retq516entry:517 %tobool = icmp eq i32 %cond, 0518 br i1 %tobool, label %if.else, label %for.preheader519 520for.preheader:521 tail call void asm "nop", ""()522 br label %for.body523 524for.body: ; preds = %entry, %for.body525 %i.03 = phi i32 [ %inc, %for.body ], [ 0, %for.preheader ]526 tail call void asm "addl $$1, %ebx", "~{ebx}"()527 %inc = add nuw nsw i32 %i.03, 1528 %exitcond = icmp eq i32 %inc, 10529 br i1 %exitcond, label %for.exit, label %for.body530 531for.exit:532 tail call void asm "nop", ""()533 br label %if.end534 535if.else: ; preds = %entry536 %mul = shl nsw i32 %N, 1537 br label %if.end538 539if.end: ; preds = %for.body, %if.else540 %sum.0 = phi i32 [ %mul, %if.else ], [ 0, %for.exit ]541 ret i32 %sum.0542}543 544; Check that we handle calls to variadic functions correctly.545define i32 @callVariadicFunc(i32 %cond, i32 %N) {546; ENABLE-LABEL: callVariadicFunc:547; ENABLE: ## %bb.0: ## %entry548; ENABLE-NEXT: movl %esi, %eax549; ENABLE-NEXT: testl %edi, %edi550; ENABLE-NEXT: je LBB7_2551; ENABLE-NEXT: ## %bb.1: ## %if.then552; ENABLE-NEXT: pushq %rax553; ENABLE-NEXT: .cfi_def_cfa_offset 16554; ENABLE-NEXT: movl %eax, (%rsp)555; ENABLE-NEXT: movl %eax, %edi556; ENABLE-NEXT: movl %eax, %esi557; ENABLE-NEXT: movl %eax, %edx558; ENABLE-NEXT: movl %eax, %ecx559; ENABLE-NEXT: movl %eax, %r8d560; ENABLE-NEXT: movl %eax, %r9d561; ENABLE-NEXT: xorl %eax, %eax562; ENABLE-NEXT: callq _someVariadicFunc563; ENABLE-NEXT: shll $3, %eax564; ENABLE-NEXT: addq $8, %rsp565; ENABLE-NEXT: retq566; ENABLE-NEXT: LBB7_2: ## %if.else567; ENABLE-NEXT: addl %eax, %eax568; ENABLE-NEXT: retq569;570; DISABLE-LABEL: callVariadicFunc:571; DISABLE: ## %bb.0: ## %entry572; DISABLE-NEXT: pushq %rax573; DISABLE-NEXT: .cfi_def_cfa_offset 16574; DISABLE-NEXT: movl %esi, %eax575; DISABLE-NEXT: testl %edi, %edi576; DISABLE-NEXT: je LBB7_2577; DISABLE-NEXT: ## %bb.1: ## %if.then578; DISABLE-NEXT: movl %eax, (%rsp)579; DISABLE-NEXT: movl %eax, %edi580; DISABLE-NEXT: movl %eax, %esi581; DISABLE-NEXT: movl %eax, %edx582; DISABLE-NEXT: movl %eax, %ecx583; DISABLE-NEXT: movl %eax, %r8d584; DISABLE-NEXT: movl %eax, %r9d585; DISABLE-NEXT: xorl %eax, %eax586; DISABLE-NEXT: callq _someVariadicFunc587; DISABLE-NEXT: shll $3, %eax588; DISABLE-NEXT: popq %rcx589; DISABLE-NEXT: retq590; DISABLE-NEXT: LBB7_2: ## %if.else591; DISABLE-NEXT: addl %eax, %eax592; DISABLE-NEXT: popq %rcx593; DISABLE-NEXT: retq594entry:595 %tobool = icmp eq i32 %cond, 0596 br i1 %tobool, label %if.else, label %if.then597 598if.then: ; preds = %entry599 %call = tail call i32 (i32, ...) @someVariadicFunc(i32 %N, i32 %N, i32 %N, i32 %N, i32 %N, i32 %N, i32 %N)600 %shl = shl i32 %call, 3601 br label %if.end602 603if.else: ; preds = %entry604 %mul = shl nsw i32 %N, 1605 br label %if.end606 607if.end: ; preds = %if.else, %if.then608 %sum.0 = phi i32 [ %shl, %if.then ], [ %mul, %if.else ]609 ret i32 %sum.0610}611 612declare i32 @someVariadicFunc(i32, ...)613 614; Check that we use LEA not to clobber EFLAGS.615%struct.temp_slot = type { ptr, ptr, ptr, i32, i64, ptr, ptr, i8, i8, i32, i32, i64, i64 }616%union.tree_node = type { %struct.tree_decl }617%struct.tree_decl = type { %struct.tree_common, ptr, i32, i32, ptr, i48, %union.anon, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, %union.anon.1, ptr, ptr, ptr, i64, ptr }618%struct.tree_common = type { ptr, ptr, i32 }619%union.anon = type { i64 }620%union.anon.1 = type { ptr }621%struct.function = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, i32, i32, i32, i32, ptr, %struct.ix86_args, ptr, ptr, ptr, ptr, i32, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, i64, ptr, ptr, ptr, ptr, i32, ptr, ptr, i32, i32, i32, ptr, i32, i32, ptr, ptr, ptr, i32, i32, ptr, i32, i32, ptr, ptr, i24 }622%struct.eh_status = type opaque623%struct.stmt_status = type opaque624%struct.expr_status = type { i32, i32, i32, ptr, ptr, ptr, ptr }625%struct.emit_status = type { i32, i32, ptr, ptr, ptr, ptr, i32, i32, ptr, i32, ptr, ptr, ptr }626%struct.sequence_stack = type { ptr, ptr, ptr, ptr }627%struct.varasm_status = type opaque628%struct.ix86_args = type { i32, i32, i32, i32, i32, i32, i32 }629%struct.initial_value_struct = type opaque630%struct.var_refs_queue = type { ptr, i32, i32, ptr }631%struct.machine_function = type opaque632%struct.language_function = type opaque633%struct.lang_decl = type opaque634%struct.rtx_def = type { i32, [1 x %union.rtunion_def] }635%union.rtunion_def = type { i64 }636 637declare hidden fastcc ptr @find_temp_slot_from_address(ptr readonly)638 639define void @useLEA(ptr readonly %x) {640; ENABLE-LABEL: useLEA:641; ENABLE: ## %bb.0: ## %entry642; ENABLE-NEXT: testq %rdi, %rdi643; ENABLE-NEXT: je LBB8_9644; ENABLE-NEXT: ## %bb.1: ## %if.end645; ENABLE-NEXT: cmpw $66, (%rdi)646; ENABLE-NEXT: jne LBB8_9647; ENABLE-NEXT: ## %bb.2: ## %lor.lhs.false648; ENABLE-NEXT: pushq %rax649; ENABLE-NEXT: .cfi_def_cfa_offset 16650; ENABLE-NEXT: movq 8(%rdi), %rdi651; ENABLE-NEXT: movzwl (%rdi), %eax652; ENABLE-NEXT: leal -54(%rax), %ecx653; ENABLE-NEXT: cmpl $14, %ecx654; ENABLE-NEXT: ja LBB8_3655; ENABLE-NEXT: ## %bb.7: ## %lor.lhs.false656; ENABLE-NEXT: movl $24599, %edx ## imm = 0x6017657; ENABLE-NEXT: btl %ecx, %edx658; ENABLE-NEXT: jae LBB8_3659; ENABLE-NEXT: LBB8_8:660; ENABLE-NEXT: addq $8, %rsp661; ENABLE-NEXT: LBB8_9: ## %cleanup662; ENABLE-NEXT: retq663; ENABLE-NEXT: LBB8_3: ## %lor.lhs.false664; ENABLE-NEXT: cmpl $134, %eax665; ENABLE-NEXT: je LBB8_8666; ENABLE-NEXT: ## %bb.4: ## %lor.lhs.false667; ENABLE-NEXT: cmpl $140, %eax668; ENABLE-NEXT: je LBB8_8669; ENABLE-NEXT: ## %bb.5: ## %if.end.55670; ENABLE-NEXT: callq _find_temp_slot_from_address671; ENABLE-NEXT: testq %rax, %rax672; ENABLE-NEXT: je LBB8_8673; ENABLE-NEXT: ## %bb.6: ## %if.then.60674; ENABLE-NEXT: movb $1, 57(%rax)675; ENABLE-NEXT: jmp LBB8_8676;677; DISABLE-LABEL: useLEA:678; DISABLE: ## %bb.0: ## %entry679; DISABLE-NEXT: pushq %rax680; DISABLE-NEXT: .cfi_def_cfa_offset 16681; DISABLE-NEXT: testq %rdi, %rdi682; DISABLE-NEXT: je LBB8_7683; DISABLE-NEXT: ## %bb.1: ## %if.end684; DISABLE-NEXT: cmpw $66, (%rdi)685; DISABLE-NEXT: jne LBB8_7686; DISABLE-NEXT: ## %bb.2: ## %lor.lhs.false687; DISABLE-NEXT: movq 8(%rdi), %rdi688; DISABLE-NEXT: movzwl (%rdi), %eax689; DISABLE-NEXT: leal -54(%rax), %ecx690; DISABLE-NEXT: cmpl $14, %ecx691; DISABLE-NEXT: ja LBB8_3692; DISABLE-NEXT: ## %bb.8: ## %lor.lhs.false693; DISABLE-NEXT: movl $24599, %edx ## imm = 0x6017694; DISABLE-NEXT: btl %ecx, %edx695; DISABLE-NEXT: jae LBB8_3696; DISABLE-NEXT: LBB8_7: ## %cleanup697; DISABLE-NEXT: popq %rax698; DISABLE-NEXT: retq699; DISABLE-NEXT: LBB8_3: ## %lor.lhs.false700; DISABLE-NEXT: cmpl $134, %eax701; DISABLE-NEXT: je LBB8_7702; DISABLE-NEXT: ## %bb.4: ## %lor.lhs.false703; DISABLE-NEXT: cmpl $140, %eax704; DISABLE-NEXT: je LBB8_7705; DISABLE-NEXT: ## %bb.5: ## %if.end.55706; DISABLE-NEXT: callq _find_temp_slot_from_address707; DISABLE-NEXT: testq %rax, %rax708; DISABLE-NEXT: je LBB8_7709; DISABLE-NEXT: ## %bb.6: ## %if.then.60710; DISABLE-NEXT: movb $1, 57(%rax)711; DISABLE-NEXT: popq %rax712; DISABLE-NEXT: retq713entry:714 %cmp = icmp eq ptr %x, null715 br i1 %cmp, label %cleanup, label %if.end716 717if.end: ; preds = %entry718 %bf.load = load i32, ptr %x, align 8719 %bf.clear = and i32 %bf.load, 65535720 %cmp1 = icmp eq i32 %bf.clear, 66721 br i1 %cmp1, label %lor.lhs.false, label %cleanup722 723lor.lhs.false: ; preds = %if.end724 %arrayidx = getelementptr inbounds %struct.rtx_def, ptr %x, i64 0, i32 1, i64 0725 %tmp1 = load ptr, ptr %arrayidx, align 8726 %bf.load2 = load i32, ptr %tmp1, align 8727 %bf.clear3 = and i32 %bf.load2, 65535728 switch i32 %bf.clear3, label %if.end.55 [729 i32 67, label %cleanup730 i32 68, label %cleanup731 i32 54, label %cleanup732 i32 55, label %cleanup733 i32 58, label %cleanup734 i32 134, label %cleanup735 i32 56, label %cleanup736 i32 140, label %cleanup737 ]738 739if.end.55: ; preds = %lor.lhs.false740 %call = tail call fastcc ptr @find_temp_slot_from_address(ptr %tmp1) #2741 %cmp59 = icmp eq ptr %call, null742 br i1 %cmp59, label %cleanup, label %if.then.60743 744if.then.60: ; preds = %if.end.55745 %addr_taken = getelementptr inbounds %struct.temp_slot, ptr %call, i64 0, i32 8746 store i8 1, ptr %addr_taken, align 1747 br label %cleanup748 749cleanup: ; preds = %if.then.60, %if.end.55, %lor.lhs.false, %lor.lhs.false, %lor.lhs.false, %lor.lhs.false, %lor.lhs.false, %lor.lhs.false, %lor.lhs.false, %lor.lhs.false, %if.end, %entry750 ret void751}752 753; Make sure we do not insert unreachable code after noreturn function.754; Although this is not incorrect to insert such code, it is useless755; and it hurts the binary size.756define i32 @noreturn(i8 signext %bad_thing) {757; ENABLE-LABEL: noreturn:758; ENABLE: ## %bb.0: ## %entry759; ENABLE-NEXT: testb %dil, %dil760; ENABLE-NEXT: jne LBB9_2761; ENABLE-NEXT: ## %bb.1: ## %if.end762; ENABLE-NEXT: movl $42, %eax763; ENABLE-NEXT: retq764; ENABLE-NEXT: LBB9_2: ## %if.abort765; ENABLE-NEXT: pushq %rax766; ENABLE-NEXT: .cfi_def_cfa_offset 16767; ENABLE-NEXT: callq _abort768;769; DISABLE-LABEL: noreturn:770; DISABLE: ## %bb.0: ## %entry771; DISABLE-NEXT: pushq %rax772; DISABLE-NEXT: .cfi_def_cfa_offset 16773; DISABLE-NEXT: testb %dil, %dil774; DISABLE-NEXT: jne LBB9_2775; DISABLE-NEXT: ## %bb.1: ## %if.end776; DISABLE-NEXT: movl $42, %eax777; DISABLE-NEXT: popq %rcx778; DISABLE-NEXT: retq779; DISABLE-NEXT: LBB9_2: ## %if.abort780; DISABLE-NEXT: callq _abort781entry:782 %tobool = icmp eq i8 %bad_thing, 0783 br i1 %tobool, label %if.end, label %if.abort784 785if.abort:786 tail call void @abort() #0787 unreachable788 789if.end:790 ret i32 42791}792 793declare void @abort() #0794 795attributes #0 = { noreturn nounwind }796 797 798; Make sure that we handle infinite loops properly When checking that the Save799; and Restore blocks are control flow equivalent, the loop searches for the800; immediate (post) dominator for the (restore) save blocks. When either the Save801; or Restore block is located in an infinite loop the only immediate (post)802; dominator is itself. In this case, we cannot perform shrink wrapping, but we803; should return gracefully and continue compilation.804; The only condition for this test is the compilation finishes correctly.805;806define void @infiniteloop() {807; ENABLE-LABEL: infiniteloop:808; ENABLE: ## %bb.0: ## %entry809; ENABLE-NEXT: pushq %rbp810; ENABLE-NEXT: .cfi_def_cfa_offset 16811; ENABLE-NEXT: .cfi_offset %rbp, -16812; ENABLE-NEXT: movq %rsp, %rbp813; ENABLE-NEXT: .cfi_def_cfa_register %rbp814; ENABLE-NEXT: pushq %rbx815; ENABLE-NEXT: pushq %rax816; ENABLE-NEXT: .cfi_offset %rbx, -24817; ENABLE-NEXT: testb %al, %al818; ENABLE-NEXT: jne LBB10_3819; ENABLE-NEXT: ## %bb.1: ## %if.then820; ENABLE-NEXT: movq %rsp, %rax821; ENABLE-NEXT: addq $-16, %rax822; ENABLE-NEXT: movq %rax, %rsp823; ENABLE-NEXT: xorl %ecx, %ecx824; ENABLE-NEXT: .p2align 4825; ENABLE-NEXT: LBB10_2: ## %for.body826; ENABLE-NEXT: ## =>This Inner Loop Header: Depth=1827; ENABLE-NEXT: ## InlineAsm Start828; ENABLE-NEXT: movl $1, %edx829; ENABLE-NEXT: ## InlineAsm End830; ENABLE-NEXT: addl %edx, %ecx831; ENABLE-NEXT: movl %ecx, (%rax)832; ENABLE-NEXT: jmp LBB10_2833; ENABLE-NEXT: LBB10_3: ## %if.end834; ENABLE-NEXT: leaq -8(%rbp), %rsp835; ENABLE-NEXT: popq %rbx836; ENABLE-NEXT: popq %rbp837; ENABLE-NEXT: retq838;839; DISABLE-LABEL: infiniteloop:840; DISABLE: ## %bb.0: ## %entry841; DISABLE-NEXT: pushq %rbp842; DISABLE-NEXT: .cfi_def_cfa_offset 16843; DISABLE-NEXT: .cfi_offset %rbp, -16844; DISABLE-NEXT: movq %rsp, %rbp845; DISABLE-NEXT: .cfi_def_cfa_register %rbp846; DISABLE-NEXT: pushq %rbx847; DISABLE-NEXT: pushq %rax848; DISABLE-NEXT: .cfi_offset %rbx, -24849; DISABLE-NEXT: testb %al, %al850; DISABLE-NEXT: jne LBB10_3851; DISABLE-NEXT: ## %bb.1: ## %if.then852; DISABLE-NEXT: movq %rsp, %rax853; DISABLE-NEXT: addq $-16, %rax854; DISABLE-NEXT: movq %rax, %rsp855; DISABLE-NEXT: xorl %ecx, %ecx856; DISABLE-NEXT: .p2align 4857; DISABLE-NEXT: LBB10_2: ## %for.body858; DISABLE-NEXT: ## =>This Inner Loop Header: Depth=1859; DISABLE-NEXT: ## InlineAsm Start860; DISABLE-NEXT: movl $1, %edx861; DISABLE-NEXT: ## InlineAsm End862; DISABLE-NEXT: addl %edx, %ecx863; DISABLE-NEXT: movl %ecx, (%rax)864; DISABLE-NEXT: jmp LBB10_2865; DISABLE-NEXT: LBB10_3: ## %if.end866; DISABLE-NEXT: leaq -8(%rbp), %rsp867; DISABLE-NEXT: popq %rbx868; DISABLE-NEXT: popq %rbp869; DISABLE-NEXT: retq870entry:871 br i1 poison, label %if.then, label %if.end872 873if.then:874 %ptr = alloca i32, i32 4875 br label %for.body876 877for.body: ; preds = %for.body, %entry878 %sum.03 = phi i32 [ 0, %if.then ], [ %add, %for.body ]879 %call = tail call i32 asm "movl $$1, $0", "=r,~{ebx}"()880 %add = add nsw i32 %call, %sum.03881 store i32 %add, ptr %ptr882 br label %for.body883 884if.end:885 ret void886}887 888; Another infinite loop test this time with a body bigger than just one block.889define void @infiniteloop2() {890; ENABLE-LABEL: infiniteloop2:891; ENABLE: ## %bb.0: ## %entry892; ENABLE-NEXT: pushq %rbp893; ENABLE-NEXT: .cfi_def_cfa_offset 16894; ENABLE-NEXT: .cfi_offset %rbp, -16895; ENABLE-NEXT: movq %rsp, %rbp896; ENABLE-NEXT: .cfi_def_cfa_register %rbp897; ENABLE-NEXT: pushq %rbx898; ENABLE-NEXT: pushq %rax899; ENABLE-NEXT: .cfi_offset %rbx, -24900; ENABLE-NEXT: testb %al, %al901; ENABLE-NEXT: jne LBB11_5902; ENABLE-NEXT: ## %bb.1: ## %if.then903; ENABLE-NEXT: movq %rsp, %rax904; ENABLE-NEXT: addq $-16, %rax905; ENABLE-NEXT: movq %rax, %rsp906; ENABLE-NEXT: xorl %ecx, %ecx907; ENABLE-NEXT: jmp LBB11_2908; ENABLE-NEXT: .p2align 4909; ENABLE-NEXT: LBB11_4: ## %body2910; ENABLE-NEXT: ## in Loop: Header=BB11_2 Depth=1911; ENABLE-NEXT: ## InlineAsm Start912; ENABLE-NEXT: nop913; ENABLE-NEXT: ## InlineAsm End914; ENABLE-NEXT: movl $1, %ecx915; ENABLE-NEXT: LBB11_2: ## %for.body916; ENABLE-NEXT: ## =>This Inner Loop Header: Depth=1917; ENABLE-NEXT: movl %ecx, %edx918; ENABLE-NEXT: ## InlineAsm Start919; ENABLE-NEXT: movl $1, %ecx920; ENABLE-NEXT: ## InlineAsm End921; ENABLE-NEXT: addl %edx, %ecx922; ENABLE-NEXT: movl %ecx, (%rax)923; ENABLE-NEXT: testb %al, %al924; ENABLE-NEXT: jne LBB11_4925; ENABLE-NEXT: ## %bb.3: ## %body1926; ENABLE-NEXT: ## in Loop: Header=BB11_2 Depth=1927; ENABLE-NEXT: ## InlineAsm Start928; ENABLE-NEXT: nop929; ENABLE-NEXT: ## InlineAsm End930; ENABLE-NEXT: jmp LBB11_2931; ENABLE-NEXT: LBB11_5: ## %if.end932; ENABLE-NEXT: leaq -8(%rbp), %rsp933; ENABLE-NEXT: popq %rbx934; ENABLE-NEXT: popq %rbp935; ENABLE-NEXT: retq936;937; DISABLE-LABEL: infiniteloop2:938; DISABLE: ## %bb.0: ## %entry939; DISABLE-NEXT: pushq %rbp940; DISABLE-NEXT: .cfi_def_cfa_offset 16941; DISABLE-NEXT: .cfi_offset %rbp, -16942; DISABLE-NEXT: movq %rsp, %rbp943; DISABLE-NEXT: .cfi_def_cfa_register %rbp944; DISABLE-NEXT: pushq %rbx945; DISABLE-NEXT: pushq %rax946; DISABLE-NEXT: .cfi_offset %rbx, -24947; DISABLE-NEXT: testb %al, %al948; DISABLE-NEXT: jne LBB11_5949; DISABLE-NEXT: ## %bb.1: ## %if.then950; DISABLE-NEXT: movq %rsp, %rax951; DISABLE-NEXT: addq $-16, %rax952; DISABLE-NEXT: movq %rax, %rsp953; DISABLE-NEXT: xorl %ecx, %ecx954; DISABLE-NEXT: jmp LBB11_2955; DISABLE-NEXT: .p2align 4956; DISABLE-NEXT: LBB11_4: ## %body2957; DISABLE-NEXT: ## in Loop: Header=BB11_2 Depth=1958; DISABLE-NEXT: ## InlineAsm Start959; DISABLE-NEXT: nop960; DISABLE-NEXT: ## InlineAsm End961; DISABLE-NEXT: movl $1, %ecx962; DISABLE-NEXT: LBB11_2: ## %for.body963; DISABLE-NEXT: ## =>This Inner Loop Header: Depth=1964; DISABLE-NEXT: movl %ecx, %edx965; DISABLE-NEXT: ## InlineAsm Start966; DISABLE-NEXT: movl $1, %ecx967; DISABLE-NEXT: ## InlineAsm End968; DISABLE-NEXT: addl %edx, %ecx969; DISABLE-NEXT: movl %ecx, (%rax)970; DISABLE-NEXT: testb %al, %al971; DISABLE-NEXT: jne LBB11_4972; DISABLE-NEXT: ## %bb.3: ## %body1973; DISABLE-NEXT: ## in Loop: Header=BB11_2 Depth=1974; DISABLE-NEXT: ## InlineAsm Start975; DISABLE-NEXT: nop976; DISABLE-NEXT: ## InlineAsm End977; DISABLE-NEXT: jmp LBB11_2978; DISABLE-NEXT: LBB11_5: ## %if.end979; DISABLE-NEXT: leaq -8(%rbp), %rsp980; DISABLE-NEXT: popq %rbx981; DISABLE-NEXT: popq %rbp982; DISABLE-NEXT: retq983entry:984 br i1 poison, label %if.then, label %if.end985 986if.then:987 %ptr = alloca i32, i32 4988 br label %for.body989 990for.body: ; preds = %for.body, %entry991 %sum.03 = phi i32 [ 0, %if.then ], [ %add, %body1 ], [ 1, %body2]992 %call = tail call i32 asm "movl $$1, $0", "=r,~{ebx}"()993 %add = add nsw i32 %call, %sum.03994 store i32 %add, ptr %ptr995 br i1 poison, label %body1, label %body2996 997body1:998 tail call void asm sideeffect "nop", "~{ebx}"()999 br label %for.body1000 1001body2:1002 tail call void asm sideeffect "nop", "~{ebx}"()1003 br label %for.body1004 1005if.end:1006 ret void1007}1008 1009; Another infinite loop test this time with two nested infinite loop.1010define void @infiniteloop3() {1011; ENABLE-LABEL: infiniteloop3:1012; ENABLE: ## %bb.0: ## %entry1013; ENABLE-NEXT: testb %al, %al1014; ENABLE-NEXT: jne LBB12_21015; ENABLE-NEXT: ## %bb.1: ## %body1016; ENABLE-NEXT: testb %al, %al1017; ENABLE-NEXT: jne LBB12_71018; ENABLE-NEXT: LBB12_2: ## %loop2a.preheader1019; ENABLE-NEXT: xorl %eax, %eax1020; ENABLE-NEXT: xorl %ecx, %ecx1021; ENABLE-NEXT: movq %rax, %rsi1022; ENABLE-NEXT: jmp LBB12_41023; ENABLE-NEXT: .p2align 41024; ENABLE-NEXT: LBB12_3: ## %loop2b1025; ENABLE-NEXT: ## in Loop: Header=BB12_4 Depth=11026; ENABLE-NEXT: movq %rdx, (%rsi)1027; ENABLE-NEXT: movq %rdx, %rsi1028; ENABLE-NEXT: LBB12_4: ## %loop11029; ENABLE-NEXT: ## =>This Inner Loop Header: Depth=11030; ENABLE-NEXT: movq %rcx, %rdx1031; ENABLE-NEXT: testq %rax, %rax1032; ENABLE-NEXT: movq (%rax), %rcx1033; ENABLE-NEXT: jne LBB12_31034; ENABLE-NEXT: ## %bb.5: ## in Loop: Header=BB12_4 Depth=11035; ENABLE-NEXT: movq %rdx, %rax1036; ENABLE-NEXT: movq %rdx, %rsi1037; ENABLE-NEXT: jmp LBB12_41038; ENABLE-NEXT: LBB12_7: ## %end1039; ENABLE-NEXT: retq1040;1041; DISABLE-LABEL: infiniteloop3:1042; DISABLE: ## %bb.0: ## %entry1043; DISABLE-NEXT: testb %al, %al1044; DISABLE-NEXT: jne LBB12_21045; DISABLE-NEXT: ## %bb.1: ## %body1046; DISABLE-NEXT: testb %al, %al1047; DISABLE-NEXT: jne LBB12_71048; DISABLE-NEXT: LBB12_2: ## %loop2a.preheader1049; DISABLE-NEXT: xorl %eax, %eax1050; DISABLE-NEXT: xorl %ecx, %ecx1051; DISABLE-NEXT: movq %rax, %rsi1052; DISABLE-NEXT: jmp LBB12_41053; DISABLE-NEXT: .p2align 41054; DISABLE-NEXT: LBB12_3: ## %loop2b1055; DISABLE-NEXT: ## in Loop: Header=BB12_4 Depth=11056; DISABLE-NEXT: movq %rdx, (%rsi)1057; DISABLE-NEXT: movq %rdx, %rsi1058; DISABLE-NEXT: LBB12_4: ## %loop11059; DISABLE-NEXT: ## =>This Inner Loop Header: Depth=11060; DISABLE-NEXT: movq %rcx, %rdx1061; DISABLE-NEXT: testq %rax, %rax1062; DISABLE-NEXT: movq (%rax), %rcx1063; DISABLE-NEXT: jne LBB12_31064; DISABLE-NEXT: ## %bb.5: ## in Loop: Header=BB12_4 Depth=11065; DISABLE-NEXT: movq %rdx, %rax1066; DISABLE-NEXT: movq %rdx, %rsi1067; DISABLE-NEXT: jmp LBB12_41068; DISABLE-NEXT: LBB12_7: ## %end1069; DISABLE-NEXT: retq1070entry:1071 br i1 poison, label %loop2a, label %body1072 1073body: ; preds = %entry1074 br i1 poison, label %loop2a, label %end1075 1076loop1: ; preds = %loop2a, %loop2b1077 %var.phi = phi ptr [ %next.phi, %loop2b ], [ %var, %loop2a ]1078 %next.phi = phi ptr [ %next.load, %loop2b ], [ %next.var, %loop2a ]1079 %0 = icmp eq ptr %var, null1080 %next.load = load ptr, ptr undef1081 br i1 %0, label %loop2a, label %loop2b1082 1083loop2a: ; preds = %loop1, %body, %entry1084 %var = phi ptr [ null, %body ], [ null, %entry ], [ %next.phi, %loop1 ]1085 %next.var = phi ptr [ undef, %body ], [ null, %entry ], [ %next.load, %loop1 ]1086 br label %loop11087 1088loop2b: ; preds = %loop11089 store ptr %next.phi, ptr %var.phi1090 br label %loop11091 1092end:1093 ret void1094}1095 1096; Check that we just don't bail out on RegMask.1097; In this case, the RegMask does not touch a CSR so we are good to go!1098define i32 @regmask(i32 %a, i32 %b, ptr %addr) {1099; ENABLE-LABEL: regmask:1100; ENABLE: ## %bb.0:1101; ENABLE-NEXT: cmpl %esi, %edi1102; ENABLE-NEXT: jge LBB13_21103; ENABLE-NEXT: ## %bb.1: ## %true1104; ENABLE-NEXT: pushq %rbx1105; ENABLE-NEXT: .cfi_def_cfa_offset 161106; ENABLE-NEXT: .cfi_offset %rbx, -161107; ENABLE-NEXT: ## InlineAsm Start1108; ENABLE-NEXT: nop1109; ENABLE-NEXT: ## InlineAsm End1110; ENABLE-NEXT: xorl %edi, %edi1111; ENABLE-NEXT: movq %rdx, %rsi1112; ENABLE-NEXT: callq _doSomething1113; ENABLE-NEXT: popq %rbx1114; ENABLE-NEXT: retq1115; ENABLE-NEXT: LBB13_2: ## %false1116; ENABLE-NEXT: movl $6, %edi1117; ENABLE-NEXT: movq %rdx, %rsi1118; ENABLE-NEXT: jmp _doSomething ## TAILCALL1119;1120; DISABLE-LABEL: regmask:1121; DISABLE: ## %bb.0:1122; DISABLE-NEXT: pushq %rbx1123; DISABLE-NEXT: .cfi_def_cfa_offset 161124; DISABLE-NEXT: .cfi_offset %rbx, -161125; DISABLE-NEXT: cmpl %esi, %edi1126; DISABLE-NEXT: jge LBB13_21127; DISABLE-NEXT: ## %bb.1: ## %true1128; DISABLE-NEXT: ## InlineAsm Start1129; DISABLE-NEXT: nop1130; DISABLE-NEXT: ## InlineAsm End1131; DISABLE-NEXT: xorl %edi, %edi1132; DISABLE-NEXT: movq %rdx, %rsi1133; DISABLE-NEXT: callq _doSomething1134; DISABLE-NEXT: popq %rbx1135; DISABLE-NEXT: retq1136; DISABLE-NEXT: LBB13_2: ## %false1137; DISABLE-NEXT: movl $6, %edi1138; DISABLE-NEXT: movq %rdx, %rsi1139; DISABLE-NEXT: popq %rbx1140; DISABLE-NEXT: jmp _doSomething ## TAILCALL1141 %tmp2 = icmp slt i32 %a, %b1142 br i1 %tmp2, label %true, label %false1143 1144true:1145 ; Clobber a CSR so that we check something on the regmask1146 ; of the tail call.1147 tail call void asm sideeffect "nop", "~{ebx}"()1148 %tmp4 = call i32 @doSomething(i32 0, ptr %addr)1149 br label %end1150 1151false:1152 %tmp5 = tail call i32 @doSomething(i32 6, ptr %addr)1153 br label %end1154 1155end:1156 %tmp.0 = phi i32 [ %tmp4, %true ], [ %tmp5, %false ]1157 ret i32 %tmp.01158}1159 1160@b = internal unnamed_addr global i1 false1161@c = internal unnamed_addr global i8 0, align 11162@a = common global i32 0, align 41163 1164; Make sure the prologue does not clobber the EFLAGS when1165; it is live accross.1166; PR25629.1167; Note: The registers may change in the following patterns, but1168; because they imply register hierarchy (e.g., eax, al) this is1169; tricky to write robust patterns.1170define i32 @useLEAForPrologue(i32 %d, i32 %a, i8 %c) #3 {1171; ENABLE-LABEL: useLEAForPrologue:1172; ENABLE: ## %bb.0: ## %entry1173; ENABLE-NEXT: pushq %rbx1174; ENABLE-NEXT: subq $16, %rsp1175; ENABLE-NEXT: xorl %eax, %eax1176; ENABLE-NEXT: cmpb $0, _b(%rip)1177; ENABLE-NEXT: movl $48, %ecx1178; ENABLE-NEXT: cmovnel %eax, %ecx1179; ENABLE-NEXT: movb %cl, _c(%rip)1180; ENABLE-NEXT: je LBB14_41181; ENABLE-NEXT: ## %bb.1: ## %for.body.lr.ph1182; ENABLE-NEXT: ## InlineAsm Start1183; ENABLE-NEXT: nop1184; ENABLE-NEXT: ## InlineAsm End1185; ENABLE-NEXT: .p2align 41186; ENABLE-NEXT: LBB14_2: ## %for.body1187; ENABLE-NEXT: ## =>This Inner Loop Header: Depth=11188; ENABLE-NEXT: cmpl %esi, %edi1189; ENABLE-NEXT: setl %al1190; ENABLE-NEXT: xorl %esi, %esi1191; ENABLE-NEXT: movb %al, %sil1192; ENABLE-NEXT: incb %dl1193; ENABLE-NEXT: cmpb $45, %dl1194; ENABLE-NEXT: jl LBB14_21195; ENABLE-NEXT: ## %bb.3: ## %for.cond.for.end_crit_edge1196; ENABLE-NEXT: movq _a@GOTPCREL(%rip), %rax1197; ENABLE-NEXT: movl %esi, (%rax)1198; ENABLE-NEXT: LBB14_4: ## %for.end1199; ENABLE-NEXT: xorl %edi, %edi1200; ENABLE-NEXT: callq _varfunc1201; ENABLE-NEXT: xorl %eax, %eax1202; ENABLE-NEXT: addq $16, %rsp1203; ENABLE-NEXT: popq %rbx1204; ENABLE-NEXT: retq1205;1206; DISABLE-LABEL: useLEAForPrologue:1207; DISABLE: ## %bb.0: ## %entry1208; DISABLE-NEXT: pushq %rbx1209; DISABLE-NEXT: subq $16, %rsp1210; DISABLE-NEXT: xorl %eax, %eax1211; DISABLE-NEXT: cmpb $0, _b(%rip)1212; DISABLE-NEXT: movl $48, %ecx1213; DISABLE-NEXT: cmovnel %eax, %ecx1214; DISABLE-NEXT: movb %cl, _c(%rip)1215; DISABLE-NEXT: je LBB14_41216; DISABLE-NEXT: ## %bb.1: ## %for.body.lr.ph1217; DISABLE-NEXT: ## InlineAsm Start1218; DISABLE-NEXT: nop1219; DISABLE-NEXT: ## InlineAsm End1220; DISABLE-NEXT: .p2align 41221; DISABLE-NEXT: LBB14_2: ## %for.body1222; DISABLE-NEXT: ## =>This Inner Loop Header: Depth=11223; DISABLE-NEXT: cmpl %esi, %edi1224; DISABLE-NEXT: setl %al1225; DISABLE-NEXT: xorl %esi, %esi1226; DISABLE-NEXT: movb %al, %sil1227; DISABLE-NEXT: incb %dl1228; DISABLE-NEXT: cmpb $45, %dl1229; DISABLE-NEXT: jl LBB14_21230; DISABLE-NEXT: ## %bb.3: ## %for.cond.for.end_crit_edge1231; DISABLE-NEXT: movq _a@GOTPCREL(%rip), %rax1232; DISABLE-NEXT: movl %esi, (%rax)1233; DISABLE-NEXT: LBB14_4: ## %for.end1234; DISABLE-NEXT: xorl %edi, %edi1235; DISABLE-NEXT: callq _varfunc1236; DISABLE-NEXT: xorl %eax, %eax1237; DISABLE-NEXT: addq $16, %rsp1238; DISABLE-NEXT: popq %rbx1239; DISABLE-NEXT: retq1240entry:1241 %tmp = alloca i31242 %.b = load i1, ptr @b, align 11243 %bool = select i1 %.b, i8 0, i8 481244 store i8 %bool, ptr @c, align 11245 br i1 %.b, label %for.body.lr.ph, label %for.end1246 1247for.body.lr.ph: ; preds = %entry1248 tail call void asm sideeffect "nop", "~{ebx}"()1249 br label %for.body1250 1251for.body: ; preds = %for.body.lr.ph, %for.body1252 %inc6 = phi i8 [ %c, %for.body.lr.ph ], [ %inc, %for.body ]1253 %cond5 = phi i32 [ %a, %for.body.lr.ph ], [ %conv3, %for.body ]1254 %cmp2 = icmp slt i32 %d, %cond51255 %conv3 = zext i1 %cmp2 to i321256 %inc = add i8 %inc6, 11257 %cmp = icmp slt i8 %inc, 451258 br i1 %cmp, label %for.body, label %for.cond.for.end_crit_edge1259 1260for.cond.for.end_crit_edge: ; preds = %for.body1261 store i32 %conv3, ptr @a, align 41262 br label %for.end1263 1264for.end: ; preds = %for.cond.for.end_crit_edge, %entry1265 %call = tail call i32 (ptr) @varfunc(ptr null)1266 ret i32 01267}1268 1269declare i32 @varfunc(ptr nocapture readonly)1270 1271@sum1 = external hidden thread_local global i32, align 41272 1273 1274; Function Attrs: nounwind1275; Make sure the TLS call used to access @sum1 happens after the prologue1276; and before the epilogue.1277; TLS calls used to be wrongly model and shrink-wrapping would have inserted1278; the prologue and epilogue just around the call to doSomething.1279; PR25820.1280define i32 @tlsCall(i1 %bool1, i32 %arg, ptr readonly dereferenceable(4) %sum1) #3 {1281; ENABLE-LABEL: tlsCall:1282; ENABLE: ## %bb.0: ## %entry1283; ENABLE-NEXT: pushq %rax1284; ENABLE-NEXT: testb $1, %dil1285; ENABLE-NEXT: je LBB15_21286; ENABLE-NEXT: ## %bb.1: ## %main1287; ENABLE-NEXT: movl (%rdx), %ecx1288; ENABLE-NEXT: movq _sum1@TLVP(%rip), %rdi1289; ENABLE-NEXT: callq *(%rdi)1290; ENABLE-NEXT: movl %ecx, (%rax)1291; ENABLE-NEXT: jmp LBB15_31292; ENABLE-NEXT: LBB15_2: ## %else1293; ENABLE-NEXT: xorl %edi, %edi1294; ENABLE-NEXT: xorl %esi, %esi1295; ENABLE-NEXT: callq _doSomething1296; ENABLE-NEXT: movl %eax, %esi1297; ENABLE-NEXT: LBB15_3: ## %exit1298; ENABLE-NEXT: movl %esi, %eax1299; ENABLE-NEXT: popq %rcx1300; ENABLE-NEXT: retq1301;1302; DISABLE-LABEL: tlsCall:1303; DISABLE: ## %bb.0: ## %entry1304; DISABLE-NEXT: pushq %rax1305; DISABLE-NEXT: testb $1, %dil1306; DISABLE-NEXT: je LBB15_21307; DISABLE-NEXT: ## %bb.1: ## %main1308; DISABLE-NEXT: movl (%rdx), %ecx1309; DISABLE-NEXT: movq _sum1@TLVP(%rip), %rdi1310; DISABLE-NEXT: callq *(%rdi)1311; DISABLE-NEXT: movl %ecx, (%rax)1312; DISABLE-NEXT: jmp LBB15_31313; DISABLE-NEXT: LBB15_2: ## %else1314; DISABLE-NEXT: xorl %edi, %edi1315; DISABLE-NEXT: xorl %esi, %esi1316; DISABLE-NEXT: callq _doSomething1317; DISABLE-NEXT: movl %eax, %esi1318; DISABLE-NEXT: LBB15_3: ## %exit1319; DISABLE-NEXT: movl %esi, %eax1320; DISABLE-NEXT: popq %rcx1321; DISABLE-NEXT: retq1322entry:1323 br i1 %bool1, label %main, label %else1324 1325main:1326 %tmp1 = load i32, ptr %sum1, align 41327 store i32 %tmp1, ptr @sum1, align 41328 br label %exit1329 1330else:1331 %call = call i32 @doSomething(i32 0, ptr null)1332 br label %exit1333 1334exit:1335 %res = phi i32 [ %arg, %main], [ %call, %else ]1336 ret i32 %res1337}1338 1339attributes #3 = { nounwind }1340 1341@irreducibleCFGa = common global i32 0, align 41342@irreducibleCFGf = common global i8 0, align 11343@irreducibleCFGb = common global i32 0, align 41344 1345; Check that we do not run shrink-wrapping on irreducible CFGs until1346; it is actually supported.1347; At the moment, on those CFGs the loop information may be incorrect1348; and since we use that information to do the placement, we may end up1349; inserting the prologue/epilogue at incorrect places.1350; PR25988.1351; Make sure we emit missed optimization remarks for this.1352; REMARKS: Pass: shrink-wrap1353; REMARKS-NEXT: Name: UnsupportedIrreducibleCFG1354; REMARKS-NEXT: Function: irreducibleCFG1355; REMARKS-NEXT: Args:1356; REMARKS-NEXT: - String: Irreducible CFGs are not supported yet1357 1358define i32 @irreducibleCFG() #4 {1359; ENABLE-LABEL: irreducibleCFG:1360; ENABLE: ## %bb.0: ## %entry1361; ENABLE-NEXT: pushq %rbp1362; ENABLE-NEXT: .cfi_def_cfa_offset 161363; ENABLE-NEXT: .cfi_offset %rbp, -161364; ENABLE-NEXT: movq %rsp, %rbp1365; ENABLE-NEXT: .cfi_def_cfa_register %rbp1366; ENABLE-NEXT: pushq %rbx1367; ENABLE-NEXT: pushq %rax1368; ENABLE-NEXT: .cfi_offset %rbx, -241369; ENABLE-NEXT: movq _irreducibleCFGf@GOTPCREL(%rip), %rax1370; ENABLE-NEXT: cmpb $0, (%rax)1371; ENABLE-NEXT: je LBB16_21372; ENABLE-NEXT: .p2align 41373; ENABLE-NEXT: LBB16_1: ## %preheader1374; ENABLE-NEXT: ## =>This Inner Loop Header: Depth=11375; ENABLE-NEXT: jmp LBB16_11376; ENABLE-NEXT: LBB16_2: ## %split1377; ENABLE-NEXT: movq _irreducibleCFGb@GOTPCREL(%rip), %rax1378; ENABLE-NEXT: cmpl $0, (%rax)1379; ENABLE-NEXT: je LBB16_31380; ENABLE-NEXT: ## %bb.4: ## %for.body4.i1381; ENABLE-NEXT: movq _irreducibleCFGa@GOTPCREL(%rip), %rax1382; ENABLE-NEXT: movl (%rax), %edi1383; ENABLE-NEXT: xorl %ebx, %ebx1384; ENABLE-NEXT: xorl %eax, %eax1385; ENABLE-NEXT: callq _something1386; ENABLE-NEXT: jmp LBB16_51387; ENABLE-NEXT: LBB16_3:1388; ENABLE-NEXT: xorl %ebx, %ebx1389; ENABLE-NEXT: .p2align 41390; ENABLE-NEXT: LBB16_5: ## %for.inc1391; ENABLE-NEXT: ## =>This Inner Loop Header: Depth=11392; ENABLE-NEXT: incl %ebx1393; ENABLE-NEXT: cmpl $7, %ebx1394; ENABLE-NEXT: jl LBB16_51395; ENABLE-NEXT: ## %bb.6: ## %fn1.exit1396; ENABLE-NEXT: xorl %eax, %eax1397; ENABLE-NEXT: addq $8, %rsp1398; ENABLE-NEXT: popq %rbx1399; ENABLE-NEXT: popq %rbp1400; ENABLE-NEXT: retq1401;1402; DISABLE-LABEL: irreducibleCFG:1403; DISABLE: ## %bb.0: ## %entry1404; DISABLE-NEXT: pushq %rbp1405; DISABLE-NEXT: .cfi_def_cfa_offset 161406; DISABLE-NEXT: .cfi_offset %rbp, -161407; DISABLE-NEXT: movq %rsp, %rbp1408; DISABLE-NEXT: .cfi_def_cfa_register %rbp1409; DISABLE-NEXT: pushq %rbx1410; DISABLE-NEXT: pushq %rax1411; DISABLE-NEXT: .cfi_offset %rbx, -241412; DISABLE-NEXT: movq _irreducibleCFGf@GOTPCREL(%rip), %rax1413; DISABLE-NEXT: cmpb $0, (%rax)1414; DISABLE-NEXT: je LBB16_21415; DISABLE-NEXT: .p2align 41416; DISABLE-NEXT: LBB16_1: ## %preheader1417; DISABLE-NEXT: ## =>This Inner Loop Header: Depth=11418; DISABLE-NEXT: jmp LBB16_11419; DISABLE-NEXT: LBB16_2: ## %split1420; DISABLE-NEXT: movq _irreducibleCFGb@GOTPCREL(%rip), %rax1421; DISABLE-NEXT: cmpl $0, (%rax)1422; DISABLE-NEXT: je LBB16_31423; DISABLE-NEXT: ## %bb.4: ## %for.body4.i1424; DISABLE-NEXT: movq _irreducibleCFGa@GOTPCREL(%rip), %rax1425; DISABLE-NEXT: movl (%rax), %edi1426; DISABLE-NEXT: xorl %ebx, %ebx1427; DISABLE-NEXT: xorl %eax, %eax1428; DISABLE-NEXT: callq _something1429; DISABLE-NEXT: jmp LBB16_51430; DISABLE-NEXT: LBB16_3:1431; DISABLE-NEXT: xorl %ebx, %ebx1432; DISABLE-NEXT: .p2align 41433; DISABLE-NEXT: LBB16_5: ## %for.inc1434; DISABLE-NEXT: ## =>This Inner Loop Header: Depth=11435; DISABLE-NEXT: incl %ebx1436; DISABLE-NEXT: cmpl $7, %ebx1437; DISABLE-NEXT: jl LBB16_51438; DISABLE-NEXT: ## %bb.6: ## %fn1.exit1439; DISABLE-NEXT: xorl %eax, %eax1440; DISABLE-NEXT: addq $8, %rsp1441; DISABLE-NEXT: popq %rbx1442; DISABLE-NEXT: popq %rbp1443; DISABLE-NEXT: retq1444entry:1445 %i0 = load i32, ptr @irreducibleCFGa, align 41446 %.pr = load i8, ptr @irreducibleCFGf, align 11447 %bool = icmp eq i8 %.pr, 01448 br i1 %bool, label %split, label %preheader1449 1450preheader:1451 br label %preheader1452 1453split:1454 %i1 = load i32, ptr @irreducibleCFGb, align 41455 %tobool1.i = icmp ne i32 %i1, 01456 br i1 %tobool1.i, label %for.body4.i, label %for.cond8.i.preheader1457 1458for.body4.i:1459 %call.i = tail call i32 (...) @something(i32 %i0)1460 br label %for.cond81461 1462for.cond8:1463 %p1 = phi i32 [ %inc18.i, %for.inc ], [ 0, %for.body4.i ]1464 %.pr1.pr = load i32, ptr @irreducibleCFGb, align 41465 br label %for.cond8.i.preheader1466 1467for.cond8.i.preheader:1468 %.pr1 = phi i32 [ %.pr1.pr, %for.cond8 ], [ %i1, %split ]1469 %p13 = phi i32 [ %p1, %for.cond8 ], [ 0, %split ]1470 br label %for.inc1471 1472fn1.exit:1473 ret i32 01474 1475for.inc:1476 %inc18.i = add nuw nsw i32 %p13, 11477 %cmp = icmp slt i32 %inc18.i, 71478 br i1 %cmp, label %for.cond8, label %fn1.exit1479}1480 1481attributes #4 = { "frame-pointer"="all" }1482 1483@x = external global i32, align 41484@y = external global i32, align 41485 1486; The post-dominator tree does not include the branch containing the infinite1487; loop, which can occur into a misplacement of the restore block, if we're1488; looking for the nearest common post-dominator of an "unreachable" block.1489 1490define void @infiniteLoopNoSuccessor() #5 {1491; ENABLE-LABEL: infiniteLoopNoSuccessor:1492; ENABLE: ## %bb.0:1493; ENABLE-NEXT: pushq %rbp1494; ENABLE-NEXT: movq %rsp, %rbp1495; ENABLE-NEXT: movq _x@GOTPCREL(%rip), %rax1496; ENABLE-NEXT: cmpl $0, (%rax)1497; ENABLE-NEXT: je LBB17_21498; ENABLE-NEXT: ## %bb.1:1499; ENABLE-NEXT: movl $0, (%rax)1500; ENABLE-NEXT: LBB17_2:1501; ENABLE-NEXT: xorl %eax, %eax1502; ENABLE-NEXT: callq _somethingElse1503; ENABLE-NEXT: movq _y@GOTPCREL(%rip), %rax1504; ENABLE-NEXT: cmpl $0, (%rax)1505; ENABLE-NEXT: je LBB17_31506; ENABLE-NEXT: ## %bb.5:1507; ENABLE-NEXT: popq %rbp1508; ENABLE-NEXT: retq1509; ENABLE-NEXT: LBB17_3:1510; ENABLE-NEXT: xorl %eax, %eax1511; ENABLE-NEXT: callq _something1512; ENABLE-NEXT: .p2align 41513; ENABLE-NEXT: LBB17_4: ## =>This Inner Loop Header: Depth=11514; ENABLE-NEXT: xorl %eax, %eax1515; ENABLE-NEXT: callq _somethingElse1516; ENABLE-NEXT: jmp LBB17_41517;1518; DISABLE-LABEL: infiniteLoopNoSuccessor:1519; DISABLE: ## %bb.0:1520; DISABLE-NEXT: pushq %rbp1521; DISABLE-NEXT: movq %rsp, %rbp1522; DISABLE-NEXT: movq _x@GOTPCREL(%rip), %rax1523; DISABLE-NEXT: cmpl $0, (%rax)1524; DISABLE-NEXT: je LBB17_21525; DISABLE-NEXT: ## %bb.1:1526; DISABLE-NEXT: movl $0, (%rax)1527; DISABLE-NEXT: LBB17_2:1528; DISABLE-NEXT: xorl %eax, %eax1529; DISABLE-NEXT: callq _somethingElse1530; DISABLE-NEXT: movq _y@GOTPCREL(%rip), %rax1531; DISABLE-NEXT: cmpl $0, (%rax)1532; DISABLE-NEXT: je LBB17_31533; DISABLE-NEXT: ## %bb.5:1534; DISABLE-NEXT: popq %rbp1535; DISABLE-NEXT: retq1536; DISABLE-NEXT: LBB17_3:1537; DISABLE-NEXT: xorl %eax, %eax1538; DISABLE-NEXT: callq _something1539; DISABLE-NEXT: .p2align 41540; DISABLE-NEXT: LBB17_4: ## =>This Inner Loop Header: Depth=11541; DISABLE-NEXT: xorl %eax, %eax1542; DISABLE-NEXT: callq _somethingElse1543; DISABLE-NEXT: jmp LBB17_41544 %1 = load i32, ptr @x, align 41545 %2 = icmp ne i32 %1, 01546 br i1 %2, label %3, label %41547 1548; <label>:3:1549 store i32 0, ptr @x, align 41550 br label %41551 1552; <label>:4:1553 call void (...) @somethingElse()1554 %5 = load i32, ptr @y, align 41555 %6 = icmp ne i32 %5, 01556 br i1 %6, label %10, label %71557 1558; <label>:7:1559 %8 = call i32 (...) @something()1560 br label %91561 1562; <label>:9:1563 call void (...) @somethingElse()1564 br label %91565 1566; <label>:10:1567 ret void1568}1569 1570declare void @somethingElse(...)1571 1572attributes #5 = { nounwind "frame-pointer"="non-leaf" }1573