brintos

brintos / llvm-project-archived public Read only

0
0
Text · 51.7 KiB · 37620ec Raw
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