brintos

brintos / llvm-project-archived public Read only

0
0
Text · 72.6 KiB · 6bcffa2 Raw
2200 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc %s -o - -enable-shrink-wrap=true -ifcvt-fn-start=1 -ifcvt-fn-stop=0 -mtriple=armv7-apple-ios \3; RUN:      | FileCheck %s --check-prefix=ARM-ENABLE4; RUN: llc %s -o - -enable-shrink-wrap=false -ifcvt-fn-start=1 -ifcvt-fn-stop=0 -mtriple=armv7-apple-ios \5; RUN:      | FileCheck %s --check-prefix=ARM-DISABLE6; RUN: llc %s -o - -enable-shrink-wrap=true -ifcvt-fn-start=1 -ifcvt-fn-stop=0 -mtriple=thumbv7-apple-ios \7; RUN:      | FileCheck %s --check-prefix=THUMB-ENABLE8; RUN: llc %s -o - -enable-shrink-wrap=false -ifcvt-fn-start=1 -ifcvt-fn-stop=0 -mtriple=thumbv7-apple-ios \9; RUN:      | FileCheck %s --check-prefix=THUMB-DISABLE10 11;12; Note: Lots of tests use inline asm instead of regular calls.13; This allows to have a better control on what the allocation will do.14; Otherwise, we may have spill right in the entry block, defeating15; shrink-wrapping. Moreover, some of the inline asm statements (nop)16; are here to ensure that the related paths do not end up as critical17; edges.18; Also disable the late if-converter as it makes harder to reason on19; the diffs.20 21; Initial motivating example: Simple diamond with a call just on one side.22; foo:23;24; Compare the arguments and jump to exit.25; No prologue needed.26; cmp r0, r127; bge [[EXIT_LABEL:LBB[0-9_]+]]28;29; Prologue code.30; push {r7, lr}31; mov r7, sp32;;33; Compare the arguments and jump to exit.34; After the prologue is set.35; sub sp36; cmp r0, r137; bge [[EXIT_LABEL:LBB[0-9_]+]]38;39; Store %a in the alloca.40; push {r0}41; str r0, [sp, #-4]42; str r0, [sp]43; Set the alloca address in the second argument.44; mov r1, sp45; Set the first argument to zero.46; mov{{s?}} r0, #047; bl{{x?}} _doSomething48;49; With shrink-wrapping, epilogue is just after the call.50; mov sp, r751; add sp, #452; pop{{(\.w)?}} {r7, lr}53;54; [[EXIT_LABEL]]:55;56; Without shrink-wrapping, epilogue is in the exit block.57; Epilogue code. (What we pop does not matter.)58; mov sp, r759; add sp,60; pop {r7, pc}61;62; bx lr63define i32 @foo(i32 %a, i32 %b) "frame-pointer"="all" {64; ARM-ENABLE-LABEL: foo:65; ARM-ENABLE:       Lfunc_begin0:66; ARM-ENABLE-NEXT:  @ %bb.0:67; ARM-ENABLE-NEXT:    cmp r0, r168; ARM-ENABLE-NEXT:    bge LBB0_269; ARM-ENABLE-NEXT:  @ %bb.1: @ %true70; ARM-ENABLE-NEXT:    push {r7, lr}71; ARM-ENABLE-NEXT:    mov r7, sp72; ARM-ENABLE-NEXT:    push {r0}73; ARM-ENABLE-NEXT:    mov r1, sp74; ARM-ENABLE-NEXT:    mov r0, #075; ARM-ENABLE-NEXT:    bl _doSomething76; ARM-ENABLE-NEXT:    mov sp, r777; ARM-ENABLE-NEXT:    pop {r7, lr}78; ARM-ENABLE-NEXT:  LBB0_2: @ %false79; ARM-ENABLE-NEXT:    bx lr80; ARM-ENABLE-NEXT:  Lfunc_end0:81;82; ARM-DISABLE-LABEL: foo:83; ARM-DISABLE:       Lfunc_begin0:84; ARM-DISABLE-NEXT:  @ %bb.0:85; ARM-DISABLE-NEXT:    push {r7, lr}86; ARM-DISABLE-NEXT:    mov r7, sp87; ARM-DISABLE-NEXT:    sub sp, sp, #488; ARM-DISABLE-NEXT:    cmp r0, r189; ARM-DISABLE-NEXT:    bge LBB0_290; ARM-DISABLE-NEXT:  @ %bb.1: @ %true91; ARM-DISABLE-NEXT:    str r0, [sp]92; ARM-DISABLE-NEXT:    mov r1, sp93; ARM-DISABLE-NEXT:    mov r0, #094; ARM-DISABLE-NEXT:    bl _doSomething95; ARM-DISABLE-NEXT:  LBB0_2: @ %false96; ARM-DISABLE-NEXT:    mov sp, r797; ARM-DISABLE-NEXT:    pop {r7, pc}98; ARM-DISABLE-NEXT:  Lfunc_end0:99;100; THUMB-ENABLE-LABEL: foo:101; THUMB-ENABLE:       Lfunc_begin0:102; THUMB-ENABLE-NEXT:  @ %bb.0:103; THUMB-ENABLE-NEXT:    cmp r0, r1104; THUMB-ENABLE-NEXT:    bge LBB0_2105; THUMB-ENABLE-NEXT:  @ %bb.1: @ %true106; THUMB-ENABLE-NEXT:    push {r7, lr}107; THUMB-ENABLE-NEXT:    mov r7, sp108; THUMB-ENABLE-NEXT:    str r0, [sp, #-4]!109; THUMB-ENABLE-NEXT:    mov r1, sp110; THUMB-ENABLE-NEXT:    movs r0, #0111; THUMB-ENABLE-NEXT:    bl _doSomething112; THUMB-ENABLE-NEXT:    add sp, #4113; THUMB-ENABLE-NEXT:    pop.w {r7, lr}114; THUMB-ENABLE-NEXT:  LBB0_2: @ %false115; THUMB-ENABLE-NEXT:    bx lr116; THUMB-ENABLE-NEXT:  Lfunc_end0:117;118; THUMB-DISABLE-LABEL: foo:119; THUMB-DISABLE:       Lfunc_begin0:120; THUMB-DISABLE-NEXT:  @ %bb.0:121; THUMB-DISABLE-NEXT:    push {r7, lr}122; THUMB-DISABLE-NEXT:    mov r7, sp123; THUMB-DISABLE-NEXT:    sub sp, #4124; THUMB-DISABLE-NEXT:    cmp r0, r1125; THUMB-DISABLE-NEXT:    bge LBB0_2126; THUMB-DISABLE-NEXT:  @ %bb.1: @ %true127; THUMB-DISABLE-NEXT:    str r0, [sp]128; THUMB-DISABLE-NEXT:    mov r1, sp129; THUMB-DISABLE-NEXT:    movs r0, #0130; THUMB-DISABLE-NEXT:    bl _doSomething131; THUMB-DISABLE-NEXT:  LBB0_2: @ %false132; THUMB-DISABLE-NEXT:    add sp, #4133; THUMB-DISABLE-NEXT:    pop {r7, pc}134; THUMB-DISABLE-NEXT:  Lfunc_end0:135  %tmp = alloca i32, align 4136  %tmp2 = icmp slt i32 %a, %b137  br i1 %tmp2, label %true, label %false138 139true:140  store i32 %a, ptr %tmp, align 4141  %tmp4 = call i32 @doSomething(i32 0, ptr %tmp)142  br label %false143 144false:145  %tmp.0 = phi i32 [ %tmp4, %true ], [ %a, %0 ]146  ret i32 %tmp.0147}148 149; Function Attrs: optsize150declare i32 @doSomething(i32, ptr)151 152 153; Check that we do not perform the restore inside the loop whereas the save154; is outside.155; freqSaveAndRestoreOutsideLoop:156;157; Shrink-wrapping allows to skip the prologue in the else case.158; cmp r0, #0159; beq [[ELSE_LABEL:LBB[0-9_]+]]160; cbz r0, [[ELSE_LABEL:LBB[0-9_]+]]161;162; Prologue code.163; Make sure we save the CSR used in the inline asm: r4.164; push {r4, r7, lr}165; add r7, sp, #4166;167; cmp r0, #0168; beq [[ELSE_LABEL:LBB[0-9_]+]]169; cbz r0, [[ELSE_LABEL:LBB[0-9_]+]]170;171; SUM is in r0 because it is coalesced with the second172; argument on the else path.173; mov{{s?}} [[SUM:r0]], #0174; mov{{s?}} [[IV:r[0-9]+]], #10175;176; Next BB.177; [[LOOP:LBB[0-9_]+]]: @ %for.body178; mov{{(\.w)?}} [[TMP:r[0-9]+]], #1179; add [[SUM]], [[TMP]], [[SUM]]180; add [[SUM]], [[TMP]]181; subs [[IV]], [[IV]], #1182; subs [[IV]], #1183; bne [[LOOP]]184;185; Next BB.186; SUM << 3.187; lsl{{s?}} [[SUM]], [[SUM]], #3188; pop {r4, r7, pc}189;190; Duplicated epilogue.191; pop {r4, r7, pc}192;193; [[ELSE_LABEL]]: @ %if.else194; Shift second argument by one and store into returned register.195; lsl{{s?}} r0, r1, #1196; pop {r4, r7, pc}197;198; bx lr199define i32 @freqSaveAndRestoreOutsideLoop(i32 %cond, i32 %N) "frame-pointer"="all" {200; ARM-ENABLE-LABEL: freqSaveAndRestoreOutsideLoop:201; ARM-ENABLE:       Lfunc_begin1:202; ARM-ENABLE-NEXT:  @ %bb.0: @ %entry203; ARM-ENABLE-NEXT:    cmp r0, #0204; ARM-ENABLE-NEXT:    beq LBB1_4205; ARM-ENABLE-NEXT:  @ %bb.1: @ %for.preheader206; ARM-ENABLE-NEXT:    push {r4, r7, lr}207; ARM-ENABLE-NEXT:    add r7, sp, #4208; ARM-ENABLE-NEXT:    mov r0, #0209; ARM-ENABLE-NEXT:    mov r1, #10210; ARM-ENABLE-NEXT:    @ InlineAsm Start211; ARM-ENABLE-NEXT:    nop212; ARM-ENABLE-NEXT:    @ InlineAsm End213; ARM-ENABLE-NEXT:  LBB1_2: @ %for.body214; ARM-ENABLE-NEXT:    @ =>This Inner Loop Header: Depth=1215; ARM-ENABLE-NEXT:    @ InlineAsm Start216; ARM-ENABLE-NEXT:    mov r2, #1217; ARM-ENABLE-NEXT:    @ InlineAsm End218; ARM-ENABLE-NEXT:    add r0, r2, r0219; ARM-ENABLE-NEXT:    subs r1, r1, #1220; ARM-ENABLE-NEXT:    bne LBB1_2221; ARM-ENABLE-NEXT:  @ %bb.3: @ %for.end222; ARM-ENABLE-NEXT:    lsl r0, r0, #3223; ARM-ENABLE-NEXT:    pop {r4, r7, pc}224; ARM-ENABLE-NEXT:  LBB1_4: @ %if.else225; ARM-ENABLE-NEXT:    lsl r0, r1, #1226; ARM-ENABLE-NEXT:    bx lr227; ARM-ENABLE-NEXT:  Lfunc_end1:228;229; ARM-DISABLE-LABEL: freqSaveAndRestoreOutsideLoop:230; ARM-DISABLE:       Lfunc_begin1:231; ARM-DISABLE-NEXT:  @ %bb.0: @ %entry232; ARM-DISABLE-NEXT:    push {r4, r7, lr}233; ARM-DISABLE-NEXT:    add r7, sp, #4234; ARM-DISABLE-NEXT:    cmp r0, #0235; ARM-DISABLE-NEXT:    beq LBB1_4236; ARM-DISABLE-NEXT:  @ %bb.1: @ %for.preheader237; ARM-DISABLE-NEXT:    mov r0, #0238; ARM-DISABLE-NEXT:    mov r1, #10239; ARM-DISABLE-NEXT:    @ InlineAsm Start240; ARM-DISABLE-NEXT:    nop241; ARM-DISABLE-NEXT:    @ InlineAsm End242; ARM-DISABLE-NEXT:  LBB1_2: @ %for.body243; ARM-DISABLE-NEXT:    @ =>This Inner Loop Header: Depth=1244; ARM-DISABLE-NEXT:    @ InlineAsm Start245; ARM-DISABLE-NEXT:    mov r2, #1246; ARM-DISABLE-NEXT:    @ InlineAsm End247; ARM-DISABLE-NEXT:    add r0, r2, r0248; ARM-DISABLE-NEXT:    subs r1, r1, #1249; ARM-DISABLE-NEXT:    bne LBB1_2250; ARM-DISABLE-NEXT:  @ %bb.3: @ %for.end251; ARM-DISABLE-NEXT:    lsl r0, r0, #3252; ARM-DISABLE-NEXT:    pop {r4, r7, pc}253; ARM-DISABLE-NEXT:  LBB1_4: @ %if.else254; ARM-DISABLE-NEXT:    lsl r0, r1, #1255; ARM-DISABLE-NEXT:    pop {r4, r7, pc}256; ARM-DISABLE-NEXT:  Lfunc_end1:257;258; THUMB-ENABLE-LABEL: freqSaveAndRestoreOutsideLoop:259; THUMB-ENABLE:       Lfunc_begin1:260; THUMB-ENABLE-NEXT:  @ %bb.0: @ %entry261; THUMB-ENABLE-NEXT:    cbz r0, LBB1_4262; THUMB-ENABLE-NEXT:  @ %bb.1: @ %for.preheader263; THUMB-ENABLE-NEXT:    push {r4, r7, lr}264; THUMB-ENABLE-NEXT:    add r7, sp, #4265; THUMB-ENABLE-NEXT:    movs r0, #0266; THUMB-ENABLE-NEXT:    movs r1, #10267; THUMB-ENABLE-NEXT:    @ InlineAsm Start268; THUMB-ENABLE-NEXT:    nop269; THUMB-ENABLE-NEXT:    @ InlineAsm End270; THUMB-ENABLE-NEXT:  LBB1_2: @ %for.body271; THUMB-ENABLE-NEXT:    @ =>This Inner Loop Header: Depth=1272; THUMB-ENABLE-NEXT:    @ InlineAsm Start273; THUMB-ENABLE-NEXT:    mov.w r2, #1274; THUMB-ENABLE-NEXT:    @ InlineAsm End275; THUMB-ENABLE-NEXT:    add r0, r2276; THUMB-ENABLE-NEXT:    subs r1, #1277; THUMB-ENABLE-NEXT:    bne LBB1_2278; THUMB-ENABLE-NEXT:  @ %bb.3: @ %for.end279; THUMB-ENABLE-NEXT:    lsls r0, r0, #3280; THUMB-ENABLE-NEXT:    pop {r4, r7, pc}281; THUMB-ENABLE-NEXT:  LBB1_4: @ %if.else282; THUMB-ENABLE-NEXT:    lsls r0, r1, #1283; THUMB-ENABLE-NEXT:    bx lr284; THUMB-ENABLE-NEXT:  Lfunc_end1:285;286; THUMB-DISABLE-LABEL: freqSaveAndRestoreOutsideLoop:287; THUMB-DISABLE:       Lfunc_begin1:288; THUMB-DISABLE-NEXT:  @ %bb.0: @ %entry289; THUMB-DISABLE-NEXT:    push {r4, r7, lr}290; THUMB-DISABLE-NEXT:    add r7, sp, #4291; THUMB-DISABLE-NEXT:    cbz r0, LBB1_4292; THUMB-DISABLE-NEXT:  @ %bb.1: @ %for.preheader293; THUMB-DISABLE-NEXT:    movs r0, #0294; THUMB-DISABLE-NEXT:    movs r1, #10295; THUMB-DISABLE-NEXT:    @ InlineAsm Start296; THUMB-DISABLE-NEXT:    nop297; THUMB-DISABLE-NEXT:    @ InlineAsm End298; THUMB-DISABLE-NEXT:  LBB1_2: @ %for.body299; THUMB-DISABLE-NEXT:    @ =>This Inner Loop Header: Depth=1300; THUMB-DISABLE-NEXT:    @ InlineAsm Start301; THUMB-DISABLE-NEXT:    mov.w r2, #1302; THUMB-DISABLE-NEXT:    @ InlineAsm End303; THUMB-DISABLE-NEXT:    add r0, r2304; THUMB-DISABLE-NEXT:    subs r1, #1305; THUMB-DISABLE-NEXT:    bne LBB1_2306; THUMB-DISABLE-NEXT:  @ %bb.3: @ %for.end307; THUMB-DISABLE-NEXT:    lsls r0, r0, #3308; THUMB-DISABLE-NEXT:    pop {r4, r7, pc}309; THUMB-DISABLE-NEXT:  LBB1_4: @ %if.else310; THUMB-DISABLE-NEXT:    lsls r0, r1, #1311; THUMB-DISABLE-NEXT:    pop {r4, r7, pc}312; THUMB-DISABLE-NEXT:  Lfunc_end1:313entry: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 "mov $0, #1", "=r,~{r4}"()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  %shl = shl i32 %add, 3332  br label %if.end333 334if.else:                                          ; preds = %entry335  %mul = shl nsw i32 %N, 1336  br label %if.end337 338if.end:                                           ; preds = %if.else, %for.end339  %sum.1 = phi i32 [ %shl, %for.end ], [ %mul, %if.else ]340  ret i32 %sum.1341}342 343declare i32 @something(...)344 345; Check that we do not perform the shrink-wrapping inside the loop even346; though that would be legal. The cost model must prevent that.347; freqSaveAndRestoreOutsideLoop2:348; Prologue code.349; Make sure we save the CSR used in the inline asm: r4.350; push {r4351; mov{{s?}} [[SUM:r0]], #0352; mov{{s?}} [[IV:r[0-9]+]], #10353; nop354; Next BB.355; [[LOOP_LABEL:LBB[0-9_]+]]: @ %for.body356; mov{{(\.w)?}} [[TMP:r[0-9]+]], #1357; add [[SUM]], [[TMP]], [[SUM]]358; add [[SUM]], [[TMP]]359; subs [[IV]], [[IV]], #1360; subs [[IV]], #1361; bne [[LOOP_LABEL]]362; Next BB.363; @ %for.exit364; nop365; pop {r4366define i32 @freqSaveAndRestoreOutsideLoop2(i32 %cond) "frame-pointer"="all" {367; ARM-LABEL: freqSaveAndRestoreOutsideLoop2:368; ARM:       @ %bb.0: @ %entry369; ARM-NEXT:    push {r4, r7, lr}370; ARM-NEXT:    add r7, sp, #4371; ARM-NEXT:    mov r0, #0372; ARM-NEXT:    mov r1, #10373; ARM-NEXT:    @ InlineAsm Start374; ARM-NEXT:    nop375; ARM-NEXT:    @ InlineAsm End376; ARM-NEXT:  LBB2_1: @ %for.body377; ARM-NEXT:    @ =>This Inner Loop Header: Depth=1378; ARM-NEXT:    @ InlineAsm Start379; ARM-NEXT:    mov r2, #1380; ARM-NEXT:    @ InlineAsm End381; ARM-NEXT:    add r0, r2, r0382; ARM-NEXT:    subs r1, r1, #1383; ARM-NEXT:    bne LBB2_1384; ARM-NEXT:  @ %bb.2: @ %for.exit385; ARM-NEXT:    @ InlineAsm Start386; ARM-NEXT:    nop387; ARM-NEXT:    @ InlineAsm End388; ARM-NEXT:    pop {r4, r7, pc}389;390; THUMB-LABEL: freqSaveAndRestoreOutsideLoop2:391; THUMB:       @ %bb.0: @ %entry392; THUMB-NEXT:    push {r4, r7, lr}393; THUMB-NEXT:    add r7, sp, #4394; THUMB-NEXT:    movs r0, #0395; THUMB-NEXT:    movs r1, #10396; THUMB-NEXT:    @ InlineAsm Start397; THUMB-NEXT:    nop398; THUMB-NEXT:    @ InlineAsm End399; THUMB-NEXT:  LBB2_1: @ %for.body400; THUMB-NEXT:    @ =>This Inner Loop Header: Depth=1401; THUMB-NEXT:    @ InlineAsm Start402; THUMB-NEXT:    mov.w r2, #1403; THUMB-NEXT:    @ InlineAsm End404; THUMB-NEXT:    add r0, r2405; THUMB-NEXT:    subs r1, #1406; THUMB-NEXT:    bne LBB2_1407; THUMB-NEXT:  @ %bb.2: @ %for.exit408; THUMB-NEXT:    @ InlineAsm Start409; THUMB-NEXT:    nop410; THUMB-NEXT:    @ InlineAsm End411; THUMB-NEXT:    pop {r4, r7, pc}412; ARM-ENABLE-LABEL: freqSaveAndRestoreOutsideLoop2:413; ARM-ENABLE:       Lfunc_begin2:414; ARM-ENABLE-NEXT:  @ %bb.0: @ %entry415; ARM-ENABLE-NEXT:    push {r4, r7, lr}416; ARM-ENABLE-NEXT:    add r7, sp, #4417; ARM-ENABLE-NEXT:    mov r0, #0418; ARM-ENABLE-NEXT:    mov r1, #10419; ARM-ENABLE-NEXT:    @ InlineAsm Start420; ARM-ENABLE-NEXT:    nop421; ARM-ENABLE-NEXT:    @ InlineAsm End422; ARM-ENABLE-NEXT:  LBB2_1: @ %for.body423; ARM-ENABLE-NEXT:    @ =>This Inner Loop Header: Depth=1424; ARM-ENABLE-NEXT:    @ InlineAsm Start425; ARM-ENABLE-NEXT:    mov r2, #1426; ARM-ENABLE-NEXT:    @ InlineAsm End427; ARM-ENABLE-NEXT:    add r0, r2, r0428; ARM-ENABLE-NEXT:    subs r1, r1, #1429; ARM-ENABLE-NEXT:    bne LBB2_1430; ARM-ENABLE-NEXT:  @ %bb.2: @ %for.exit431; ARM-ENABLE-NEXT:    @ InlineAsm Start432; ARM-ENABLE-NEXT:    nop433; ARM-ENABLE-NEXT:    @ InlineAsm End434; ARM-ENABLE-NEXT:    pop {r4, r7, pc}435; ARM-ENABLE-NEXT:  Lfunc_end2:436;437; ARM-DISABLE-LABEL: freqSaveAndRestoreOutsideLoop2:438; ARM-DISABLE:       Lfunc_begin2:439; ARM-DISABLE-NEXT:  @ %bb.0: @ %entry440; ARM-DISABLE-NEXT:    push {r4, r7, lr}441; ARM-DISABLE-NEXT:    add r7, sp, #4442; ARM-DISABLE-NEXT:    mov r0, #0443; ARM-DISABLE-NEXT:    mov r1, #10444; ARM-DISABLE-NEXT:    @ InlineAsm Start445; ARM-DISABLE-NEXT:    nop446; ARM-DISABLE-NEXT:    @ InlineAsm End447; ARM-DISABLE-NEXT:  LBB2_1: @ %for.body448; ARM-DISABLE-NEXT:    @ =>This Inner Loop Header: Depth=1449; ARM-DISABLE-NEXT:    @ InlineAsm Start450; ARM-DISABLE-NEXT:    mov r2, #1451; ARM-DISABLE-NEXT:    @ InlineAsm End452; ARM-DISABLE-NEXT:    add r0, r2, r0453; ARM-DISABLE-NEXT:    subs r1, r1, #1454; ARM-DISABLE-NEXT:    bne LBB2_1455; ARM-DISABLE-NEXT:  @ %bb.2: @ %for.exit456; ARM-DISABLE-NEXT:    @ InlineAsm Start457; ARM-DISABLE-NEXT:    nop458; ARM-DISABLE-NEXT:    @ InlineAsm End459; ARM-DISABLE-NEXT:    pop {r4, r7, pc}460; ARM-DISABLE-NEXT:  Lfunc_end2:461;462; THUMB-ENABLE-LABEL: freqSaveAndRestoreOutsideLoop2:463; THUMB-ENABLE:       Lfunc_begin2:464; THUMB-ENABLE-NEXT:  @ %bb.0: @ %entry465; THUMB-ENABLE-NEXT:    push {r4, r7, lr}466; THUMB-ENABLE-NEXT:    add r7, sp, #4467; THUMB-ENABLE-NEXT:    movs r0, #0468; THUMB-ENABLE-NEXT:    movs r1, #10469; THUMB-ENABLE-NEXT:    @ InlineAsm Start470; THUMB-ENABLE-NEXT:    nop471; THUMB-ENABLE-NEXT:    @ InlineAsm End472; THUMB-ENABLE-NEXT:  LBB2_1: @ %for.body473; THUMB-ENABLE-NEXT:    @ =>This Inner Loop Header: Depth=1474; THUMB-ENABLE-NEXT:    @ InlineAsm Start475; THUMB-ENABLE-NEXT:    mov.w r2, #1476; THUMB-ENABLE-NEXT:    @ InlineAsm End477; THUMB-ENABLE-NEXT:    add r0, r2478; THUMB-ENABLE-NEXT:    subs r1, #1479; THUMB-ENABLE-NEXT:    bne LBB2_1480; THUMB-ENABLE-NEXT:  @ %bb.2: @ %for.exit481; THUMB-ENABLE-NEXT:    @ InlineAsm Start482; THUMB-ENABLE-NEXT:    nop483; THUMB-ENABLE-NEXT:    @ InlineAsm End484; THUMB-ENABLE-NEXT:    pop {r4, r7, pc}485; THUMB-ENABLE-NEXT:  Lfunc_end2:486;487; THUMB-DISABLE-LABEL: freqSaveAndRestoreOutsideLoop2:488; THUMB-DISABLE:       Lfunc_begin2:489; THUMB-DISABLE-NEXT:  @ %bb.0: @ %entry490; THUMB-DISABLE-NEXT:    push {r4, r7, lr}491; THUMB-DISABLE-NEXT:    add r7, sp, #4492; THUMB-DISABLE-NEXT:    movs r0, #0493; THUMB-DISABLE-NEXT:    movs r1, #10494; THUMB-DISABLE-NEXT:    @ InlineAsm Start495; THUMB-DISABLE-NEXT:    nop496; THUMB-DISABLE-NEXT:    @ InlineAsm End497; THUMB-DISABLE-NEXT:  LBB2_1: @ %for.body498; THUMB-DISABLE-NEXT:    @ =>This Inner Loop Header: Depth=1499; THUMB-DISABLE-NEXT:    @ InlineAsm Start500; THUMB-DISABLE-NEXT:    mov.w r2, #1501; THUMB-DISABLE-NEXT:    @ InlineAsm End502; THUMB-DISABLE-NEXT:    add r0, r2503; THUMB-DISABLE-NEXT:    subs r1, #1504; THUMB-DISABLE-NEXT:    bne LBB2_1505; THUMB-DISABLE-NEXT:  @ %bb.2: @ %for.exit506; THUMB-DISABLE-NEXT:    @ InlineAsm Start507; THUMB-DISABLE-NEXT:    nop508; THUMB-DISABLE-NEXT:    @ InlineAsm End509; THUMB-DISABLE-NEXT:    pop {r4, r7, pc}510; THUMB-DISABLE-NEXT:  Lfunc_end2:511entry:512  br label %for.preheader513 514for.preheader:515  tail call void asm "nop", ""()516  br label %for.body517 518for.body:                                         ; preds = %for.body, %entry519  %i.04 = phi i32 [ 0, %for.preheader ], [ %inc, %for.body ]520  %sum.03 = phi i32 [ 0, %for.preheader ], [ %add, %for.body ]521  %call = tail call i32 asm sideeffect "mov $0, #1", "=r,~{r4}"()522  %add = add nsw i32 %call, %sum.03523  %inc = add nuw nsw i32 %i.04, 1524  %exitcond = icmp eq i32 %inc, 10525  br i1 %exitcond, label %for.exit, label %for.body526 527for.exit:528  tail call void asm "nop", ""()529  br label %for.end530 531for.end:                                          ; preds = %for.body532  ret i32 %add533}534 535; Check with a more complex case that we do not have save within the loop and536; restore outside.537; loopInfoSaveOutsideLoop:538;539; cmp r0, #0540; beq [[ELSE_LABEL:LBB[0-9_]+]]541; cbz r0, [[ELSE_LABEL:LBB[0-9_]+]]542;543; Prologue code.544; Make sure we save the CSR used in the inline asm: r4.545; push {r4, r7, lr}546; add r7, sp, #4547;548; cmp r0, #0549; beq [[ELSE_LABEL:LBB[0-9_]+]]550; cbz r0, [[ELSE_LABEL:LBB[0-9_]+]]551;552; SUM is in r0 because it is coalesced with the second553; argument on the else path.554; mov{{s?}} [[SUM:r0]], #0555; mov{{s?}} [[IV:r[0-9]+]], #10556;557; Next BB.558; [[LOOP:LBB[0-9_]+]]: @ %for.body559; mov{{(\.w)?}} [[TMP:r[0-9]+]], #1560; add [[SUM]], [[TMP]], [[SUM]]561; add [[SUM]], [[TMP]]562; subs [[IV]], [[IV]], #1563; subs [[IV]], #1564; bne [[LOOP]]565;566; Next BB.567; SUM << 3.568; lsl{{s?}} [[SUM]], [[SUM]], #3569; pop {r4, r7, pc}570;571; Duplicated epilogue.572; pop {r4, r7, pc}573;574; [[ELSE_LABEL]]: @ %if.else575; Shift second argument by one and store into returned register.576; lsl{{s?}} r0, r1, #1577; pop {r4, r7, pc}578;579; bx lr580define i32 @loopInfoSaveOutsideLoop(i32 %cond, i32 %N) "frame-pointer"="all" {581; ARM-ENABLE-LABEL: loopInfoSaveOutsideLoop:582; ARM-ENABLE:       Lfunc_begin3:583; ARM-ENABLE-NEXT:  @ %bb.0: @ %entry584; ARM-ENABLE-NEXT:    cmp r0, #0585; ARM-ENABLE-NEXT:    beq LBB3_4586; ARM-ENABLE-NEXT:  @ %bb.1: @ %for.preheader587; ARM-ENABLE-NEXT:    push {r4, r7, lr}588; ARM-ENABLE-NEXT:    add r7, sp, #4589; ARM-ENABLE-NEXT:    mov r0, #0590; ARM-ENABLE-NEXT:    mov r1, #10591; ARM-ENABLE-NEXT:    @ InlineAsm Start592; ARM-ENABLE-NEXT:    nop593; ARM-ENABLE-NEXT:    @ InlineAsm End594; ARM-ENABLE-NEXT:  LBB3_2: @ %for.body595; ARM-ENABLE-NEXT:    @ =>This Inner Loop Header: Depth=1596; ARM-ENABLE-NEXT:    @ InlineAsm Start597; ARM-ENABLE-NEXT:    mov r2, #1598; ARM-ENABLE-NEXT:    @ InlineAsm End599; ARM-ENABLE-NEXT:    add r0, r2, r0600; ARM-ENABLE-NEXT:    subs r1, r1, #1601; ARM-ENABLE-NEXT:    bne LBB3_2602; ARM-ENABLE-NEXT:  @ %bb.3: @ %for.end603; ARM-ENABLE-NEXT:    lsl r0, r0, #3604; ARM-ENABLE-NEXT:    @ InlineAsm Start605; ARM-ENABLE-NEXT:    nop606; ARM-ENABLE-NEXT:    @ InlineAsm End607; ARM-ENABLE-NEXT:    pop {r4, r7, pc}608; ARM-ENABLE-NEXT:  LBB3_4: @ %if.else609; ARM-ENABLE-NEXT:    lsl r0, r1, #1610; ARM-ENABLE-NEXT:    bx lr611; ARM-ENABLE-NEXT:  Lfunc_end3:612;613; ARM-DISABLE-LABEL: loopInfoSaveOutsideLoop:614; ARM-DISABLE:       Lfunc_begin3:615; ARM-DISABLE-NEXT:  @ %bb.0: @ %entry616; ARM-DISABLE-NEXT:    push {r4, r7, lr}617; ARM-DISABLE-NEXT:    add r7, sp, #4618; ARM-DISABLE-NEXT:    cmp r0, #0619; ARM-DISABLE-NEXT:    beq LBB3_4620; ARM-DISABLE-NEXT:  @ %bb.1: @ %for.preheader621; ARM-DISABLE-NEXT:    mov r0, #0622; ARM-DISABLE-NEXT:    mov r1, #10623; ARM-DISABLE-NEXT:    @ InlineAsm Start624; ARM-DISABLE-NEXT:    nop625; ARM-DISABLE-NEXT:    @ InlineAsm End626; ARM-DISABLE-NEXT:  LBB3_2: @ %for.body627; ARM-DISABLE-NEXT:    @ =>This Inner Loop Header: Depth=1628; ARM-DISABLE-NEXT:    @ InlineAsm Start629; ARM-DISABLE-NEXT:    mov r2, #1630; ARM-DISABLE-NEXT:    @ InlineAsm End631; ARM-DISABLE-NEXT:    add r0, r2, r0632; ARM-DISABLE-NEXT:    subs r1, r1, #1633; ARM-DISABLE-NEXT:    bne LBB3_2634; ARM-DISABLE-NEXT:  @ %bb.3: @ %for.end635; ARM-DISABLE-NEXT:    lsl r0, r0, #3636; ARM-DISABLE-NEXT:    @ InlineAsm Start637; ARM-DISABLE-NEXT:    nop638; ARM-DISABLE-NEXT:    @ InlineAsm End639; ARM-DISABLE-NEXT:    pop {r4, r7, pc}640; ARM-DISABLE-NEXT:  LBB3_4: @ %if.else641; ARM-DISABLE-NEXT:    lsl r0, r1, #1642; ARM-DISABLE-NEXT:    pop {r4, r7, pc}643; ARM-DISABLE-NEXT:  Lfunc_end3:644;645; THUMB-ENABLE-LABEL: loopInfoSaveOutsideLoop:646; THUMB-ENABLE:       Lfunc_begin3:647; THUMB-ENABLE-NEXT:  @ %bb.0: @ %entry648; THUMB-ENABLE-NEXT:    cbz r0, LBB3_4649; THUMB-ENABLE-NEXT:  @ %bb.1: @ %for.preheader650; THUMB-ENABLE-NEXT:    push {r4, r7, lr}651; THUMB-ENABLE-NEXT:    add r7, sp, #4652; THUMB-ENABLE-NEXT:    movs r0, #0653; THUMB-ENABLE-NEXT:    movs r1, #10654; THUMB-ENABLE-NEXT:    @ InlineAsm Start655; THUMB-ENABLE-NEXT:    nop656; THUMB-ENABLE-NEXT:    @ InlineAsm End657; THUMB-ENABLE-NEXT:  LBB3_2: @ %for.body658; THUMB-ENABLE-NEXT:    @ =>This Inner Loop Header: Depth=1659; THUMB-ENABLE-NEXT:    @ InlineAsm Start660; THUMB-ENABLE-NEXT:    mov.w r2, #1661; THUMB-ENABLE-NEXT:    @ InlineAsm End662; THUMB-ENABLE-NEXT:    add r0, r2663; THUMB-ENABLE-NEXT:    subs r1, #1664; THUMB-ENABLE-NEXT:    bne LBB3_2665; THUMB-ENABLE-NEXT:  @ %bb.3: @ %for.end666; THUMB-ENABLE-NEXT:    lsls r0, r0, #3667; THUMB-ENABLE-NEXT:    @ InlineAsm Start668; THUMB-ENABLE-NEXT:    nop669; THUMB-ENABLE-NEXT:    @ InlineAsm End670; THUMB-ENABLE-NEXT:    pop {r4, r7, pc}671; THUMB-ENABLE-NEXT:  LBB3_4: @ %if.else672; THUMB-ENABLE-NEXT:    lsls r0, r1, #1673; THUMB-ENABLE-NEXT:    bx lr674; THUMB-ENABLE-NEXT:  Lfunc_end3:675;676; THUMB-DISABLE-LABEL: loopInfoSaveOutsideLoop:677; THUMB-DISABLE:       Lfunc_begin3:678; THUMB-DISABLE-NEXT:  @ %bb.0: @ %entry679; THUMB-DISABLE-NEXT:    push {r4, r7, lr}680; THUMB-DISABLE-NEXT:    add r7, sp, #4681; THUMB-DISABLE-NEXT:    cbz r0, LBB3_4682; THUMB-DISABLE-NEXT:  @ %bb.1: @ %for.preheader683; THUMB-DISABLE-NEXT:    movs r0, #0684; THUMB-DISABLE-NEXT:    movs r1, #10685; THUMB-DISABLE-NEXT:    @ InlineAsm Start686; THUMB-DISABLE-NEXT:    nop687; THUMB-DISABLE-NEXT:    @ InlineAsm End688; THUMB-DISABLE-NEXT:  LBB3_2: @ %for.body689; THUMB-DISABLE-NEXT:    @ =>This Inner Loop Header: Depth=1690; THUMB-DISABLE-NEXT:    @ InlineAsm Start691; THUMB-DISABLE-NEXT:    mov.w r2, #1692; THUMB-DISABLE-NEXT:    @ InlineAsm End693; THUMB-DISABLE-NEXT:    add r0, r2694; THUMB-DISABLE-NEXT:    subs r1, #1695; THUMB-DISABLE-NEXT:    bne LBB3_2696; THUMB-DISABLE-NEXT:  @ %bb.3: @ %for.end697; THUMB-DISABLE-NEXT:    lsls r0, r0, #3698; THUMB-DISABLE-NEXT:    @ InlineAsm Start699; THUMB-DISABLE-NEXT:    nop700; THUMB-DISABLE-NEXT:    @ InlineAsm End701; THUMB-DISABLE-NEXT:    pop {r4, r7, pc}702; THUMB-DISABLE-NEXT:  LBB3_4: @ %if.else703; THUMB-DISABLE-NEXT:    lsls r0, r1, #1704; THUMB-DISABLE-NEXT:    pop {r4, r7, pc}705; THUMB-DISABLE-NEXT:  Lfunc_end3:706entry:707  %tobool = icmp eq i32 %cond, 0708  br i1 %tobool, label %if.else, label %for.preheader709 710for.preheader:711  tail call void asm "nop", ""()712  br label %for.body713 714for.body:                                         ; preds = %entry, %for.body715  %i.05 = phi i32 [ %inc, %for.body ], [ 0, %for.preheader ]716  %sum.04 = phi i32 [ %add, %for.body ], [ 0, %for.preheader ]717  %call = tail call i32 asm sideeffect "mov $0, #1", "=r,~{r4}"()718  %add = add nsw i32 %call, %sum.04719  %inc = add nuw nsw i32 %i.05, 1720  %exitcond = icmp eq i32 %inc, 10721  br i1 %exitcond, label %for.end, label %for.body722 723for.end:                                          ; preds = %for.body724  tail call void asm "nop", "~{r4}"()725  %shl = shl i32 %add, 3726  br label %if.end727 728if.else:                                          ; preds = %entry729  %mul = shl nsw i32 %N, 1730  br label %if.end731 732if.end:                                           ; preds = %if.else, %for.end733  %sum.1 = phi i32 [ %shl, %for.end ], [ %mul, %if.else ]734  ret i32 %sum.1735}736 737declare void @somethingElse(...)738 739; Check with a more complex case that we do not have restore within the loop and740; save outside.741; loopInfoRestoreOutsideLoop:742;743; cmp r0, #0744; beq [[ELSE_LABEL:LBB[0-9_]+]]745; cbz r0, [[ELSE_LABEL:LBB[0-9_]+]]746;747; Prologue code.748; Make sure we save the CSR used in the inline asm: r4.749; push {r4, r7, lr}750; add r7, sp, #4751;752; cmp r0, #0753; beq [[ELSE_LABEL:LBB[0-9_]+]]754; cbz r0, [[ELSE_LABEL:LBB[0-9_]+]]755;756; SUM is in r0 because it is coalesced with the second757; argument on the else path.758; mov{{s?}} [[SUM:r0]], #0759; mov{{s?}} [[IV:r[0-9]+]], #10760;761; Next BB.762; [[LOOP:LBB[0-9_]+]]: @ %for.body763; mov{{(\.w)?}} [[TMP:r[0-9]+]], #1764; add [[SUM]], [[TMP]], [[SUM]]765; add [[SUM]], [[TMP]]766; subs [[IV]], [[IV]], #1767; subs [[IV]], #1768; bne [[LOOP]]769;770; Next BB.771; SUM << 3.772; lsl{{s?}} [[SUM]], [[SUM]], #3773; pop {r4, r7, pc}774;775; Duplicated epilogue.776; pop {r4, r7, pc}777;778; [[ELSE_LABEL]]: @ %if.else779; Shift second argument by one and store into returned register.780; lsl{{s?}} r0, r1, #1781; pop {r4, r7, pc}782;783; bx lr784define i32 @loopInfoRestoreOutsideLoop(i32 %cond, i32 %N) "frame-pointer"="all" nounwind {785; ARM-ENABLE-LABEL: loopInfoRestoreOutsideLoop:786; ARM-ENABLE:       Lfunc_begin4:787; ARM-ENABLE-NEXT:  @ %bb.0: @ %entry788; ARM-ENABLE-NEXT:    cmp r0, #0789; ARM-ENABLE-NEXT:    beq LBB4_4790; ARM-ENABLE-NEXT:  @ %bb.1: @ %if.then791; ARM-ENABLE-NEXT:    push {r4, r7, lr}792; ARM-ENABLE-NEXT:    add r7, sp, #4793; ARM-ENABLE-NEXT:    mov r0, #0794; ARM-ENABLE-NEXT:    mov r1, #10795; ARM-ENABLE-NEXT:    @ InlineAsm Start796; ARM-ENABLE-NEXT:    nop797; ARM-ENABLE-NEXT:    @ InlineAsm End798; ARM-ENABLE-NEXT:  LBB4_2: @ %for.body799; ARM-ENABLE-NEXT:    @ =>This Inner Loop Header: Depth=1800; ARM-ENABLE-NEXT:    @ InlineAsm Start801; ARM-ENABLE-NEXT:    mov r2, #1802; ARM-ENABLE-NEXT:    @ InlineAsm End803; ARM-ENABLE-NEXT:    add r0, r2, r0804; ARM-ENABLE-NEXT:    subs r1, r1, #1805; ARM-ENABLE-NEXT:    bne LBB4_2806; ARM-ENABLE-NEXT:  @ %bb.3: @ %for.end807; ARM-ENABLE-NEXT:    lsl r0, r0, #3808; ARM-ENABLE-NEXT:    pop {r4, r7, pc}809; ARM-ENABLE-NEXT:  LBB4_4: @ %if.else810; ARM-ENABLE-NEXT:    lsl r0, r1, #1811; ARM-ENABLE-NEXT:    bx lr812; ARM-ENABLE-NEXT:  Lfunc_end4:813;814; ARM-DISABLE-LABEL: loopInfoRestoreOutsideLoop:815; ARM-DISABLE:       Lfunc_begin4:816; ARM-DISABLE-NEXT:  @ %bb.0: @ %entry817; ARM-DISABLE-NEXT:    push {r4, r7, lr}818; ARM-DISABLE-NEXT:    add r7, sp, #4819; ARM-DISABLE-NEXT:    cmp r0, #0820; ARM-DISABLE-NEXT:    beq LBB4_4821; ARM-DISABLE-NEXT:  @ %bb.1: @ %if.then822; ARM-DISABLE-NEXT:    mov r0, #0823; ARM-DISABLE-NEXT:    mov r1, #10824; ARM-DISABLE-NEXT:    @ InlineAsm Start825; ARM-DISABLE-NEXT:    nop826; ARM-DISABLE-NEXT:    @ InlineAsm End827; ARM-DISABLE-NEXT:  LBB4_2: @ %for.body828; ARM-DISABLE-NEXT:    @ =>This Inner Loop Header: Depth=1829; ARM-DISABLE-NEXT:    @ InlineAsm Start830; ARM-DISABLE-NEXT:    mov r2, #1831; ARM-DISABLE-NEXT:    @ InlineAsm End832; ARM-DISABLE-NEXT:    add r0, r2, r0833; ARM-DISABLE-NEXT:    subs r1, r1, #1834; ARM-DISABLE-NEXT:    bne LBB4_2835; ARM-DISABLE-NEXT:  @ %bb.3: @ %for.end836; ARM-DISABLE-NEXT:    lsl r0, r0, #3837; ARM-DISABLE-NEXT:    pop {r4, r7, pc}838; ARM-DISABLE-NEXT:  LBB4_4: @ %if.else839; ARM-DISABLE-NEXT:    lsl r0, r1, #1840; ARM-DISABLE-NEXT:    pop {r4, r7, pc}841; ARM-DISABLE-NEXT:  Lfunc_end4:842;843; THUMB-ENABLE-LABEL: loopInfoRestoreOutsideLoop:844; THUMB-ENABLE:       Lfunc_begin4:845; THUMB-ENABLE-NEXT:  @ %bb.0: @ %entry846; THUMB-ENABLE-NEXT:    cbz r0, LBB4_4847; THUMB-ENABLE-NEXT:  @ %bb.1: @ %if.then848; THUMB-ENABLE-NEXT:    push {r4, r7, lr}849; THUMB-ENABLE-NEXT:    add r7, sp, #4850; THUMB-ENABLE-NEXT:    movs r0, #0851; THUMB-ENABLE-NEXT:    movs r1, #10852; THUMB-ENABLE-NEXT:    @ InlineAsm Start853; THUMB-ENABLE-NEXT:    nop854; THUMB-ENABLE-NEXT:    @ InlineAsm End855; THUMB-ENABLE-NEXT:  LBB4_2: @ %for.body856; THUMB-ENABLE-NEXT:    @ =>This Inner Loop Header: Depth=1857; THUMB-ENABLE-NEXT:    @ InlineAsm Start858; THUMB-ENABLE-NEXT:    mov.w r2, #1859; THUMB-ENABLE-NEXT:    @ InlineAsm End860; THUMB-ENABLE-NEXT:    add r0, r2861; THUMB-ENABLE-NEXT:    subs r1, #1862; THUMB-ENABLE-NEXT:    bne LBB4_2863; THUMB-ENABLE-NEXT:  @ %bb.3: @ %for.end864; THUMB-ENABLE-NEXT:    lsls r0, r0, #3865; THUMB-ENABLE-NEXT:    pop {r4, r7, pc}866; THUMB-ENABLE-NEXT:  LBB4_4: @ %if.else867; THUMB-ENABLE-NEXT:    lsls r0, r1, #1868; THUMB-ENABLE-NEXT:    bx lr869; THUMB-ENABLE-NEXT:  Lfunc_end4:870;871; THUMB-DISABLE-LABEL: loopInfoRestoreOutsideLoop:872; THUMB-DISABLE:       Lfunc_begin4:873; THUMB-DISABLE-NEXT:  @ %bb.0: @ %entry874; THUMB-DISABLE-NEXT:    push {r4, r7, lr}875; THUMB-DISABLE-NEXT:    add r7, sp, #4876; THUMB-DISABLE-NEXT:    cbz r0, LBB4_4877; THUMB-DISABLE-NEXT:  @ %bb.1: @ %if.then878; THUMB-DISABLE-NEXT:    movs r0, #0879; THUMB-DISABLE-NEXT:    movs r1, #10880; THUMB-DISABLE-NEXT:    @ InlineAsm Start881; THUMB-DISABLE-NEXT:    nop882; THUMB-DISABLE-NEXT:    @ InlineAsm End883; THUMB-DISABLE-NEXT:  LBB4_2: @ %for.body884; THUMB-DISABLE-NEXT:    @ =>This Inner Loop Header: Depth=1885; THUMB-DISABLE-NEXT:    @ InlineAsm Start886; THUMB-DISABLE-NEXT:    mov.w r2, #1887; THUMB-DISABLE-NEXT:    @ InlineAsm End888; THUMB-DISABLE-NEXT:    add r0, r2889; THUMB-DISABLE-NEXT:    subs r1, #1890; THUMB-DISABLE-NEXT:    bne LBB4_2891; THUMB-DISABLE-NEXT:  @ %bb.3: @ %for.end892; THUMB-DISABLE-NEXT:    lsls r0, r0, #3893; THUMB-DISABLE-NEXT:    pop {r4, r7, pc}894; THUMB-DISABLE-NEXT:  LBB4_4: @ %if.else895; THUMB-DISABLE-NEXT:    lsls r0, r1, #1896; THUMB-DISABLE-NEXT:    pop {r4, r7, pc}897; THUMB-DISABLE-NEXT:  Lfunc_end4:898entry:899  %tobool = icmp eq i32 %cond, 0900  br i1 %tobool, label %if.else, label %if.then901 902if.then:                                          ; preds = %entry903  tail call void asm "nop", "~{r4}"()904  br label %for.body905 906for.body:                                         ; preds = %for.body, %if.then907  %i.05 = phi i32 [ 0, %if.then ], [ %inc, %for.body ]908  %sum.04 = phi i32 [ 0, %if.then ], [ %add, %for.body ]909  %call = tail call i32 asm sideeffect "mov $0, #1", "=r,~{r4}"()910  %add = add nsw i32 %call, %sum.04911  %inc = add nuw nsw i32 %i.05, 1912  %exitcond = icmp eq i32 %inc, 10913  br i1 %exitcond, label %for.end, label %for.body914 915for.end:                                          ; preds = %for.body916  %shl = shl i32 %add, 3917  br label %if.end918 919if.else:                                          ; preds = %entry920  %mul = shl nsw i32 %N, 1921  br label %if.end922 923if.end:                                           ; preds = %if.else, %for.end924  %sum.1 = phi i32 [ %shl, %for.end ], [ %mul, %if.else ]925  ret i32 %sum.1926}927 928; Check that we handle function with no frame information correctly.929; emptyFrame:930; @ %entry931; mov{{s?}} r0, #0932; bx lr933define i32 @emptyFrame() {934; ARM-LABEL: emptyFrame:935; ARM:       @ %bb.0: @ %entry936; ARM-NEXT:    mov r0, #0937; ARM-NEXT:    bx lr938;939; THUMB-LABEL: emptyFrame:940; THUMB:       @ %bb.0: @ %entry941; THUMB-NEXT:    movs r0, #0942; THUMB-NEXT:    bx lr943; ARM-ENABLE-LABEL: emptyFrame:944; ARM-ENABLE:       Lfunc_begin5:945; ARM-ENABLE-NEXT:  @ %bb.0: @ %entry946; ARM-ENABLE-NEXT:    mov r0, #0947; ARM-ENABLE-NEXT:    bx lr948; ARM-ENABLE-NEXT:  Lfunc_end5:949;950; ARM-DISABLE-LABEL: emptyFrame:951; ARM-DISABLE:       Lfunc_begin5:952; ARM-DISABLE-NEXT:  @ %bb.0: @ %entry953; ARM-DISABLE-NEXT:    mov r0, #0954; ARM-DISABLE-NEXT:    bx lr955; ARM-DISABLE-NEXT:  Lfunc_end5:956;957; THUMB-ENABLE-LABEL: emptyFrame:958; THUMB-ENABLE:       Lfunc_begin5:959; THUMB-ENABLE-NEXT:  @ %bb.0: @ %entry960; THUMB-ENABLE-NEXT:    movs r0, #0961; THUMB-ENABLE-NEXT:    bx lr962; THUMB-ENABLE-NEXT:  Lfunc_end5:963;964; THUMB-DISABLE-LABEL: emptyFrame:965; THUMB-DISABLE:       Lfunc_begin5:966; THUMB-DISABLE-NEXT:  @ %bb.0: @ %entry967; THUMB-DISABLE-NEXT:    movs r0, #0968; THUMB-DISABLE-NEXT:    bx lr969; THUMB-DISABLE-NEXT:  Lfunc_end5:970entry:971  ret i32 0972}973 974; Check that we handle inline asm correctly.975; inlineAsm:976;977; cmp r0, #0978; beq [[ELSE_LABEL:LBB[0-9_]+]]979; cbz r0, [[ELSE_LABEL:LBB[0-9_]+]]980;981; Prologue code.982; Make sure we save the CSR used in the inline asm: r4.983; push {r4, r7, lr}984; add r7, sp, #4985;986; cmp r0, #0987; beq [[ELSE_LABEL:LBB[0-9_]+]]988; cbz r0, [[ELSE_LABEL:LBB[0-9_]+]]989;990; mov{{s?}} [[IV:r[0-9]+]], #10991;992; Next BB.993; [[LOOP:LBB[0-9_]+]]: @ %for.body994; subs [[IV]], [[IV]], #1995; subs [[IV]], #1996; add{{(\.w)?}} r4, r4, #1997; bne [[LOOP]]998;999; Next BB.1000; mov{{s?}} r0, #01001;1002; Duplicated epilogue.1003; pop {r4, r7, pc}1004;1005; [[ELSE_LABEL]]: @ %if.else1006; Shift second argument by one and store into returned register.1007; lsl{{s?}} r0, r1, #11008; pop {r4, r7, pc}1009;1010; bx lr1011define i32 @inlineAsm(i32 %cond, i32 %N) "frame-pointer"="all" {1012; ARM-ENABLE-LABEL: inlineAsm:1013; ARM-ENABLE:       Lfunc_begin6:1014; ARM-ENABLE-NEXT:  @ %bb.0: @ %entry1015; ARM-ENABLE-NEXT:    cmp r0, #01016; ARM-ENABLE-NEXT:    beq LBB6_41017; ARM-ENABLE-NEXT:  @ %bb.1: @ %for.preheader1018; ARM-ENABLE-NEXT:    push {r4, r7, lr}1019; ARM-ENABLE-NEXT:    add r7, sp, #41020; ARM-ENABLE-NEXT:    mov r0, #101021; ARM-ENABLE-NEXT:    @ InlineAsm Start1022; ARM-ENABLE-NEXT:    nop1023; ARM-ENABLE-NEXT:    @ InlineAsm End1024; ARM-ENABLE-NEXT:  LBB6_2: @ %for.body1025; ARM-ENABLE-NEXT:    @ =>This Inner Loop Header: Depth=11026; ARM-ENABLE-NEXT:    subs r0, r0, #11027; ARM-ENABLE-NEXT:    @ InlineAsm Start1028; ARM-ENABLE-NEXT:    add r4, r4, #11029; ARM-ENABLE-NEXT:    @ InlineAsm End1030; ARM-ENABLE-NEXT:    bne LBB6_21031; ARM-ENABLE-NEXT:  @ %bb.3: @ %for.exit1032; ARM-ENABLE-NEXT:    mov r0, #01033; ARM-ENABLE-NEXT:    @ InlineAsm Start1034; ARM-ENABLE-NEXT:    nop1035; ARM-ENABLE-NEXT:    @ InlineAsm End1036; ARM-ENABLE-NEXT:    pop {r4, r7, pc}1037; ARM-ENABLE-NEXT:  LBB6_4: @ %if.else1038; ARM-ENABLE-NEXT:    lsl r0, r1, #11039; ARM-ENABLE-NEXT:    bx lr1040; ARM-ENABLE-NEXT:  Lfunc_end6:1041;1042; ARM-DISABLE-LABEL: inlineAsm:1043; ARM-DISABLE:       Lfunc_begin6:1044; ARM-DISABLE-NEXT:  @ %bb.0: @ %entry1045; ARM-DISABLE-NEXT:    push {r4, r7, lr}1046; ARM-DISABLE-NEXT:    add r7, sp, #41047; ARM-DISABLE-NEXT:    cmp r0, #01048; ARM-DISABLE-NEXT:    beq LBB6_41049; ARM-DISABLE-NEXT:  @ %bb.1: @ %for.preheader1050; ARM-DISABLE-NEXT:    mov r0, #101051; ARM-DISABLE-NEXT:    @ InlineAsm Start1052; ARM-DISABLE-NEXT:    nop1053; ARM-DISABLE-NEXT:    @ InlineAsm End1054; ARM-DISABLE-NEXT:  LBB6_2: @ %for.body1055; ARM-DISABLE-NEXT:    @ =>This Inner Loop Header: Depth=11056; ARM-DISABLE-NEXT:    subs r0, r0, #11057; ARM-DISABLE-NEXT:    @ InlineAsm Start1058; ARM-DISABLE-NEXT:    add r4, r4, #11059; ARM-DISABLE-NEXT:    @ InlineAsm End1060; ARM-DISABLE-NEXT:    bne LBB6_21061; ARM-DISABLE-NEXT:  @ %bb.3: @ %for.exit1062; ARM-DISABLE-NEXT:    mov r0, #01063; ARM-DISABLE-NEXT:    @ InlineAsm Start1064; ARM-DISABLE-NEXT:    nop1065; ARM-DISABLE-NEXT:    @ InlineAsm End1066; ARM-DISABLE-NEXT:    pop {r4, r7, pc}1067; ARM-DISABLE-NEXT:  LBB6_4: @ %if.else1068; ARM-DISABLE-NEXT:    lsl r0, r1, #11069; ARM-DISABLE-NEXT:    pop {r4, r7, pc}1070; ARM-DISABLE-NEXT:  Lfunc_end6:1071;1072; THUMB-ENABLE-LABEL: inlineAsm:1073; THUMB-ENABLE:       Lfunc_begin6:1074; THUMB-ENABLE-NEXT:  @ %bb.0: @ %entry1075; THUMB-ENABLE-NEXT:    cbz r0, LBB6_41076; THUMB-ENABLE-NEXT:  @ %bb.1: @ %for.preheader1077; THUMB-ENABLE-NEXT:    push {r4, r7, lr}1078; THUMB-ENABLE-NEXT:    add r7, sp, #41079; THUMB-ENABLE-NEXT:    movs r0, #101080; THUMB-ENABLE-NEXT:    @ InlineAsm Start1081; THUMB-ENABLE-NEXT:    nop1082; THUMB-ENABLE-NEXT:    @ InlineAsm End1083; THUMB-ENABLE-NEXT:  LBB6_2: @ %for.body1084; THUMB-ENABLE-NEXT:    @ =>This Inner Loop Header: Depth=11085; THUMB-ENABLE-NEXT:    subs r0, #11086; THUMB-ENABLE-NEXT:    @ InlineAsm Start1087; THUMB-ENABLE-NEXT:    add.w r4, r4, #11088; THUMB-ENABLE-NEXT:    @ InlineAsm End1089; THUMB-ENABLE-NEXT:    bne LBB6_21090; THUMB-ENABLE-NEXT:  @ %bb.3: @ %for.exit1091; THUMB-ENABLE-NEXT:    movs r0, #01092; THUMB-ENABLE-NEXT:    @ InlineAsm Start1093; THUMB-ENABLE-NEXT:    nop1094; THUMB-ENABLE-NEXT:    @ InlineAsm End1095; THUMB-ENABLE-NEXT:    pop {r4, r7, pc}1096; THUMB-ENABLE-NEXT:  LBB6_4: @ %if.else1097; THUMB-ENABLE-NEXT:    lsls r0, r1, #11098; THUMB-ENABLE-NEXT:    bx lr1099; THUMB-ENABLE-NEXT:  Lfunc_end6:1100;1101; THUMB-DISABLE-LABEL: inlineAsm:1102; THUMB-DISABLE:       Lfunc_begin6:1103; THUMB-DISABLE-NEXT:  @ %bb.0: @ %entry1104; THUMB-DISABLE-NEXT:    push {r4, r7, lr}1105; THUMB-DISABLE-NEXT:    add r7, sp, #41106; THUMB-DISABLE-NEXT:    cbz r0, LBB6_41107; THUMB-DISABLE-NEXT:  @ %bb.1: @ %for.preheader1108; THUMB-DISABLE-NEXT:    movs r0, #101109; THUMB-DISABLE-NEXT:    @ InlineAsm Start1110; THUMB-DISABLE-NEXT:    nop1111; THUMB-DISABLE-NEXT:    @ InlineAsm End1112; THUMB-DISABLE-NEXT:  LBB6_2: @ %for.body1113; THUMB-DISABLE-NEXT:    @ =>This Inner Loop Header: Depth=11114; THUMB-DISABLE-NEXT:    subs r0, #11115; THUMB-DISABLE-NEXT:    @ InlineAsm Start1116; THUMB-DISABLE-NEXT:    add.w r4, r4, #11117; THUMB-DISABLE-NEXT:    @ InlineAsm End1118; THUMB-DISABLE-NEXT:    bne LBB6_21119; THUMB-DISABLE-NEXT:  @ %bb.3: @ %for.exit1120; THUMB-DISABLE-NEXT:    movs r0, #01121; THUMB-DISABLE-NEXT:    @ InlineAsm Start1122; THUMB-DISABLE-NEXT:    nop1123; THUMB-DISABLE-NEXT:    @ InlineAsm End1124; THUMB-DISABLE-NEXT:    pop {r4, r7, pc}1125; THUMB-DISABLE-NEXT:  LBB6_4: @ %if.else1126; THUMB-DISABLE-NEXT:    lsls r0, r1, #11127; THUMB-DISABLE-NEXT:    pop {r4, r7, pc}1128; THUMB-DISABLE-NEXT:  Lfunc_end6:1129entry:1130  %tobool = icmp eq i32 %cond, 01131  br i1 %tobool, label %if.else, label %for.preheader1132 1133for.preheader:1134  tail call void asm "nop", ""()1135  br label %for.body1136 1137for.body:                                         ; preds = %entry, %for.body1138  %i.03 = phi i32 [ %inc, %for.body ], [ 0, %for.preheader ]1139  tail call void asm sideeffect "add r4, #1", "~{r4}"()1140  %inc = add nuw nsw i32 %i.03, 11141  %exitcond = icmp eq i32 %inc, 101142  br i1 %exitcond, label %for.exit, label %for.body1143 1144for.exit:1145  tail call void asm "nop", ""()1146  br label %if.end1147 1148if.else:                                          ; preds = %entry1149  %mul = shl nsw i32 %N, 11150  br label %if.end1151 1152if.end:                                           ; preds = %for.body, %if.else1153  %sum.0 = phi i32 [ %mul, %if.else ], [ 0, %for.exit ]1154  ret i32 %sum.01155}1156 1157; Check that we handle calls to variadic functions correctly.1158; callVariadicFunc:1159;1160; cmp r0, #01161; beq [[ELSE_LABEL:LBB[0-9_]+]]1162; cbz r0, [[ELSE_LABEL:LBB[0-9_]+]]1163;1164; Prologue code.1165; push {r7, lr}1166; mov r7, sp1167; sub sp, {{(sp, )?}}#121168;1169; cmp r0, #01170; beq [[ELSE_LABEL:LBB[0-9_]+]]1171; cbz r0, [[ELSE_LABEL:LBB[0-9_]+]]1172;1173; Setup of the varags.1174; mov r0, r11175; mov r2, r11176; mov r3, r11177; str r1, [sp]1178; str r1, [sp, #4]1179; strd r1, r1, [sp]1180; str r1, [sp, #8]1181; bl{{x?}} _someVariadicFunc1182; lsl{{s?}} r0, r0, #31183; mov sp, r71184; add sp, #121185; pop {r7, pc}1186;1187; [[ELSE_LABEL]]: @ %if.else1188; Shift second argument by one and store into returned register.1189; lsl{{s?}} r0, r1, #11190;1191; Epilogue code.1192; bx lr1193;1194; mov sp, r71195; add sp, #121196; pop {r7, pc}1197define i32 @callVariadicFunc(i32 %cond, i32 %N) "frame-pointer"="all" {1198; ARM-ENABLE-LABEL: callVariadicFunc:1199; ARM-ENABLE:       Lfunc_begin7:1200; ARM-ENABLE-NEXT:  @ %bb.0: @ %entry1201; ARM-ENABLE-NEXT:    cmp r0, #01202; ARM-ENABLE-NEXT:    beq LBB7_21203; ARM-ENABLE-NEXT:  @ %bb.1: @ %if.then1204; ARM-ENABLE-NEXT:    push {r7, lr}1205; ARM-ENABLE-NEXT:    mov r7, sp1206; ARM-ENABLE-NEXT:    sub sp, sp, #121207; ARM-ENABLE-NEXT:    mov r0, r11208; ARM-ENABLE-NEXT:    mov r2, r11209; ARM-ENABLE-NEXT:    mov r3, r11210; ARM-ENABLE-NEXT:    str r1, [sp]1211; ARM-ENABLE-NEXT:    str r1, [sp, #4]1212; ARM-ENABLE-NEXT:    str r1, [sp, #8]1213; ARM-ENABLE-NEXT:    bl _someVariadicFunc1214; ARM-ENABLE-NEXT:    lsl r0, r0, #31215; ARM-ENABLE-NEXT:    mov sp, r71216; ARM-ENABLE-NEXT:    pop {r7, pc}1217; ARM-ENABLE-NEXT:  LBB7_2: @ %if.else1218; ARM-ENABLE-NEXT:    lsl r0, r1, #11219; ARM-ENABLE-NEXT:    bx lr1220; ARM-ENABLE-NEXT:  Lfunc_end7:1221;1222; ARM-DISABLE-LABEL: callVariadicFunc:1223; ARM-DISABLE:       Lfunc_begin7:1224; ARM-DISABLE-NEXT:  @ %bb.0: @ %entry1225; ARM-DISABLE-NEXT:    push {r7, lr}1226; ARM-DISABLE-NEXT:    mov r7, sp1227; ARM-DISABLE-NEXT:    sub sp, sp, #121228; ARM-DISABLE-NEXT:    cmp r0, #01229; ARM-DISABLE-NEXT:    beq LBB7_21230; ARM-DISABLE-NEXT:  @ %bb.1: @ %if.then1231; ARM-DISABLE-NEXT:    mov r0, r11232; ARM-DISABLE-NEXT:    mov r2, r11233; ARM-DISABLE-NEXT:    mov r3, r11234; ARM-DISABLE-NEXT:    str r1, [sp]1235; ARM-DISABLE-NEXT:    str r1, [sp, #4]1236; ARM-DISABLE-NEXT:    str r1, [sp, #8]1237; ARM-DISABLE-NEXT:    bl _someVariadicFunc1238; ARM-DISABLE-NEXT:    lsl r0, r0, #31239; ARM-DISABLE-NEXT:    mov sp, r71240; ARM-DISABLE-NEXT:    pop {r7, pc}1241; ARM-DISABLE-NEXT:  LBB7_2: @ %if.else1242; ARM-DISABLE-NEXT:    lsl r0, r1, #11243; ARM-DISABLE-NEXT:    mov sp, r71244; ARM-DISABLE-NEXT:    pop {r7, pc}1245; ARM-DISABLE-NEXT:  Lfunc_end7:1246;1247; THUMB-ENABLE-LABEL: callVariadicFunc:1248; THUMB-ENABLE:       Lfunc_begin7:1249; THUMB-ENABLE-NEXT:  @ %bb.0: @ %entry1250; THUMB-ENABLE-NEXT:    cbz r0, LBB7_21251; THUMB-ENABLE-NEXT:  @ %bb.1: @ %if.then1252; THUMB-ENABLE-NEXT:    push {r7, lr}1253; THUMB-ENABLE-NEXT:    mov r7, sp1254; THUMB-ENABLE-NEXT:    sub sp, #121255; THUMB-ENABLE-NEXT:    mov r0, r11256; THUMB-ENABLE-NEXT:    mov r2, r11257; THUMB-ENABLE-NEXT:    mov r3, r11258; THUMB-ENABLE-NEXT:    strd r1, r1, [sp]1259; THUMB-ENABLE-NEXT:    str r1, [sp, #8]1260; THUMB-ENABLE-NEXT:    bl _someVariadicFunc1261; THUMB-ENABLE-NEXT:    lsls r0, r0, #31262; THUMB-ENABLE-NEXT:    add sp, #121263; THUMB-ENABLE-NEXT:    pop {r7, pc}1264; THUMB-ENABLE-NEXT:  LBB7_2: @ %if.else1265; THUMB-ENABLE-NEXT:    lsls r0, r1, #11266; THUMB-ENABLE-NEXT:    bx lr1267; THUMB-ENABLE-NEXT:  Lfunc_end7:1268;1269; THUMB-DISABLE-LABEL: callVariadicFunc:1270; THUMB-DISABLE:       Lfunc_begin7:1271; THUMB-DISABLE-NEXT:  @ %bb.0: @ %entry1272; THUMB-DISABLE-NEXT:    push {r7, lr}1273; THUMB-DISABLE-NEXT:    mov r7, sp1274; THUMB-DISABLE-NEXT:    sub sp, #121275; THUMB-DISABLE-NEXT:    cbz r0, LBB7_21276; THUMB-DISABLE-NEXT:  @ %bb.1: @ %if.then1277; THUMB-DISABLE-NEXT:    mov r0, r11278; THUMB-DISABLE-NEXT:    mov r2, r11279; THUMB-DISABLE-NEXT:    mov r3, r11280; THUMB-DISABLE-NEXT:    strd r1, r1, [sp]1281; THUMB-DISABLE-NEXT:    str r1, [sp, #8]1282; THUMB-DISABLE-NEXT:    bl _someVariadicFunc1283; THUMB-DISABLE-NEXT:    lsls r0, r0, #31284; THUMB-DISABLE-NEXT:    add sp, #121285; THUMB-DISABLE-NEXT:    pop {r7, pc}1286; THUMB-DISABLE-NEXT:  LBB7_2: @ %if.else1287; THUMB-DISABLE-NEXT:    lsls r0, r1, #11288; THUMB-DISABLE-NEXT:    add sp, #121289; THUMB-DISABLE-NEXT:    pop {r7, pc}1290; THUMB-DISABLE-NEXT:  Lfunc_end7:1291entry:1292  %tobool = icmp eq i32 %cond, 01293  br i1 %tobool, label %if.else, label %if.then1294 1295if.then:                                          ; preds = %entry1296  %call = tail call i32 (i32, ...) @someVariadicFunc(i32 %N, i32 %N, i32 %N, i32 %N, i32 %N, i32 %N, i32 %N)1297  %shl = shl i32 %call, 31298  br label %if.end1299 1300if.else:                                          ; preds = %entry1301  %mul = shl nsw i32 %N, 11302  br label %if.end1303 1304if.end:                                           ; preds = %if.else, %if.then1305  %sum.0 = phi i32 [ %shl, %if.then ], [ %mul, %if.else ]1306  ret i32 %sum.01307}1308 1309declare i32 @someVariadicFunc(i32, ...)1310 1311; Make sure we do not insert unreachable code after noreturn function.1312; Although this is not incorrect to insert such code, it is useless1313; and it hurts the binary size.1314;1315; noreturn:1316; push1317; cmp r0, #01318; cmp r0, #01319; bne [[ABORT:LBB[0-9_]+]]1320; bne [[ABORT:LBB[0-9_]+]]1321; cbnz r0,  [[ABORT:LBB[0-9_]+]]1322; cbnz r0,  [[ABORT:LBB[0-9_]+]]1323 1324;1325; mov{{s?}} r0, #421326;1327; bx lr1328;1329; pop1330;;1331; [[ABORT]]: @ %if.abort1332;1333; push1334;1335; bl{{x?}} _abort1336; pop1337define i32 @noreturn(i8 signext %bad_thing) "frame-pointer"="all" {1338; ARM-ENABLE-LABEL: noreturn:1339; ARM-ENABLE:       Lfunc_begin8:1340; ARM-ENABLE-NEXT:  @ %bb.0: @ %entry1341; ARM-ENABLE-NEXT:    cmp r0, #01342; ARM-ENABLE-NEXT:    bne LBB8_21343; ARM-ENABLE-NEXT:  @ %bb.1: @ %if.end1344; ARM-ENABLE-NEXT:    mov r0, #421345; ARM-ENABLE-NEXT:    bx lr1346; ARM-ENABLE-NEXT:  LBB8_2: @ %if.abort1347; ARM-ENABLE-NEXT:    push {r4, r7, lr}1348; ARM-ENABLE-NEXT:    add r7, sp, #41349; ARM-ENABLE-NEXT:    @ InlineAsm Start1350; ARM-ENABLE-NEXT:    mov r0, #11351; ARM-ENABLE-NEXT:    @ InlineAsm End1352; ARM-ENABLE-NEXT:    bl _abort1353; ARM-ENABLE-NEXT:  Lfunc_end8:1354;1355; ARM-DISABLE-LABEL: noreturn:1356; ARM-DISABLE:       Lfunc_begin8:1357; ARM-DISABLE-NEXT:  @ %bb.0: @ %entry1358; ARM-DISABLE-NEXT:    push {r4, r7, lr}1359; ARM-DISABLE-NEXT:    add r7, sp, #41360; ARM-DISABLE-NEXT:    cmp r0, #01361; ARM-DISABLE-NEXT:    bne LBB8_21362; ARM-DISABLE-NEXT:  @ %bb.1: @ %if.end1363; ARM-DISABLE-NEXT:    mov r0, #421364; ARM-DISABLE-NEXT:    pop {r4, r7, pc}1365; ARM-DISABLE-NEXT:  LBB8_2: @ %if.abort1366; ARM-DISABLE-NEXT:    @ InlineAsm Start1367; ARM-DISABLE-NEXT:    mov r0, #11368; ARM-DISABLE-NEXT:    @ InlineAsm End1369; ARM-DISABLE-NEXT:    bl _abort1370; ARM-DISABLE-NEXT:  Lfunc_end8:1371;1372; THUMB-ENABLE-LABEL: noreturn:1373; THUMB-ENABLE:       Lfunc_begin8:1374; THUMB-ENABLE-NEXT:  @ %bb.0: @ %entry1375; THUMB-ENABLE-NEXT:    cbnz r0, LBB8_21376; THUMB-ENABLE-NEXT:  @ %bb.1: @ %if.end1377; THUMB-ENABLE-NEXT:    movs r0, #421378; THUMB-ENABLE-NEXT:    bx lr1379; THUMB-ENABLE-NEXT:  LBB8_2: @ %if.abort1380; THUMB-ENABLE-NEXT:    push {r4, r7, lr}1381; THUMB-ENABLE-NEXT:    add r7, sp, #41382; THUMB-ENABLE-NEXT:    @ InlineAsm Start1383; THUMB-ENABLE-NEXT:    mov.w r0, #11384; THUMB-ENABLE-NEXT:    @ InlineAsm End1385; THUMB-ENABLE-NEXT:    bl _abort1386; THUMB-ENABLE-NEXT:  Lfunc_end8:1387;1388; THUMB-DISABLE-LABEL: noreturn:1389; THUMB-DISABLE:       Lfunc_begin8:1390; THUMB-DISABLE-NEXT:  @ %bb.0: @ %entry1391; THUMB-DISABLE-NEXT:    push {r4, r7, lr}1392; THUMB-DISABLE-NEXT:    add r7, sp, #41393; THUMB-DISABLE-NEXT:    cbnz r0, LBB8_21394; THUMB-DISABLE-NEXT:  @ %bb.1: @ %if.end1395; THUMB-DISABLE-NEXT:    movs r0, #421396; THUMB-DISABLE-NEXT:    pop {r4, r7, pc}1397; THUMB-DISABLE-NEXT:  LBB8_2: @ %if.abort1398; THUMB-DISABLE-NEXT:    @ InlineAsm Start1399; THUMB-DISABLE-NEXT:    mov.w r0, #11400; THUMB-DISABLE-NEXT:    @ InlineAsm End1401; THUMB-DISABLE-NEXT:    bl _abort1402; THUMB-DISABLE-NEXT:  Lfunc_end8:1403entry:1404  %tobool = icmp eq i8 %bad_thing, 01405  br i1 %tobool, label %if.end, label %if.abort1406 1407if.abort:1408  %call = tail call i32 asm sideeffect "mov $0, #1", "=r,~{r4}"()1409  tail call void @abort() #01410  unreachable1411 1412if.end:1413  ret i32 421414}1415 1416declare void @abort() #01417 1418attributes #0 = { noreturn nounwind }1419 1420; Make sure that we handle infinite loops properly When checking that the Save1421; and Restore blocks are control flow equivalent, the loop searches for the1422; immediate (post) dominator for the (restore) save blocks. When either the Save1423; or Restore block is located in an infinite loop the only immediate (post)1424; dominator is itself. In this case, we cannot perform shrink wrapping, but we1425; should return gracefully and continue compilation.1426; The only condition for this test is the compilation finishes correctly.1427; infiniteloop1428; pop1429define void @infiniteloop() "frame-pointer"="all" {1430; ARM-LABEL: infiniteloop:1431; ARM:       @ %bb.0: @ %entry1432; ARM-NEXT:    push {r4, r5, r7, lr}1433; ARM-NEXT:    add r7, sp, #81434; ARM-NEXT:    mov r0, #01435; ARM-NEXT:    cmp r0, #01436; ARM-NEXT:    bne LBB9_31437; ARM-NEXT:  @ %bb.1: @ %if.then1438; ARM-NEXT:    sub r1, sp, #161439; ARM-NEXT:    mov sp, r11440; ARM-NEXT:  LBB9_2: @ %for.body1441; ARM-NEXT:    @ =>This Inner Loop Header: Depth=11442; ARM-NEXT:    @ InlineAsm Start1443; ARM-NEXT:    mov r2, #11444; ARM-NEXT:    @ InlineAsm End1445; ARM-NEXT:    add r0, r2, r01446; ARM-NEXT:    str r0, [r1]1447; ARM-NEXT:    b LBB9_21448; ARM-NEXT:  LBB9_3: @ %if.end1449; ARM-NEXT:    sub sp, r7, #81450; ARM-NEXT:    pop {r4, r5, r7, pc}1451;1452; THUMB-LABEL: infiniteloop:1453; THUMB:       @ %bb.0: @ %entry1454; THUMB-NEXT:    push {r4, r5, r7, lr}1455; THUMB-NEXT:    add r7, sp, #81456; THUMB-NEXT:    movs r0, #01457; THUMB-NEXT:    cbnz r0, LBB9_31458; THUMB-NEXT:  @ %bb.1: @ %if.then1459; THUMB-NEXT:    sub.w r0, sp, #161460; THUMB-NEXT:    mov sp, r01461; THUMB-NEXT:    movs r1, #01462; THUMB-NEXT:  LBB9_2: @ %for.body1463; THUMB-NEXT:    @ =>This Inner Loop Header: Depth=11464; THUMB-NEXT:    @ InlineAsm Start1465; THUMB-NEXT:    mov.w r2, #11466; THUMB-NEXT:    @ InlineAsm End1467; THUMB-NEXT:    add r1, r21468; THUMB-NEXT:    str r1, [r0]1469; THUMB-NEXT:    b LBB9_21470; THUMB-NEXT:  LBB9_3: @ %if.end1471; THUMB-NEXT:    sub.w r4, r7, #81472; THUMB-NEXT:    mov sp, r41473; THUMB-NEXT:    pop {r4, r5, r7, pc}1474; ARM-ENABLE-LABEL: infiniteloop:1475; ARM-ENABLE:       Lfunc_begin9:1476; ARM-ENABLE-NEXT:  @ %bb.0: @ %entry1477; ARM-ENABLE-NEXT:    push {r4, r5, r7, lr}1478; ARM-ENABLE-NEXT:    add r7, sp, #81479; ARM-ENABLE-NEXT:    mov r0, #01480; ARM-ENABLE-NEXT:    cmp r0, #01481; ARM-ENABLE-NEXT:    bne LBB9_31482; ARM-ENABLE-NEXT:  @ %bb.1: @ %if.then1483; ARM-ENABLE-NEXT:    sub r1, sp, #161484; ARM-ENABLE-NEXT:    mov sp, r11485; ARM-ENABLE-NEXT:  LBB9_2: @ %for.body1486; ARM-ENABLE-NEXT:    @ =>This Inner Loop Header: Depth=11487; ARM-ENABLE-NEXT:    @ InlineAsm Start1488; ARM-ENABLE-NEXT:    mov r2, #11489; ARM-ENABLE-NEXT:    @ InlineAsm End1490; ARM-ENABLE-NEXT:    add r0, r2, r01491; ARM-ENABLE-NEXT:    str r0, [r1]1492; ARM-ENABLE-NEXT:    b LBB9_21493; ARM-ENABLE-NEXT:  LBB9_3: @ %if.end1494; ARM-ENABLE-NEXT:    sub sp, r7, #81495; ARM-ENABLE-NEXT:    pop {r4, r5, r7, pc}1496; ARM-ENABLE-NEXT:  Lfunc_end9:1497;1498; ARM-DISABLE-LABEL: infiniteloop:1499; ARM-DISABLE:       Lfunc_begin9:1500; ARM-DISABLE-NEXT:  @ %bb.0: @ %entry1501; ARM-DISABLE-NEXT:    push {r4, r5, r7, lr}1502; ARM-DISABLE-NEXT:    add r7, sp, #81503; ARM-DISABLE-NEXT:    mov r0, #01504; ARM-DISABLE-NEXT:    cmp r0, #01505; ARM-DISABLE-NEXT:    bne LBB9_31506; ARM-DISABLE-NEXT:  @ %bb.1: @ %if.then1507; ARM-DISABLE-NEXT:    sub r1, sp, #161508; ARM-DISABLE-NEXT:    mov sp, r11509; ARM-DISABLE-NEXT:  LBB9_2: @ %for.body1510; ARM-DISABLE-NEXT:    @ =>This Inner Loop Header: Depth=11511; ARM-DISABLE-NEXT:    @ InlineAsm Start1512; ARM-DISABLE-NEXT:    mov r2, #11513; ARM-DISABLE-NEXT:    @ InlineAsm End1514; ARM-DISABLE-NEXT:    add r0, r2, r01515; ARM-DISABLE-NEXT:    str r0, [r1]1516; ARM-DISABLE-NEXT:    b LBB9_21517; ARM-DISABLE-NEXT:  LBB9_3: @ %if.end1518; ARM-DISABLE-NEXT:    sub sp, r7, #81519; ARM-DISABLE-NEXT:    pop {r4, r5, r7, pc}1520; ARM-DISABLE-NEXT:  Lfunc_end9:1521;1522; THUMB-ENABLE-LABEL: infiniteloop:1523; THUMB-ENABLE:       Lfunc_begin9:1524; THUMB-ENABLE-NEXT:  @ %bb.0: @ %entry1525; THUMB-ENABLE-NEXT:    push {r4, r5, r7, lr}1526; THUMB-ENABLE-NEXT:    add r7, sp, #81527; THUMB-ENABLE-NEXT:    movs r0, #01528; THUMB-ENABLE-NEXT:    cbnz r0, LBB9_31529; THUMB-ENABLE-NEXT:  @ %bb.1: @ %if.then1530; THUMB-ENABLE-NEXT:    sub.w r0, sp, #161531; THUMB-ENABLE-NEXT:    mov sp, r01532; THUMB-ENABLE-NEXT:    movs r1, #01533; THUMB-ENABLE-NEXT:  LBB9_2: @ %for.body1534; THUMB-ENABLE-NEXT:    @ =>This Inner Loop Header: Depth=11535; THUMB-ENABLE-NEXT:    @ InlineAsm Start1536; THUMB-ENABLE-NEXT:    mov.w r2, #11537; THUMB-ENABLE-NEXT:    @ InlineAsm End1538; THUMB-ENABLE-NEXT:    add r1, r21539; THUMB-ENABLE-NEXT:    str r1, [r0]1540; THUMB-ENABLE-NEXT:    b LBB9_21541; THUMB-ENABLE-NEXT:  LBB9_3: @ %if.end1542; THUMB-ENABLE-NEXT:    sub.w r4, r7, #81543; THUMB-ENABLE-NEXT:    mov sp, r41544; THUMB-ENABLE-NEXT:    pop {r4, r5, r7, pc}1545; THUMB-ENABLE-NEXT:  Lfunc_end9:1546;1547; THUMB-DISABLE-LABEL: infiniteloop:1548; THUMB-DISABLE:       Lfunc_begin9:1549; THUMB-DISABLE-NEXT:  @ %bb.0: @ %entry1550; THUMB-DISABLE-NEXT:    push {r4, r5, r7, lr}1551; THUMB-DISABLE-NEXT:    add r7, sp, #81552; THUMB-DISABLE-NEXT:    movs r0, #01553; THUMB-DISABLE-NEXT:    cbnz r0, LBB9_31554; THUMB-DISABLE-NEXT:  @ %bb.1: @ %if.then1555; THUMB-DISABLE-NEXT:    sub.w r0, sp, #161556; THUMB-DISABLE-NEXT:    mov sp, r01557; THUMB-DISABLE-NEXT:    movs r1, #01558; THUMB-DISABLE-NEXT:  LBB9_2: @ %for.body1559; THUMB-DISABLE-NEXT:    @ =>This Inner Loop Header: Depth=11560; THUMB-DISABLE-NEXT:    @ InlineAsm Start1561; THUMB-DISABLE-NEXT:    mov.w r2, #11562; THUMB-DISABLE-NEXT:    @ InlineAsm End1563; THUMB-DISABLE-NEXT:    add r1, r21564; THUMB-DISABLE-NEXT:    str r1, [r0]1565; THUMB-DISABLE-NEXT:    b LBB9_21566; THUMB-DISABLE-NEXT:  LBB9_3: @ %if.end1567; THUMB-DISABLE-NEXT:    sub.w r4, r7, #81568; THUMB-DISABLE-NEXT:    mov sp, r41569; THUMB-DISABLE-NEXT:    pop {r4, r5, r7, pc}1570; THUMB-DISABLE-NEXT:  Lfunc_end9:1571entry:1572  br i1 undef, label %if.then, label %if.end1573 1574if.then:1575  %ptr = alloca i32, i32 41576  br label %for.body1577 1578for.body:                                         ; preds = %for.body, %entry1579  %sum.03 = phi i32 [ 0, %if.then ], [ %add, %for.body ]1580  %call = tail call i32 asm sideeffect "mov $0, #1", "=r,~{r4}"()1581  %add = add nsw i32 %call, %sum.031582  store i32 %add, ptr %ptr1583  br label %for.body1584 1585if.end:1586  ret void1587}1588 1589; Another infinite loop test this time with a body bigger than just one block.1590; infiniteloop21591; pop1592define void @infiniteloop2() "frame-pointer"="all" {1593; ARM-ENABLE-LABEL: infiniteloop2:1594; ARM-ENABLE:       Lfunc_begin10:1595; ARM-ENABLE-NEXT:  @ %bb.0: @ %entry1596; ARM-ENABLE-NEXT:    push {r4, r5, r7, lr}1597; ARM-ENABLE-NEXT:    add r7, sp, #81598; ARM-ENABLE-NEXT:    mov r0, #01599; ARM-ENABLE-NEXT:    cmp r0, #01600; ARM-ENABLE-NEXT:    bne LBB10_31601; ARM-ENABLE-NEXT:  @ %bb.1: @ %if.then1602; ARM-ENABLE-NEXT:    sub r1, sp, #161603; ARM-ENABLE-NEXT:    mov sp, r11604; ARM-ENABLE-NEXT:  LBB10_2: @ %for.body1605; ARM-ENABLE-NEXT:    @ =>This Inner Loop Header: Depth=11606; ARM-ENABLE-NEXT:    @ InlineAsm Start1607; ARM-ENABLE-NEXT:    mov r2, #01608; ARM-ENABLE-NEXT:    @ InlineAsm End1609; ARM-ENABLE-NEXT:    add r0, r2, r01610; ARM-ENABLE-NEXT:    str r0, [r1]1611; ARM-ENABLE-NEXT:    @ InlineAsm Start1612; ARM-ENABLE-NEXT:    nop1613; ARM-ENABLE-NEXT:    @ InlineAsm End1614; ARM-ENABLE-NEXT:    mov r0, #11615; ARM-ENABLE-NEXT:    b LBB10_21616; ARM-ENABLE-NEXT:  LBB10_3: @ %if.end1617; ARM-ENABLE-NEXT:    sub sp, r7, #81618; ARM-ENABLE-NEXT:    pop {r4, r5, r7, pc}1619; ARM-ENABLE-NEXT:  Lfunc_end10:1620;1621; ARM-DISABLE-LABEL: infiniteloop2:1622; ARM-DISABLE:       Lfunc_begin10:1623; ARM-DISABLE-NEXT:  @ %bb.0: @ %entry1624; ARM-DISABLE-NEXT:    push {r4, r5, r7, lr}1625; ARM-DISABLE-NEXT:    add r7, sp, #81626; ARM-DISABLE-NEXT:    mov r0, #01627; ARM-DISABLE-NEXT:    cmp r0, #01628; ARM-DISABLE-NEXT:    bne LBB10_31629; ARM-DISABLE-NEXT:  @ %bb.1: @ %if.then1630; ARM-DISABLE-NEXT:    sub r1, sp, #161631; ARM-DISABLE-NEXT:    mov sp, r11632; ARM-DISABLE-NEXT:  LBB10_2: @ %for.body1633; ARM-DISABLE-NEXT:    @ =>This Inner Loop Header: Depth=11634; ARM-DISABLE-NEXT:    @ InlineAsm Start1635; ARM-DISABLE-NEXT:    mov r2, #01636; ARM-DISABLE-NEXT:    @ InlineAsm End1637; ARM-DISABLE-NEXT:    add r0, r2, r01638; ARM-DISABLE-NEXT:    str r0, [r1]1639; ARM-DISABLE-NEXT:    @ InlineAsm Start1640; ARM-DISABLE-NEXT:    nop1641; ARM-DISABLE-NEXT:    @ InlineAsm End1642; ARM-DISABLE-NEXT:    mov r0, #11643; ARM-DISABLE-NEXT:    b LBB10_21644; ARM-DISABLE-NEXT:  LBB10_3: @ %if.end1645; ARM-DISABLE-NEXT:    sub sp, r7, #81646; ARM-DISABLE-NEXT:    pop {r4, r5, r7, pc}1647; ARM-DISABLE-NEXT:  Lfunc_end10:1648;1649; THUMB-ENABLE-LABEL: infiniteloop2:1650; THUMB-ENABLE:       Lfunc_begin10:1651; THUMB-ENABLE-NEXT:  @ %bb.0: @ %entry1652; THUMB-ENABLE-NEXT:    push {r4, r5, r7, lr}1653; THUMB-ENABLE-NEXT:    add r7, sp, #81654; THUMB-ENABLE-NEXT:    movs r0, #01655; THUMB-ENABLE-NEXT:    cbnz r0, LBB10_31656; THUMB-ENABLE-NEXT:  @ %bb.1: @ %if.then1657; THUMB-ENABLE-NEXT:    sub.w r0, sp, #161658; THUMB-ENABLE-NEXT:    mov sp, r01659; THUMB-ENABLE-NEXT:    movs r1, #01660; THUMB-ENABLE-NEXT:  LBB10_2: @ %for.body1661; THUMB-ENABLE-NEXT:    @ =>This Inner Loop Header: Depth=11662; THUMB-ENABLE-NEXT:    @ InlineAsm Start1663; THUMB-ENABLE-NEXT:    mov.w r2, #01664; THUMB-ENABLE-NEXT:    @ InlineAsm End1665; THUMB-ENABLE-NEXT:    add r1, r21666; THUMB-ENABLE-NEXT:    str r1, [r0]1667; THUMB-ENABLE-NEXT:    @ InlineAsm Start1668; THUMB-ENABLE-NEXT:    nop1669; THUMB-ENABLE-NEXT:    @ InlineAsm End1670; THUMB-ENABLE-NEXT:    movs r1, #11671; THUMB-ENABLE-NEXT:    b LBB10_21672; THUMB-ENABLE-NEXT:  LBB10_3: @ %if.end1673; THUMB-ENABLE-NEXT:    sub.w r4, r7, #81674; THUMB-ENABLE-NEXT:    mov sp, r41675; THUMB-ENABLE-NEXT:    pop {r4, r5, r7, pc}1676; THUMB-ENABLE-NEXT:  Lfunc_end10:1677;1678; THUMB-DISABLE-LABEL: infiniteloop2:1679; THUMB-DISABLE:       Lfunc_begin10:1680; THUMB-DISABLE-NEXT:  @ %bb.0: @ %entry1681; THUMB-DISABLE-NEXT:    push {r4, r5, r7, lr}1682; THUMB-DISABLE-NEXT:    add r7, sp, #81683; THUMB-DISABLE-NEXT:    movs r0, #01684; THUMB-DISABLE-NEXT:    cbnz r0, LBB10_31685; THUMB-DISABLE-NEXT:  @ %bb.1: @ %if.then1686; THUMB-DISABLE-NEXT:    sub.w r0, sp, #161687; THUMB-DISABLE-NEXT:    mov sp, r01688; THUMB-DISABLE-NEXT:    movs r1, #01689; THUMB-DISABLE-NEXT:  LBB10_2: @ %for.body1690; THUMB-DISABLE-NEXT:    @ =>This Inner Loop Header: Depth=11691; THUMB-DISABLE-NEXT:    @ InlineAsm Start1692; THUMB-DISABLE-NEXT:    mov.w r2, #01693; THUMB-DISABLE-NEXT:    @ InlineAsm End1694; THUMB-DISABLE-NEXT:    add r1, r21695; THUMB-DISABLE-NEXT:    str r1, [r0]1696; THUMB-DISABLE-NEXT:    @ InlineAsm Start1697; THUMB-DISABLE-NEXT:    nop1698; THUMB-DISABLE-NEXT:    @ InlineAsm End1699; THUMB-DISABLE-NEXT:    movs r1, #11700; THUMB-DISABLE-NEXT:    b LBB10_21701; THUMB-DISABLE-NEXT:  LBB10_3: @ %if.end1702; THUMB-DISABLE-NEXT:    sub.w r4, r7, #81703; THUMB-DISABLE-NEXT:    mov sp, r41704; THUMB-DISABLE-NEXT:    pop {r4, r5, r7, pc}1705; THUMB-DISABLE-NEXT:  Lfunc_end10:1706entry:1707  br i1 undef, label %if.then, label %if.end1708 1709if.then:1710  %ptr = alloca i32, i32 41711  br label %for.body1712 1713for.body:                                         ; preds = %for.body, %entry1714  %sum.03 = phi i32 [ 0, %if.then ], [ %add, %body1 ], [ 1, %body2]1715  %call = tail call i32 asm "mov $0, #0", "=r,~{r4}"()1716  %add = add nsw i32 %call, %sum.031717  store i32 %add, ptr %ptr1718  br i1 undef, label %body1, label %body21719 1720body1:1721  tail call void asm sideeffect "nop", "~{r4}"()1722  br label %for.body1723 1724body2:1725  tail call void asm sideeffect "nop", "~{r4}"()1726  br label %for.body1727 1728if.end:1729  ret void1730}1731 1732; Another infinite loop test this time with two nested infinite loop.1733; infiniteloop31734; bx lr1735define void @infiniteloop3() "frame-pointer"="none" {1736; ARM-LABEL: infiniteloop3:1737; ARM:       @ %bb.0: @ %entry1738; ARM-NEXT:    mov r0, #01739; ARM-NEXT:    cmp r0, #01740; ARM-NEXT:    bne LBB11_51741; ARM-NEXT:  @ %bb.1: @ %loop2a.preheader1742; ARM-NEXT:    mov r1, #01743; ARM-NEXT:    mov r2, r01744; ARM-NEXT:    b LBB11_31745; ARM-NEXT:  LBB11_2: @ %loop2b1746; ARM-NEXT:    @ in Loop: Header=BB11_3 Depth=11747; ARM-NEXT:    str r1, [r2]1748; ARM-NEXT:    mov r2, r11749; ARM-NEXT:    mov r1, r31750; ARM-NEXT:  LBB11_3: @ %loop11751; ARM-NEXT:    @ =>This Inner Loop Header: Depth=11752; ARM-NEXT:    ldr r3, [r0]1753; ARM-NEXT:    cmp r0, #01754; ARM-NEXT:    bne LBB11_21755; ARM-NEXT:  @ %bb.4: @ in Loop: Header=BB11_3 Depth=11756; ARM-NEXT:    mov r0, r11757; ARM-NEXT:    mov r1, r31758; ARM-NEXT:    mov r2, r01759; ARM-NEXT:    b LBB11_31760; ARM-NEXT:  LBB11_5: @ %end1761; ARM-NEXT:    bx lr1762;1763; THUMB-LABEL: infiniteloop3:1764; THUMB:       @ %bb.0: @ %entry1765; THUMB-NEXT:    movs r0, #01766; THUMB-NEXT:    cbnz r0, LBB11_51767; THUMB-NEXT:  @ %bb.1: @ %loop2a.preheader1768; THUMB-NEXT:    movs r0, #01769; THUMB-NEXT:    movs r1, #01770; THUMB-NEXT:    mov r2, r01771; THUMB-NEXT:    b LBB11_31772; THUMB-NEXT:  LBB11_2: @ %loop2b1773; THUMB-NEXT:    @ in Loop: Header=BB11_3 Depth=11774; THUMB-NEXT:    str r1, [r2]1775; THUMB-NEXT:    mov r2, r11776; THUMB-NEXT:    mov r1, r31777; THUMB-NEXT:  LBB11_3: @ %loop11778; THUMB-NEXT:    @ =>This Inner Loop Header: Depth=11779; THUMB-NEXT:    ldr r3, [r0]1780; THUMB-NEXT:    cmp r0, #01781; THUMB-NEXT:    bne LBB11_21782; THUMB-NEXT:  @ %bb.4: @ in Loop: Header=BB11_3 Depth=11783; THUMB-NEXT:    mov r0, r11784; THUMB-NEXT:    mov r1, r31785; THUMB-NEXT:    mov r2, r01786; THUMB-NEXT:    b LBB11_31787; THUMB-NEXT:  LBB11_5: @ %end1788; THUMB-NEXT:    bx lr1789; ARM-ENABLE-LABEL: infiniteloop3:1790; ARM-ENABLE:       Lfunc_begin11:1791; ARM-ENABLE-NEXT:  @ %bb.0: @ %entry1792; ARM-ENABLE-NEXT:    mov r0, #01793; ARM-ENABLE-NEXT:    cmp r0, #01794; ARM-ENABLE-NEXT:    bne LBB11_51795; ARM-ENABLE-NEXT:  @ %bb.1: @ %loop2a.preheader1796; ARM-ENABLE-NEXT:    mov r1, #01797; ARM-ENABLE-NEXT:    mov r2, r01798; ARM-ENABLE-NEXT:    b LBB11_31799; ARM-ENABLE-NEXT:  LBB11_2: @ %loop2b1800; ARM-ENABLE-NEXT:    @ in Loop: Header=BB11_3 Depth=11801; ARM-ENABLE-NEXT:    str r1, [r2]1802; ARM-ENABLE-NEXT:    mov r2, r11803; ARM-ENABLE-NEXT:    mov r1, r31804; ARM-ENABLE-NEXT:  LBB11_3: @ %loop11805; ARM-ENABLE-NEXT:    @ =>This Inner Loop Header: Depth=11806; ARM-ENABLE-NEXT:    ldr r3, [r0]1807; ARM-ENABLE-NEXT:    cmp r0, #01808; ARM-ENABLE-NEXT:    bne LBB11_21809; ARM-ENABLE-NEXT:  @ %bb.4: @ in Loop: Header=BB11_3 Depth=11810; ARM-ENABLE-NEXT:    mov r0, r11811; ARM-ENABLE-NEXT:    mov r1, r31812; ARM-ENABLE-NEXT:    mov r2, r01813; ARM-ENABLE-NEXT:    b LBB11_31814; ARM-ENABLE-NEXT:  LBB11_5: @ %end1815; ARM-ENABLE-NEXT:    bx lr1816; ARM-ENABLE-NEXT:  Lfunc_end11:1817;1818; ARM-DISABLE-LABEL: infiniteloop3:1819; ARM-DISABLE:       Lfunc_begin11:1820; ARM-DISABLE-NEXT:  @ %bb.0: @ %entry1821; ARM-DISABLE-NEXT:    mov r0, #01822; ARM-DISABLE-NEXT:    cmp r0, #01823; ARM-DISABLE-NEXT:    bne LBB11_51824; ARM-DISABLE-NEXT:  @ %bb.1: @ %loop2a.preheader1825; ARM-DISABLE-NEXT:    mov r1, #01826; ARM-DISABLE-NEXT:    mov r2, r01827; ARM-DISABLE-NEXT:    b LBB11_31828; ARM-DISABLE-NEXT:  LBB11_2: @ %loop2b1829; ARM-DISABLE-NEXT:    @ in Loop: Header=BB11_3 Depth=11830; ARM-DISABLE-NEXT:    str r1, [r2]1831; ARM-DISABLE-NEXT:    mov r2, r11832; ARM-DISABLE-NEXT:    mov r1, r31833; ARM-DISABLE-NEXT:  LBB11_3: @ %loop11834; ARM-DISABLE-NEXT:    @ =>This Inner Loop Header: Depth=11835; ARM-DISABLE-NEXT:    ldr r3, [r0]1836; ARM-DISABLE-NEXT:    cmp r0, #01837; ARM-DISABLE-NEXT:    bne LBB11_21838; ARM-DISABLE-NEXT:  @ %bb.4: @ in Loop: Header=BB11_3 Depth=11839; ARM-DISABLE-NEXT:    mov r0, r11840; ARM-DISABLE-NEXT:    mov r1, r31841; ARM-DISABLE-NEXT:    mov r2, r01842; ARM-DISABLE-NEXT:    b LBB11_31843; ARM-DISABLE-NEXT:  LBB11_5: @ %end1844; ARM-DISABLE-NEXT:    bx lr1845; ARM-DISABLE-NEXT:  Lfunc_end11:1846;1847; THUMB-ENABLE-LABEL: infiniteloop3:1848; THUMB-ENABLE:       Lfunc_begin11:1849; THUMB-ENABLE-NEXT:  @ %bb.0: @ %entry1850; THUMB-ENABLE-NEXT:    movs r0, #01851; THUMB-ENABLE-NEXT:    cbnz r0, LBB11_51852; THUMB-ENABLE-NEXT:  @ %bb.1: @ %loop2a.preheader1853; THUMB-ENABLE-NEXT:    movs r1, #01854; THUMB-ENABLE-NEXT:    mov r2, r01855; THUMB-ENABLE-NEXT:    b LBB11_31856; THUMB-ENABLE-NEXT:  LBB11_2: @ %loop2b1857; THUMB-ENABLE-NEXT:    @ in Loop: Header=BB11_3 Depth=11858; THUMB-ENABLE-NEXT:    str r1, [r2]1859; THUMB-ENABLE-NEXT:    mov r2, r11860; THUMB-ENABLE-NEXT:    mov r1, r31861; THUMB-ENABLE-NEXT:  LBB11_3: @ %loop11862; THUMB-ENABLE-NEXT:    @ =>This Inner Loop Header: Depth=11863; THUMB-ENABLE-NEXT:    ldr r3, [r0]1864; THUMB-ENABLE-NEXT:    cmp r0, #01865; THUMB-ENABLE-NEXT:    bne LBB11_21866; THUMB-ENABLE-NEXT:  @ %bb.4: @ in Loop: Header=BB11_3 Depth=11867; THUMB-ENABLE-NEXT:    mov r0, r11868; THUMB-ENABLE-NEXT:    mov r1, r31869; THUMB-ENABLE-NEXT:    mov r2, r01870; THUMB-ENABLE-NEXT:    b LBB11_31871; THUMB-ENABLE-NEXT:  LBB11_5: @ %end1872; THUMB-ENABLE-NEXT:    bx lr1873; THUMB-ENABLE-NEXT:  Lfunc_end11:1874;1875; THUMB-DISABLE-LABEL: infiniteloop3:1876; THUMB-DISABLE:       Lfunc_begin11:1877; THUMB-DISABLE-NEXT:  @ %bb.0: @ %entry1878; THUMB-DISABLE-NEXT:    movs r0, #01879; THUMB-DISABLE-NEXT:    cbnz r0, LBB11_51880; THUMB-DISABLE-NEXT:  @ %bb.1: @ %loop2a.preheader1881; THUMB-DISABLE-NEXT:    movs r1, #01882; THUMB-DISABLE-NEXT:    mov r2, r01883; THUMB-DISABLE-NEXT:    b LBB11_31884; THUMB-DISABLE-NEXT:  LBB11_2: @ %loop2b1885; THUMB-DISABLE-NEXT:    @ in Loop: Header=BB11_3 Depth=11886; THUMB-DISABLE-NEXT:    str r1, [r2]1887; THUMB-DISABLE-NEXT:    mov r2, r11888; THUMB-DISABLE-NEXT:    mov r1, r31889; THUMB-DISABLE-NEXT:  LBB11_3: @ %loop11890; THUMB-DISABLE-NEXT:    @ =>This Inner Loop Header: Depth=11891; THUMB-DISABLE-NEXT:    ldr r3, [r0]1892; THUMB-DISABLE-NEXT:    cmp r0, #01893; THUMB-DISABLE-NEXT:    bne LBB11_21894; THUMB-DISABLE-NEXT:  @ %bb.4: @ in Loop: Header=BB11_3 Depth=11895; THUMB-DISABLE-NEXT:    mov r0, r11896; THUMB-DISABLE-NEXT:    mov r1, r31897; THUMB-DISABLE-NEXT:    mov r2, r01898; THUMB-DISABLE-NEXT:    b LBB11_31899; THUMB-DISABLE-NEXT:  LBB11_5: @ %end1900; THUMB-DISABLE-NEXT:    bx lr1901; THUMB-DISABLE-NEXT:  Lfunc_end11:1902entry:1903  br i1 undef, label %loop2a, label %body1904 1905body:                                             ; preds = %entry1906  br i1 undef, label %loop2a, label %end1907 1908loop1:                                            ; preds = %loop2a, %loop2b1909  %var.phi = phi ptr [ %next.phi, %loop2b ], [ %var, %loop2a ]1910  %next.phi = phi ptr [ %next.load, %loop2b ], [ %next.var, %loop2a ]1911  %0 = icmp eq ptr %var, null1912  %next.load = load ptr, ptr undef1913  br i1 %0, label %loop2a, label %loop2b1914 1915loop2a:                                           ; preds = %loop1, %body, %entry1916  %var = phi ptr [ null, %body ], [ null, %entry ], [ %next.phi, %loop1 ]1917  %next.var = phi ptr [ undef, %body ], [ null, %entry ], [ %next.load, %loop1 ]1918  br label %loop11919 1920loop2b:                                           ; preds = %loop11921  store ptr %next.phi, ptr %var.phi1922  br label %loop11923 1924end:1925  ret void1926}1927 1928; Function Attrs: nounwind readnone1929declare double @llvm.pow.f64(double, double)1930 1931; This function needs to spill floating point registers to1932; exercise the path where we were dereferencing the end iterator1933; to access debug info location while inserting the spill code1934; during PEI with shrink-wrapping enable.1935; debug_info:1936;1937; {{tst  r2, #1|lsls r1, r2, #31}}1938; beq      [[BB13:LBB[0-9_]+]]1939;1940; push1941;1942; {{tst  r2, #1|lsls r1, r2, #31}}1943; beq      [[BB13:LBB[0-9_]+]]1944;1945; bl{{x?}} _pow1946;1947;1948; pop1949;1950; [[BB13]]:1951; vldr1952;1953; pop1954;1955; FIXME: This is flakey passing by finding 'bl' somewhere amongst the debug1956; info (like labels named 'line_table) not because it's found a bl instruction.1957;1958; bl1959define float @debug_info(float %gamma, float %slopeLimit, i1 %or.cond, double %tmp) "frame-pointer"="all" {1960; ARM-ENABLE-LABEL: debug_info:1961; ARM-ENABLE:       Lfunc_begin12:1962; ARM-ENABLE-NEXT:  @ %bb.0: @ %bb1963; ARM-ENABLE-NEXT:    tst r2, #11964; ARM-ENABLE-NEXT:    beq LBB12_21965; ARM-ENABLE-NEXT:  @ %bb.1: @ %bb31966; ARM-ENABLE-NEXT:    push {r4, r7, lr}1967; ARM-ENABLE-NEXT:    add r7, sp, #41968; ARM-ENABLE-NEXT:    sub r4, sp, #241969; ARM-ENABLE-NEXT:    bfc r4, #0, #41970; ARM-ENABLE-NEXT:    mov sp, r41971; ARM-ENABLE-NEXT:    ldr r1, [r7, #8]1972; ARM-ENABLE-NEXT:    vmov.f64 d16, #1.000000e+001973; ARM-ENABLE-NEXT:    mov r2, r31974; ARM-ENABLE-NEXT:    vst1.64 {d8, d9}, [r4:128]1975; ARM-ENABLE-NEXT:    vmov d9, r3, r11976; ARM-ENABLE-NEXT:    vmov s16, r01977; ARM-ENABLE-NEXT:    mov r0, r31978; ARM-ENABLE-NEXT:    mov r3, r11979; ARM-ENABLE-NEXT:    vstr d10, [r4, #16]1980; ARM-ENABLE-NEXT:    vadd.f64 d10, d9, d161981; ARM-ENABLE-NEXT:    bl _pow1982; ARM-ENABLE-NEXT:    vmov.f32 s0, #1.000000e+001983; ARM-ENABLE-NEXT:    mov r4, sp1984; ARM-ENABLE-NEXT:    vmov.f64 d17, d91985; ARM-ENABLE-NEXT:    vmov d16, r0, r11986; ARM-ENABLE-NEXT:    vcmp.f32 s16, s01987; ARM-ENABLE-NEXT:    vmrs APSR_nzcv, fpscr1988; ARM-ENABLE-NEXT:    vadd.f64 d16, d16, d161989; ARM-ENABLE-NEXT:    vmovgt.f64 d17, d101990; ARM-ENABLE-NEXT:    vcmp.f64 d17, d91991; ARM-ENABLE-NEXT:    vmrs APSR_nzcv, fpscr1992; ARM-ENABLE-NEXT:    vmovne.f64 d9, d161993; ARM-ENABLE-NEXT:    vcvt.f32.f64 s0, d91994; ARM-ENABLE-NEXT:    vld1.64 {d8, d9}, [r4:128]1995; ARM-ENABLE-NEXT:    vldr d10, [r4, #16]1996; ARM-ENABLE-NEXT:    sub sp, r7, #41997; ARM-ENABLE-NEXT:    pop {r4, r7, lr}1998; ARM-ENABLE-NEXT:    vmov r0, s01999; ARM-ENABLE-NEXT:    bx lr2000; ARM-ENABLE-NEXT:  LBB12_2:2001; ARM-ENABLE-NEXT:    vldr s0, LCPI12_02002; ARM-ENABLE-NEXT:    vmov r0, s02003; ARM-ENABLE-NEXT:    bx lr2004; ARM-ENABLE-NEXT:    .p2align 22005; ARM-ENABLE-NEXT:  @ %bb.3:2006; ARM-ENABLE-NEXT:    .data_region2007; ARM-ENABLE-NEXT:  LCPI12_0:2008; ARM-ENABLE-NEXT:    .long 0x00000000 @ float 02009; ARM-ENABLE-NEXT:    .end_data_region2010; ARM-ENABLE-NEXT:  Lfunc_end12:2011;2012; ARM-DISABLE-LABEL: debug_info:2013; ARM-DISABLE:       Lfunc_begin12:2014; ARM-DISABLE-NEXT:  @ %bb.0: @ %bb2015; ARM-DISABLE-NEXT:    push {r4, r7, lr}2016; ARM-DISABLE-NEXT:    add r7, sp, #42017; ARM-DISABLE-NEXT:    sub r4, sp, #242018; ARM-DISABLE-NEXT:    bfc r4, #0, #42019; ARM-DISABLE-NEXT:    mov sp, r42020; ARM-DISABLE-NEXT:    vst1.64 {d8, d9}, [r4:128]2021; ARM-DISABLE-NEXT:    tst r2, #12022; ARM-DISABLE-NEXT:    vstr d10, [r4, #16]2023; ARM-DISABLE-NEXT:    beq LBB12_22024; ARM-DISABLE-NEXT:  @ %bb.1: @ %bb32025; ARM-DISABLE-NEXT:    ldr r1, [r7, #8]2026; ARM-DISABLE-NEXT:    vmov.f64 d16, #1.000000e+002027; ARM-DISABLE-NEXT:    mov r2, r32028; ARM-DISABLE-NEXT:    vmov d9, r3, r12029; ARM-DISABLE-NEXT:    vmov s16, r02030; ARM-DISABLE-NEXT:    mov r0, r32031; ARM-DISABLE-NEXT:    mov r3, r12032; ARM-DISABLE-NEXT:    vadd.f64 d10, d9, d162033; ARM-DISABLE-NEXT:    bl _pow2034; ARM-DISABLE-NEXT:    vmov.f32 s0, #1.000000e+002035; ARM-DISABLE-NEXT:    vmov.f64 d17, d92036; ARM-DISABLE-NEXT:    vmov d16, r0, r12037; ARM-DISABLE-NEXT:    vcmp.f32 s16, s02038; ARM-DISABLE-NEXT:    vmrs APSR_nzcv, fpscr2039; ARM-DISABLE-NEXT:    vadd.f64 d16, d16, d162040; ARM-DISABLE-NEXT:    vmovgt.f64 d17, d102041; ARM-DISABLE-NEXT:    vcmp.f64 d17, d92042; ARM-DISABLE-NEXT:    vmrs APSR_nzcv, fpscr2043; ARM-DISABLE-NEXT:    vmovne.f64 d9, d162044; ARM-DISABLE-NEXT:    vcvt.f32.f64 s0, d92045; ARM-DISABLE-NEXT:    b LBB12_32046; ARM-DISABLE-NEXT:  LBB12_2:2047; ARM-DISABLE-NEXT:    vldr s0, LCPI12_02048; ARM-DISABLE-NEXT:  LBB12_3: @ %bb132049; ARM-DISABLE-NEXT:    mov r4, sp2050; ARM-DISABLE-NEXT:    vld1.64 {d8, d9}, [r4:128]2051; ARM-DISABLE-NEXT:    vmov r0, s02052; ARM-DISABLE-NEXT:    vldr d10, [r4, #16]2053; ARM-DISABLE-NEXT:    sub sp, r7, #42054; ARM-DISABLE-NEXT:    pop {r4, r7, pc}2055; ARM-DISABLE-NEXT:    .p2align 22056; ARM-DISABLE-NEXT:  @ %bb.4:2057; ARM-DISABLE-NEXT:    .data_region2058; ARM-DISABLE-NEXT:  LCPI12_0:2059; ARM-DISABLE-NEXT:    .long 0x00000000 @ float 02060; ARM-DISABLE-NEXT:    .end_data_region2061; ARM-DISABLE-NEXT:  Lfunc_end12:2062;2063; THUMB-ENABLE-LABEL: debug_info:2064; THUMB-ENABLE:       Lfunc_begin12:2065; THUMB-ENABLE-NEXT:  @ %bb.0: @ %bb2066; THUMB-ENABLE-NEXT:    lsls r1, r2, #312067; THUMB-ENABLE-NEXT:    beq LBB12_22068; THUMB-ENABLE-NEXT:  @ %bb.1: @ %bb32069; THUMB-ENABLE-NEXT:    push {r4, r7, lr}2070; THUMB-ENABLE-NEXT:    add r7, sp, #42071; THUMB-ENABLE-NEXT:    sub.w r4, sp, #242072; THUMB-ENABLE-NEXT:    bfc r4, #0, #42073; THUMB-ENABLE-NEXT:    mov sp, r42074; THUMB-ENABLE-NEXT:    ldr r1, [r7, #8]2075; THUMB-ENABLE-NEXT:    vmov.f64 d16, #1.000000e+002076; THUMB-ENABLE-NEXT:    mov r2, r32077; THUMB-ENABLE-NEXT:    vst1.64 {d8, d9}, [r4:128]2078; THUMB-ENABLE-NEXT:    vmov d9, r3, r12079; THUMB-ENABLE-NEXT:    vmov s16, r02080; THUMB-ENABLE-NEXT:    mov r0, r32081; THUMB-ENABLE-NEXT:    mov r3, r12082; THUMB-ENABLE-NEXT:    vstr d10, [r4, #16]2083; THUMB-ENABLE-NEXT:    vadd.f64 d10, d9, d162084; THUMB-ENABLE-NEXT:    bl _pow2085; THUMB-ENABLE-NEXT:    vmov.f32 s0, #1.000000e+002086; THUMB-ENABLE-NEXT:    mov r4, sp2087; THUMB-ENABLE-NEXT:    vmov.f64 d17, d92088; THUMB-ENABLE-NEXT:    vmov d16, r0, r12089; THUMB-ENABLE-NEXT:    vcmp.f32 s16, s02090; THUMB-ENABLE-NEXT:    vmrs APSR_nzcv, fpscr2091; THUMB-ENABLE-NEXT:    it gt2092; THUMB-ENABLE-NEXT:    vmovgt.f64 d17, d102093; THUMB-ENABLE-NEXT:    vcmp.f64 d17, d92094; THUMB-ENABLE-NEXT:    vadd.f64 d16, d16, d162095; THUMB-ENABLE-NEXT:    vmrs APSR_nzcv, fpscr2096; THUMB-ENABLE-NEXT:    it ne2097; THUMB-ENABLE-NEXT:    vmovne.f64 d9, d162098; THUMB-ENABLE-NEXT:    vcvt.f32.f64 s0, d92099; THUMB-ENABLE-NEXT:    vld1.64 {d8, d9}, [r4:128]2100; THUMB-ENABLE-NEXT:    vldr d10, [r4, #16]2101; THUMB-ENABLE-NEXT:    subs r4, r7, #42102; THUMB-ENABLE-NEXT:    mov sp, r42103; THUMB-ENABLE-NEXT:    pop.w {r4, r7, lr}2104; THUMB-ENABLE-NEXT:    vmov r0, s02105; THUMB-ENABLE-NEXT:    bx lr2106; THUMB-ENABLE-NEXT:  LBB12_2:2107; THUMB-ENABLE-NEXT:    vldr s0, LCPI12_02108; THUMB-ENABLE-NEXT:    vmov r0, s02109; THUMB-ENABLE-NEXT:    bx lr2110; THUMB-ENABLE-NEXT:    .p2align 22111; THUMB-ENABLE-NEXT:  @ %bb.3:2112; THUMB-ENABLE-NEXT:    .data_region2113; THUMB-ENABLE-NEXT:  LCPI12_0:2114; THUMB-ENABLE-NEXT:    .long 0x00000000 @ float 02115; THUMB-ENABLE-NEXT:    .end_data_region2116; THUMB-ENABLE-NEXT:  Lfunc_end12:2117;2118; THUMB-DISABLE-LABEL: debug_info:2119; THUMB-DISABLE:       Lfunc_begin12:2120; THUMB-DISABLE-NEXT:  @ %bb.0: @ %bb2121; THUMB-DISABLE-NEXT:    push {r4, r7, lr}2122; THUMB-DISABLE-NEXT:    add r7, sp, #42123; THUMB-DISABLE-NEXT:    sub.w r4, sp, #242124; THUMB-DISABLE-NEXT:    bfc r4, #0, #42125; THUMB-DISABLE-NEXT:    mov sp, r42126; THUMB-DISABLE-NEXT:    vst1.64 {d8, d9}, [r4:128]2127; THUMB-DISABLE-NEXT:    lsls r1, r2, #312128; THUMB-DISABLE-NEXT:    vstr d10, [r4, #16]2129; THUMB-DISABLE-NEXT:    beq LBB12_22130; THUMB-DISABLE-NEXT:  @ %bb.1: @ %bb32131; THUMB-DISABLE-NEXT:    ldr r1, [r7, #8]2132; THUMB-DISABLE-NEXT:    vmov.f64 d16, #1.000000e+002133; THUMB-DISABLE-NEXT:    mov r2, r32134; THUMB-DISABLE-NEXT:    vmov d9, r3, r12135; THUMB-DISABLE-NEXT:    vmov s16, r02136; THUMB-DISABLE-NEXT:    mov r0, r32137; THUMB-DISABLE-NEXT:    mov r3, r12138; THUMB-DISABLE-NEXT:    vadd.f64 d10, d9, d162139; THUMB-DISABLE-NEXT:    bl _pow2140; THUMB-DISABLE-NEXT:    vmov.f32 s0, #1.000000e+002141; THUMB-DISABLE-NEXT:    vmov.f64 d17, d92142; THUMB-DISABLE-NEXT:    vmov d16, r0, r12143; THUMB-DISABLE-NEXT:    vcmp.f32 s16, s02144; THUMB-DISABLE-NEXT:    vmrs APSR_nzcv, fpscr2145; THUMB-DISABLE-NEXT:    it gt2146; THUMB-DISABLE-NEXT:    vmovgt.f64 d17, d102147; THUMB-DISABLE-NEXT:    vcmp.f64 d17, d92148; THUMB-DISABLE-NEXT:    vadd.f64 d16, d16, d162149; THUMB-DISABLE-NEXT:    vmrs APSR_nzcv, fpscr2150; THUMB-DISABLE-NEXT:    it ne2151; THUMB-DISABLE-NEXT:    vmovne.f64 d9, d162152; THUMB-DISABLE-NEXT:    vcvt.f32.f64 s0, d92153; THUMB-DISABLE-NEXT:    b LBB12_32154; THUMB-DISABLE-NEXT:  LBB12_2:2155; THUMB-DISABLE-NEXT:    vldr s0, LCPI12_02156; THUMB-DISABLE-NEXT:  LBB12_3: @ %bb132157; THUMB-DISABLE-NEXT:    mov r4, sp2158; THUMB-DISABLE-NEXT:    vld1.64 {d8, d9}, [r4:128]2159; THUMB-DISABLE-NEXT:    vmov r0, s02160; THUMB-DISABLE-NEXT:    vldr d10, [r4, #16]2161; THUMB-DISABLE-NEXT:    subs r4, r7, #42162; THUMB-DISABLE-NEXT:    mov sp, r42163; THUMB-DISABLE-NEXT:    pop {r4, r7, pc}2164; THUMB-DISABLE-NEXT:    .p2align 22165; THUMB-DISABLE-NEXT:  @ %bb.4:2166; THUMB-DISABLE-NEXT:    .data_region2167; THUMB-DISABLE-NEXT:  LCPI12_0:2168; THUMB-DISABLE-NEXT:    .long 0x00000000 @ float 02169; THUMB-DISABLE-NEXT:    .end_data_region2170; THUMB-DISABLE-NEXT:  Lfunc_end12:2171bb:2172  br i1 %or.cond, label %bb3, label %bb132173 2174bb3:                                              ; preds = %bb2175  %tmp4 = fcmp ogt float %gamma, 1.000000e+002176  %tmp5 = fadd double 1.000000e+00, %tmp2177  %tmp6 = select i1 %tmp4, double %tmp5, double %tmp2178  %tmp10 = tail call double @llvm.pow.f64(double %tmp, double %tmp)2179  %tmp11 = fcmp une double %tmp6, %tmp2180  %tmp12 = fadd double %tmp10, %tmp102181  %cutoff.0 = select i1 %tmp11, double %tmp12, double %tmp2182  %phitmp = fptrunc double %cutoff.0 to float2183  br label %bb132184 2185bb13:                                             ; preds = %bb3, %bb2186  %cutoff.1 = phi float [ 0.000000e+00, %bb ], [ %phitmp, %bb3 ]2187  ret float %cutoff.12188}2189 2190 2191!llvm.dbg.cu = !{!0}2192!llvm.module.flags = !{!3}2193 2194!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "LLVM", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !4, globals: !2, imports: !2)2195!1 = !DIFile(filename: "a.cpp", directory: "b")2196!2 = !{}2197!3 = !{i32 2, !"Debug Info Version", i32 3}2198!4 = !{!5}2199!5 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)2200