brintos

brintos / llvm-project-archived public Read only

0
0
Text · 42.5 KiB · 5806bcf Raw
1195 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -debugify-and-strip-all-safe %s -o - -mtriple=arm64-apple-ios -enable-shrink-wrap=true -disable-post-ra -frame-pointer=non-leaf | FileCheck %s --check-prefix=ENABLE3; RUN: llc -debugify-and-strip-all-safe %s -o - -enable-shrink-wrap=false -disable-post-ra -frame-pointer=non-leaf | FileCheck %s --check-prefix=DISABLE4target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"5target triple = "arm64-apple-ios"6 7 8; Initial motivating example: Simple diamond with a call just on one side.9define i32 @foo(i32 %a, i32 %b) {10; ENABLE-LABEL: foo:11; ENABLE:       ; %bb.0:12; ENABLE-NEXT:    cmp w0, w113; ENABLE-NEXT:    b.ge LBB0_214; ENABLE-NEXT:  ; %bb.1: ; %true15; ENABLE-NEXT:    sub sp, sp, #3216; ENABLE-NEXT:    stp x29, x30, [sp, #16] ; 16-byte Folded Spill17; ENABLE-NEXT:    add x29, sp, #1618; ENABLE-NEXT:    .cfi_def_cfa w29, 1619; ENABLE-NEXT:    .cfi_offset w30, -820; ENABLE-NEXT:    .cfi_offset w29, -1621; ENABLE-NEXT:    stur w0, [x29, #-4]22; ENABLE-NEXT:    sub x1, x29, #423; ENABLE-NEXT:    mov w0, wzr24; ENABLE-NEXT:    bl _doSomething25; ENABLE-NEXT:    ldp x29, x30, [sp, #16] ; 16-byte Folded Reload26; ENABLE-NEXT:    add sp, sp, #3227; ENABLE-NEXT:  LBB0_2: ; %false28; ENABLE-NEXT:    ret29;30; DISABLE-LABEL: foo:31; DISABLE:       ; %bb.0:32; DISABLE-NEXT:    sub sp, sp, #3233; DISABLE-NEXT:    stp x29, x30, [sp, #16] ; 16-byte Folded Spill34; DISABLE-NEXT:    add x29, sp, #1635; DISABLE-NEXT:    .cfi_def_cfa w29, 1636; DISABLE-NEXT:    .cfi_offset w30, -837; DISABLE-NEXT:    .cfi_offset w29, -1638; DISABLE-NEXT:    cmp w0, w139; DISABLE-NEXT:    b.ge LBB0_240; DISABLE-NEXT:  ; %bb.1: ; %true41; DISABLE-NEXT:    stur w0, [x29, #-4]42; DISABLE-NEXT:    sub x1, x29, #443; DISABLE-NEXT:    mov w0, wzr44; DISABLE-NEXT:    bl _doSomething45; DISABLE-NEXT:  LBB0_2: ; %false46; DISABLE-NEXT:    ldp x29, x30, [sp, #16] ; 16-byte Folded Reload47; DISABLE-NEXT:    add sp, sp, #3248; DISABLE-NEXT:    ret49  %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:    cbz w0, LBB1_473; ENABLE-NEXT:  ; %bb.1: ; %for.body.preheader74; ENABLE-NEXT:    stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill75; ENABLE-NEXT:    stp x29, x30, [sp, #16] ; 16-byte Folded Spill76; ENABLE-NEXT:    add x29, sp, #1677; ENABLE-NEXT:    .cfi_def_cfa w29, 1678; ENABLE-NEXT:    .cfi_offset w30, -879; ENABLE-NEXT:    .cfi_offset w29, -1680; ENABLE-NEXT:    .cfi_offset w19, -2481; ENABLE-NEXT:    .cfi_offset w20, -3282; ENABLE-NEXT:    mov w19, wzr83; ENABLE-NEXT:    mov w20, #10 ; =0xa84; ENABLE-NEXT:  LBB1_2: ; %for.body85; ENABLE-NEXT:    ; =>This Inner Loop Header: Depth=186; ENABLE-NEXT:    bl _something87; ENABLE-NEXT:    subs w20, w20, #188; ENABLE-NEXT:    add w19, w0, w1989; ENABLE-NEXT:    b.ne LBB1_290; ENABLE-NEXT:  ; %bb.3: ; %for.end91; ENABLE-NEXT:    lsl w0, w19, #392; ENABLE-NEXT:    ldp x29, x30, [sp, #16] ; 16-byte Folded Reload93; ENABLE-NEXT:    ldp x20, x19, [sp], #32 ; 16-byte Folded Reload94; ENABLE-NEXT:    ret95; ENABLE-NEXT:  LBB1_4: ; %if.else96; ENABLE-NEXT:    lsl w0, w1, #197; ENABLE-NEXT:    ret98;99; DISABLE-LABEL: freqSaveAndRestoreOutsideLoop:100; DISABLE:       ; %bb.0: ; %entry101; DISABLE-NEXT:    stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill102; DISABLE-NEXT:    stp x29, x30, [sp, #16] ; 16-byte Folded Spill103; DISABLE-NEXT:    add x29, sp, #16104; DISABLE-NEXT:    .cfi_def_cfa w29, 16105; DISABLE-NEXT:    .cfi_offset w30, -8106; DISABLE-NEXT:    .cfi_offset w29, -16107; DISABLE-NEXT:    .cfi_offset w19, -24108; DISABLE-NEXT:    .cfi_offset w20, -32109; DISABLE-NEXT:    cbz w0, LBB1_4110; DISABLE-NEXT:  ; %bb.1: ; %for.body.preheader111; DISABLE-NEXT:    mov w19, wzr112; DISABLE-NEXT:    mov w20, #10 ; =0xa113; DISABLE-NEXT:  LBB1_2: ; %for.body114; DISABLE-NEXT:    ; =>This Inner Loop Header: Depth=1115; DISABLE-NEXT:    bl _something116; DISABLE-NEXT:    subs w20, w20, #1117; DISABLE-NEXT:    add w19, w0, w19118; DISABLE-NEXT:    b.ne LBB1_2119; DISABLE-NEXT:  ; %bb.3: ; %for.end120; DISABLE-NEXT:    lsl w0, w19, #3121; DISABLE-NEXT:    b LBB1_5122; DISABLE-NEXT:  LBB1_4: ; %if.else123; DISABLE-NEXT:    lsl w0, w1, #1124; DISABLE-NEXT:  LBB1_5: ; %if.end125; DISABLE-NEXT:    ldp x29, x30, [sp, #16] ; 16-byte Folded Reload126; DISABLE-NEXT:    ldp x20, x19, [sp], #32 ; 16-byte Folded Reload127; DISABLE-NEXT:    ret128entry:129  %tobool = icmp eq i32 %cond, 0130  br i1 %tobool, label %if.else, label %for.body131 132for.body:                                         ; preds = %entry, %for.body133  %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]134  %sum.04 = phi i32 [ %add, %for.body ], [ 0, %entry ]135  %call = tail call i32 @something()136  %add = add nsw i32 %call, %sum.04137  %inc = add nuw nsw i32 %i.05, 1138  %exitcond = icmp eq i32 %inc, 10139  br i1 %exitcond, label %for.end, label %for.body140 141for.end:                                          ; preds = %for.body142  %shl = shl i32 %add, 3143  br label %if.end144 145if.else:                                          ; preds = %entry146  %mul = shl nsw i32 %N, 1147  br label %if.end148 149if.end:                                           ; preds = %if.else, %for.end150  %sum.1 = phi i32 [ %shl, %for.end ], [ %mul, %if.else ]151  ret i32 %sum.1152}153 154declare i32 @something(...)155 156; Check that we do not perform the shrink-wrapping inside the loop even157; though that would be legal. The cost model must prevent that.158define i32 @freqSaveAndRestoreOutsideLoop2(i32 %cond) {159; ENABLE-LABEL: freqSaveAndRestoreOutsideLoop2:160; ENABLE:       ; %bb.0: ; %entry161; ENABLE-NEXT:    stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill162; ENABLE-NEXT:    stp x29, x30, [sp, #16] ; 16-byte Folded Spill163; ENABLE-NEXT:    add x29, sp, #16164; ENABLE-NEXT:    .cfi_def_cfa w29, 16165; ENABLE-NEXT:    .cfi_offset w30, -8166; ENABLE-NEXT:    .cfi_offset w29, -16167; ENABLE-NEXT:    .cfi_offset w19, -24168; ENABLE-NEXT:    .cfi_offset w20, -32169; ENABLE-NEXT:    mov w19, wzr170; ENABLE-NEXT:    mov w20, #10 ; =0xa171; ENABLE-NEXT:  LBB2_1: ; %for.body172; ENABLE-NEXT:    ; =>This Inner Loop Header: Depth=1173; ENABLE-NEXT:    bl _something174; ENABLE-NEXT:    subs w20, w20, #1175; ENABLE-NEXT:    add w19, w0, w19176; ENABLE-NEXT:    b.ne LBB2_1177; ENABLE-NEXT:  ; %bb.2: ; %for.end178; ENABLE-NEXT:    mov w0, w19179; ENABLE-NEXT:    ldp x29, x30, [sp, #16] ; 16-byte Folded Reload180; ENABLE-NEXT:    ldp x20, x19, [sp], #32 ; 16-byte Folded Reload181; ENABLE-NEXT:    ret182;183; DISABLE-LABEL: freqSaveAndRestoreOutsideLoop2:184; DISABLE:       ; %bb.0: ; %entry185; DISABLE-NEXT:    stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill186; DISABLE-NEXT:    stp x29, x30, [sp, #16] ; 16-byte Folded Spill187; DISABLE-NEXT:    add x29, sp, #16188; DISABLE-NEXT:    .cfi_def_cfa w29, 16189; DISABLE-NEXT:    .cfi_offset w30, -8190; DISABLE-NEXT:    .cfi_offset w29, -16191; DISABLE-NEXT:    .cfi_offset w19, -24192; DISABLE-NEXT:    .cfi_offset w20, -32193; DISABLE-NEXT:    mov w19, wzr194; DISABLE-NEXT:    mov w20, #10 ; =0xa195; DISABLE-NEXT:  LBB2_1: ; %for.body196; DISABLE-NEXT:    ; =>This Inner Loop Header: Depth=1197; DISABLE-NEXT:    bl _something198; DISABLE-NEXT:    subs w20, w20, #1199; DISABLE-NEXT:    add w19, w0, w19200; DISABLE-NEXT:    b.ne LBB2_1201; DISABLE-NEXT:  ; %bb.2: ; %for.end202; DISABLE-NEXT:    mov w0, w19203; DISABLE-NEXT:    ldp x29, x30, [sp, #16] ; 16-byte Folded Reload204; DISABLE-NEXT:    ldp x20, x19, [sp], #32 ; 16-byte Folded Reload205; DISABLE-NEXT:    ret206entry:207  br label %for.body208 209for.body:                                         ; preds = %for.body, %entry210  %i.04 = phi i32 [ 0, %entry ], [ %inc, %for.body ]211  %sum.03 = phi i32 [ 0, %entry ], [ %add, %for.body ]212  %call = tail call i32 @something()213  %add = add nsw i32 %call, %sum.03214  %inc = add nuw nsw i32 %i.04, 1215  %exitcond = icmp eq i32 %inc, 10216  br i1 %exitcond, label %for.end, label %for.body217 218for.end:                                          ; preds = %for.body219  ret i32 %add220}221 222; Check with a more complex case that we do not have save within the loop and223; restore outside.224define i32 @loopInfoSaveOutsideLoop(i32 %cond, i32 %N) {225; ENABLE-LABEL: loopInfoSaveOutsideLoop:226; ENABLE:       ; %bb.0: ; %entry227; ENABLE-NEXT:    cbz w0, LBB3_4228; ENABLE-NEXT:  ; %bb.1: ; %for.body.preheader229; ENABLE-NEXT:    stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill230; ENABLE-NEXT:    stp x29, x30, [sp, #16] ; 16-byte Folded Spill231; ENABLE-NEXT:    add x29, sp, #16232; ENABLE-NEXT:    .cfi_def_cfa w29, 16233; ENABLE-NEXT:    .cfi_offset w30, -8234; ENABLE-NEXT:    .cfi_offset w29, -16235; ENABLE-NEXT:    .cfi_offset w19, -24236; ENABLE-NEXT:    .cfi_offset w20, -32237; ENABLE-NEXT:    mov w19, wzr238; ENABLE-NEXT:    mov w20, #10 ; =0xa239; ENABLE-NEXT:  LBB3_2: ; %for.body240; ENABLE-NEXT:    ; =>This Inner Loop Header: Depth=1241; ENABLE-NEXT:    bl _something242; ENABLE-NEXT:    subs w20, w20, #1243; ENABLE-NEXT:    add w19, w0, w19244; ENABLE-NEXT:    b.ne LBB3_2245; ENABLE-NEXT:  ; %bb.3: ; %for.end246; ENABLE-NEXT:    bl _somethingElse247; ENABLE-NEXT:    lsl w0, w19, #3248; ENABLE-NEXT:    ldp x29, x30, [sp, #16] ; 16-byte Folded Reload249; ENABLE-NEXT:    ldp x20, x19, [sp], #32 ; 16-byte Folded Reload250; ENABLE-NEXT:    ret251; ENABLE-NEXT:  LBB3_4: ; %if.else252; ENABLE-NEXT:    lsl w0, w1, #1253; ENABLE-NEXT:    ret254;255; DISABLE-LABEL: loopInfoSaveOutsideLoop:256; DISABLE:       ; %bb.0: ; %entry257; DISABLE-NEXT:    stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill258; DISABLE-NEXT:    stp x29, x30, [sp, #16] ; 16-byte Folded Spill259; DISABLE-NEXT:    add x29, sp, #16260; DISABLE-NEXT:    .cfi_def_cfa w29, 16261; DISABLE-NEXT:    .cfi_offset w30, -8262; DISABLE-NEXT:    .cfi_offset w29, -16263; DISABLE-NEXT:    .cfi_offset w19, -24264; DISABLE-NEXT:    .cfi_offset w20, -32265; DISABLE-NEXT:    cbz w0, LBB3_4266; DISABLE-NEXT:  ; %bb.1: ; %for.body.preheader267; DISABLE-NEXT:    mov w19, wzr268; DISABLE-NEXT:    mov w20, #10 ; =0xa269; DISABLE-NEXT:  LBB3_2: ; %for.body270; DISABLE-NEXT:    ; =>This Inner Loop Header: Depth=1271; DISABLE-NEXT:    bl _something272; DISABLE-NEXT:    subs w20, w20, #1273; DISABLE-NEXT:    add w19, w0, w19274; DISABLE-NEXT:    b.ne LBB3_2275; DISABLE-NEXT:  ; %bb.3: ; %for.end276; DISABLE-NEXT:    bl _somethingElse277; DISABLE-NEXT:    lsl w0, w19, #3278; DISABLE-NEXT:    b LBB3_5279; DISABLE-NEXT:  LBB3_4: ; %if.else280; DISABLE-NEXT:    lsl w0, w1, #1281; DISABLE-NEXT:  LBB3_5: ; %if.end282; DISABLE-NEXT:    ldp x29, x30, [sp, #16] ; 16-byte Folded Reload283; DISABLE-NEXT:    ldp x20, x19, [sp], #32 ; 16-byte Folded Reload284; DISABLE-NEXT:    ret285entry:286  %tobool = icmp eq i32 %cond, 0287  br i1 %tobool, label %if.else, label %for.body288 289for.body:                                         ; preds = %entry, %for.body290  %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]291  %sum.04 = phi i32 [ %add, %for.body ], [ 0, %entry ]292  %call = tail call i32 @something()293  %add = add nsw i32 %call, %sum.04294  %inc = add nuw nsw i32 %i.05, 1295  %exitcond = icmp eq i32 %inc, 10296  br i1 %exitcond, label %for.end, label %for.body297 298for.end:                                          ; preds = %for.body299  tail call void @somethingElse()300  %shl = shl i32 %add, 3301  br label %if.end302 303if.else:                                          ; preds = %entry304  %mul = shl nsw i32 %N, 1305  br label %if.end306 307if.end:                                           ; preds = %if.else, %for.end308  %sum.1 = phi i32 [ %shl, %for.end ], [ %mul, %if.else ]309  ret i32 %sum.1310}311 312declare void @somethingElse(...)313 314; Check with a more complex case that we do not have restore within the loop and315; save outside.316define i32 @loopInfoRestoreOutsideLoop(i32 %cond, i32 %N) nounwind uwtable {317; ENABLE-LABEL: loopInfoRestoreOutsideLoop:318; ENABLE:       ; %bb.0: ; %entry319; ENABLE-NEXT:    cbz w0, LBB4_4320; ENABLE-NEXT:  ; %bb.1: ; %if.then321; ENABLE-NEXT:    stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill322; ENABLE-NEXT:    .cfi_def_cfa_offset 32323; ENABLE-NEXT:    stp x29, x30, [sp, #16] ; 16-byte Folded Spill324; ENABLE-NEXT:    add x29, sp, #16325; ENABLE-NEXT:    .cfi_def_cfa w29, 16326; ENABLE-NEXT:    .cfi_offset w30, -8327; ENABLE-NEXT:    .cfi_offset w29, -16328; ENABLE-NEXT:    .cfi_offset w19, -24329; ENABLE-NEXT:    .cfi_offset w20, -32330; ENABLE-NEXT:    bl _somethingElse331; ENABLE-NEXT:    mov w19, wzr332; ENABLE-NEXT:    mov w20, #10 ; =0xa333; ENABLE-NEXT:  LBB4_2: ; %for.body334; ENABLE-NEXT:    ; =>This Inner Loop Header: Depth=1335; ENABLE-NEXT:    bl _something336; ENABLE-NEXT:    subs w20, w20, #1337; ENABLE-NEXT:    add w19, w0, w19338; ENABLE-NEXT:    b.ne LBB4_2339; ENABLE-NEXT:  ; %bb.3: ; %for.end340; ENABLE-NEXT:    lsl w0, w19, #3341; ENABLE-NEXT:    .cfi_def_cfa wsp, 32342; ENABLE-NEXT:    ldp x29, x30, [sp, #16] ; 16-byte Folded Reload343; ENABLE-NEXT:    ldp x20, x19, [sp], #32 ; 16-byte Folded Reload344; ENABLE-NEXT:    .cfi_def_cfa_offset 0345; ENABLE-NEXT:    .cfi_restore w30346; ENABLE-NEXT:    .cfi_restore w29347; ENABLE-NEXT:    .cfi_restore w19348; ENABLE-NEXT:    .cfi_restore w20349; ENABLE-NEXT:    ret350; ENABLE-NEXT:  LBB4_4: ; %if.else351; ENABLE-NEXT:    lsl w0, w1, #1352; ENABLE-NEXT:    ret353;354; DISABLE-LABEL: loopInfoRestoreOutsideLoop:355; DISABLE:       ; %bb.0: ; %entry356; DISABLE-NEXT:    stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill357; DISABLE-NEXT:    .cfi_def_cfa_offset 32358; DISABLE-NEXT:    stp x29, x30, [sp, #16] ; 16-byte Folded Spill359; DISABLE-NEXT:    add x29, sp, #16360; DISABLE-NEXT:    .cfi_def_cfa w29, 16361; DISABLE-NEXT:    .cfi_offset w30, -8362; DISABLE-NEXT:    .cfi_offset w29, -16363; DISABLE-NEXT:    .cfi_offset w19, -24364; DISABLE-NEXT:    .cfi_offset w20, -32365; DISABLE-NEXT:    cbz w0, LBB4_4366; DISABLE-NEXT:  ; %bb.1: ; %if.then367; DISABLE-NEXT:    bl _somethingElse368; DISABLE-NEXT:    mov w19, wzr369; DISABLE-NEXT:    mov w20, #10 ; =0xa370; DISABLE-NEXT:  LBB4_2: ; %for.body371; DISABLE-NEXT:    ; =>This Inner Loop Header: Depth=1372; DISABLE-NEXT:    bl _something373; DISABLE-NEXT:    subs w20, w20, #1374; DISABLE-NEXT:    add w19, w0, w19375; DISABLE-NEXT:    b.ne LBB4_2376; DISABLE-NEXT:  ; %bb.3: ; %for.end377; DISABLE-NEXT:    lsl w0, w19, #3378; DISABLE-NEXT:    b LBB4_5379; DISABLE-NEXT:  LBB4_4: ; %if.else380; DISABLE-NEXT:    lsl w0, w1, #1381; DISABLE-NEXT:  LBB4_5: ; %if.end382; DISABLE-NEXT:    .cfi_def_cfa wsp, 32383; DISABLE-NEXT:    ldp x29, x30, [sp, #16] ; 16-byte Folded Reload384; DISABLE-NEXT:    ldp x20, x19, [sp], #32 ; 16-byte Folded Reload385; DISABLE-NEXT:    .cfi_def_cfa_offset 0386; DISABLE-NEXT:    .cfi_restore w30387; DISABLE-NEXT:    .cfi_restore w29388; DISABLE-NEXT:    .cfi_restore w19389; DISABLE-NEXT:    .cfi_restore w20390; DISABLE-NEXT:    ret391entry:392  %tobool = icmp eq i32 %cond, 0393  br i1 %tobool, label %if.else, label %if.then394 395if.then:                                          ; preds = %entry396  tail call void @somethingElse()397  br label %for.body398 399for.body:                                         ; preds = %for.body, %if.then400  %i.05 = phi i32 [ 0, %if.then ], [ %inc, %for.body ]401  %sum.04 = phi i32 [ 0, %if.then ], [ %add, %for.body ]402  %call = tail call i32 @something()403  %add = add nsw i32 %call, %sum.04404  %inc = add nuw nsw i32 %i.05, 1405  %exitcond = icmp eq i32 %inc, 10406  br i1 %exitcond, label %for.end, label %for.body407 408for.end:                                          ; preds = %for.body409  %shl = shl i32 %add, 3410  br label %if.end411 412if.else:                                          ; preds = %entry413  %mul = shl nsw i32 %N, 1414  br label %if.end415 416if.end:                                           ; preds = %if.else, %for.end417  %sum.1 = phi i32 [ %shl, %for.end ], [ %mul, %if.else ]418  ret i32 %sum.1419}420 421; Check that we handle function with no frame information correctly.422define i32 @emptyFrame() {423; ENABLE-LABEL: emptyFrame:424; ENABLE:       ; %bb.0: ; %entry425; ENABLE-NEXT:    mov w0, wzr426; ENABLE-NEXT:    ret427;428; DISABLE-LABEL: emptyFrame:429; DISABLE:       ; %bb.0: ; %entry430; DISABLE-NEXT:    mov w0, wzr431; DISABLE-NEXT:    ret432entry:433  ret i32 0434}435 436; Check that we handle variadic function correctly.437define i32 @variadicFunc(i32 %cond, i32 %count, ...) nounwind uwtable {438; ENABLE-LABEL: variadicFunc:439; ENABLE:       ; %bb.0: ; %entry440; ENABLE-NEXT:    cbz w0, LBB6_4441; ENABLE-NEXT:  ; %bb.1: ; %if.then442; ENABLE-NEXT:    sub sp, sp, #16443; ENABLE-NEXT:    .cfi_def_cfa_offset 16444; ENABLE-NEXT:    add x8, sp, #16445; ENABLE-NEXT:    cmp w1, #1446; ENABLE-NEXT:    str x8, [sp, #8]447; ENABLE-NEXT:    mov w0, wzr448; ENABLE-NEXT:    b.lt LBB6_3449; ENABLE-NEXT:  LBB6_2: ; %for.body450; ENABLE-NEXT:    ; =>This Inner Loop Header: Depth=1451; ENABLE-NEXT:    ldr x8, [sp, #8]452; ENABLE-NEXT:    add x9, x8, #8453; ENABLE-NEXT:    str x9, [sp, #8]454; ENABLE-NEXT:    ldr w8, [x8]455; ENABLE-NEXT:    subs w1, w1, #1456; ENABLE-NEXT:    add w0, w0, w8457; ENABLE-NEXT:    b.ne LBB6_2458; ENABLE-NEXT:  LBB6_3: ; %for.end459; ENABLE-NEXT:    add sp, sp, #16460; ENABLE-NEXT:    .cfi_def_cfa_offset 0461; ENABLE-NEXT:    ret462; ENABLE-NEXT:  LBB6_4: ; %if.else463; ENABLE-NEXT:    lsl w0, w1, #1464; ENABLE-NEXT:    ret465;466; DISABLE-LABEL: variadicFunc:467; DISABLE:       ; %bb.0: ; %entry468; DISABLE-NEXT:    sub sp, sp, #16469; DISABLE-NEXT:    .cfi_def_cfa_offset 16470; DISABLE-NEXT:    cbz w0, LBB6_3471; DISABLE-NEXT:  ; %bb.1: ; %if.then472; DISABLE-NEXT:    add x8, sp, #16473; DISABLE-NEXT:    cmp w1, #1474; DISABLE-NEXT:    str x8, [sp, #8]475; DISABLE-NEXT:    mov w0, wzr476; DISABLE-NEXT:    b.lt LBB6_4477; DISABLE-NEXT:  LBB6_2: ; %for.body478; DISABLE-NEXT:    ; =>This Inner Loop Header: Depth=1479; DISABLE-NEXT:    ldr x8, [sp, #8]480; DISABLE-NEXT:    add x9, x8, #8481; DISABLE-NEXT:    str x9, [sp, #8]482; DISABLE-NEXT:    ldr w8, [x8]483; DISABLE-NEXT:    subs w1, w1, #1484; DISABLE-NEXT:    add w0, w0, w8485; DISABLE-NEXT:    b.ne LBB6_2486; DISABLE-NEXT:    b LBB6_4487; DISABLE-NEXT:  LBB6_3: ; %if.else488; DISABLE-NEXT:    lsl w0, w1, #1489; DISABLE-NEXT:  LBB6_4: ; %if.end490; DISABLE-NEXT:    add sp, sp, #16491; DISABLE-NEXT:    .cfi_def_cfa_offset 0492; DISABLE-NEXT:    ret493entry:494  %ap = alloca ptr, align 8495  %tobool = icmp eq i32 %cond, 0496  br i1 %tobool, label %if.else, label %if.then497 498if.then:                                          ; preds = %entry499  call void @llvm.va_start(ptr %ap)500  %cmp6 = icmp sgt i32 %count, 0501  br i1 %cmp6, label %for.body, label %for.end502 503for.body:                                         ; preds = %if.then, %for.body504  %i.08 = phi i32 [ %inc, %for.body ], [ 0, %if.then ]505  %sum.07 = phi i32 [ %add, %for.body ], [ 0, %if.then ]506  %0 = va_arg ptr %ap, i32507  %add = add nsw i32 %sum.07, %0508  %inc = add nuw nsw i32 %i.08, 1509  %exitcond = icmp eq i32 %inc, %count510  br i1 %exitcond, label %for.end, label %for.body511 512for.end:                                          ; preds = %for.body, %if.then513  %sum.0.lcssa = phi i32 [ 0, %if.then ], [ %add, %for.body ]514  call void @llvm.va_end(ptr %ap)515  br label %if.end516 517if.else:                                          ; preds = %entry518  %mul = shl nsw i32 %count, 1519  br label %if.end520 521if.end:                                           ; preds = %if.else, %for.end522  %sum.1 = phi i32 [ %sum.0.lcssa, %for.end ], [ %mul, %if.else ]523  ret i32 %sum.1524}525 526declare void @llvm.va_start(ptr)527 528declare void @llvm.va_end(ptr)529 530; Check that we handle inline asm correctly.531define i32 @inlineAsm(i32 %cond, i32 %N) {532; ENABLE-LABEL: inlineAsm:533; ENABLE:       ; %bb.0: ; %entry534; ENABLE-NEXT:    cbz w0, LBB7_4535; ENABLE-NEXT:  ; %bb.1: ; %for.body.preheader536; ENABLE-NEXT:    stp x20, x19, [sp, #-16]! ; 16-byte Folded Spill537; ENABLE-NEXT:    .cfi_def_cfa_offset 16538; ENABLE-NEXT:    .cfi_offset w19, -8539; ENABLE-NEXT:    .cfi_offset w20, -16540; ENABLE-NEXT:    mov w8, #10 ; =0xa541; ENABLE-NEXT:  LBB7_2: ; %for.body542; ENABLE-NEXT:    ; =>This Inner Loop Header: Depth=1543; ENABLE-NEXT:    subs w8, w8, #1544; ENABLE-NEXT:    ; InlineAsm Start545; ENABLE-NEXT:    add x19, x19, #1546; ENABLE-NEXT:    ; InlineAsm End547; ENABLE-NEXT:    b.ne LBB7_2548; ENABLE-NEXT:  ; %bb.3:549; ENABLE-NEXT:    mov w0, wzr550; ENABLE-NEXT:    ldp x20, x19, [sp], #16 ; 16-byte Folded Reload551; ENABLE-NEXT:    ret552; ENABLE-NEXT:  LBB7_4: ; %if.else553; ENABLE-NEXT:    lsl w0, w1, #1554; ENABLE-NEXT:    ret555;556; DISABLE-LABEL: inlineAsm:557; DISABLE:       ; %bb.0: ; %entry558; DISABLE-NEXT:    stp x20, x19, [sp, #-16]! ; 16-byte Folded Spill559; DISABLE-NEXT:    .cfi_def_cfa_offset 16560; DISABLE-NEXT:    .cfi_offset w19, -8561; DISABLE-NEXT:    .cfi_offset w20, -16562; DISABLE-NEXT:    cbz w0, LBB7_4563; DISABLE-NEXT:  ; %bb.1: ; %for.body.preheader564; DISABLE-NEXT:    mov w8, #10 ; =0xa565; DISABLE-NEXT:  LBB7_2: ; %for.body566; DISABLE-NEXT:    ; =>This Inner Loop Header: Depth=1567; DISABLE-NEXT:    subs w8, w8, #1568; DISABLE-NEXT:    ; InlineAsm Start569; DISABLE-NEXT:    add x19, x19, #1570; DISABLE-NEXT:    ; InlineAsm End571; DISABLE-NEXT:    b.ne LBB7_2572; DISABLE-NEXT:  ; %bb.3:573; DISABLE-NEXT:    mov w0, wzr574; DISABLE-NEXT:    ldp x20, x19, [sp], #16 ; 16-byte Folded Reload575; DISABLE-NEXT:    ret576; DISABLE-NEXT:  LBB7_4: ; %if.else577; DISABLE-NEXT:    lsl w0, w1, #1578; DISABLE-NEXT:    ldp x20, x19, [sp], #16 ; 16-byte Folded Reload579; DISABLE-NEXT:    ret580entry:581  %tobool = icmp eq i32 %cond, 0582  br i1 %tobool, label %if.else, label %for.body583 584for.body:                                         ; preds = %entry, %for.body585  %i.03 = phi i32 [ %inc, %for.body ], [ 0, %entry ]586  tail call void asm sideeffect "add x19, x19, #1", "~{x19}"()587  %inc = add nuw nsw i32 %i.03, 1588  %exitcond = icmp eq i32 %inc, 10589  br i1 %exitcond, label %if.end, label %for.body590 591if.else:                                          ; preds = %entry592  %mul = shl nsw i32 %N, 1593  br label %if.end594 595if.end:                                           ; preds = %for.body, %if.else596  %sum.0 = phi i32 [ %mul, %if.else ], [ 0, %for.body ]597  ret i32 %sum.0598}599 600; Check that we handle calls to variadic functions correctly.601define i32 @callVariadicFunc(i32 %cond, i32 %N) {602; ENABLE-LABEL: callVariadicFunc:603; ENABLE:       ; %bb.0: ; %entry604; ENABLE-NEXT:    ; kill: def $w1 killed $w1 def $x1605; ENABLE-NEXT:    cbz w0, LBB8_2606; ENABLE-NEXT:  ; %bb.1: ; %if.then607; ENABLE-NEXT:    sub sp, sp, #64608; ENABLE-NEXT:    stp x29, x30, [sp, #48] ; 16-byte Folded Spill609; ENABLE-NEXT:    add x29, sp, #48610; ENABLE-NEXT:    .cfi_def_cfa w29, 16611; ENABLE-NEXT:    .cfi_offset w30, -8612; ENABLE-NEXT:    .cfi_offset w29, -16613; ENABLE-NEXT:    stp x1, x1, [sp, #32]614; ENABLE-NEXT:    stp x1, x1, [sp, #16]615; ENABLE-NEXT:    stp x1, x1, [sp]616; ENABLE-NEXT:    mov w0, w1617; ENABLE-NEXT:    bl _someVariadicFunc618; ENABLE-NEXT:    lsl w0, w0, #3619; ENABLE-NEXT:    ldp x29, x30, [sp, #48] ; 16-byte Folded Reload620; ENABLE-NEXT:    add sp, sp, #64621; ENABLE-NEXT:    ret622; ENABLE-NEXT:  LBB8_2: ; %if.else623; ENABLE-NEXT:    lsl w0, w1, #1624; ENABLE-NEXT:    ret625;626; DISABLE-LABEL: callVariadicFunc:627; DISABLE:       ; %bb.0: ; %entry628; DISABLE-NEXT:    sub sp, sp, #64629; DISABLE-NEXT:    stp x29, x30, [sp, #48] ; 16-byte Folded Spill630; DISABLE-NEXT:    add x29, sp, #48631; DISABLE-NEXT:    .cfi_def_cfa w29, 16632; DISABLE-NEXT:    .cfi_offset w30, -8633; DISABLE-NEXT:    .cfi_offset w29, -16634; DISABLE-NEXT:    ; kill: def $w1 killed $w1 def $x1635; DISABLE-NEXT:    cbz w0, LBB8_2636; DISABLE-NEXT:  ; %bb.1: ; %if.then637; DISABLE-NEXT:    stp x1, x1, [sp, #32]638; DISABLE-NEXT:    stp x1, x1, [sp, #16]639; DISABLE-NEXT:    stp x1, x1, [sp]640; DISABLE-NEXT:    mov w0, w1641; DISABLE-NEXT:    bl _someVariadicFunc642; DISABLE-NEXT:    lsl w0, w0, #3643; DISABLE-NEXT:    b LBB8_3644; DISABLE-NEXT:  LBB8_2: ; %if.else645; DISABLE-NEXT:    lsl w0, w1, #1646; DISABLE-NEXT:  LBB8_3: ; %if.end647; DISABLE-NEXT:    ldp x29, x30, [sp, #48] ; 16-byte Folded Reload648; DISABLE-NEXT:    add sp, sp, #64649; DISABLE-NEXT:    ret650entry:651  %tobool = icmp eq i32 %cond, 0652  br i1 %tobool, label %if.else, label %if.then653 654if.then:                                          ; preds = %entry655  %call = tail call i32 (i32, ...) @someVariadicFunc(i32 %N, i32 %N, i32 %N, i32 %N, i32 %N, i32 %N, i32 %N)656  %shl = shl i32 %call, 3657  br label %if.end658 659if.else:                                          ; preds = %entry660  %mul = shl nsw i32 %N, 1661  br label %if.end662 663if.end:                                           ; preds = %if.else, %if.then664  %sum.0 = phi i32 [ %shl, %if.then ], [ %mul, %if.else ]665  ret i32 %sum.0666}667 668declare i32 @someVariadicFunc(i32, ...)669 670; Make sure we do not insert unreachable code after noreturn function.671; Although this is not incorrect to insert such code, it is useless672; and it hurts the binary size.673;674define i32 @noreturn(i8 signext %bad_thing) {675; ENABLE-LABEL: noreturn:676; ENABLE:       ; %bb.0: ; %entry677; ENABLE-NEXT:    cbnz w0, LBB9_2678; ENABLE-NEXT:  ; %bb.1: ; %if.end679; ENABLE-NEXT:    mov w0, #42 ; =0x2a680; ENABLE-NEXT:    ret681; ENABLE-NEXT:  LBB9_2: ; %if.abort682; ENABLE-NEXT:    stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill683; ENABLE-NEXT:    mov x29, sp684; ENABLE-NEXT:    .cfi_def_cfa w29, 16685; ENABLE-NEXT:    .cfi_offset w30, -8686; ENABLE-NEXT:    .cfi_offset w29, -16687; ENABLE-NEXT:    bl _abort688;689; DISABLE-LABEL: noreturn:690; DISABLE:       ; %bb.0: ; %entry691; DISABLE-NEXT:    stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill692; DISABLE-NEXT:    mov x29, sp693; DISABLE-NEXT:    .cfi_def_cfa w29, 16694; DISABLE-NEXT:    .cfi_offset w30, -8695; DISABLE-NEXT:    .cfi_offset w29, -16696; DISABLE-NEXT:    cbnz w0, LBB9_2697; DISABLE-NEXT:  ; %bb.1: ; %if.end698; DISABLE-NEXT:    mov w0, #42 ; =0x2a699; DISABLE-NEXT:    ldp x29, x30, [sp], #16 ; 16-byte Folded Reload700; DISABLE-NEXT:    ret701; DISABLE-NEXT:  LBB9_2: ; %if.abort702; DISABLE-NEXT:    bl _abort703entry:704  %tobool = icmp eq i8 %bad_thing, 0705  br i1 %tobool, label %if.end, label %if.abort706 707if.abort:708  tail call void @abort() #0709  unreachable710 711if.end:712  ret i32 42713}714 715declare void @abort() #0716 717attributes #0 = { noreturn nounwind }718 719; Make sure that we handle infinite loops properly When checking that the Save720; and Restore blocks are control flow equivalent, the loop searches for the721; immediate (post) dominator for the (restore) save blocks. When either the Save722; or Restore block is located in an infinite loop the only immediate (post)723; dominator is itself. In this case, we cannot perform shrink wrapping, but we724; should return gracefully and continue compilation.725; The only condition for this test is the compilation finishes correctly.726;727define void @infiniteloop() {728; ENABLE-LABEL: infiniteloop:729; ENABLE:       ; %bb.0: ; %entry730; ENABLE-NEXT:    stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill731; ENABLE-NEXT:    stp x29, x30, [sp, #16] ; 16-byte Folded Spill732; ENABLE-NEXT:    add x29, sp, #16733; ENABLE-NEXT:    .cfi_def_cfa w29, 16734; ENABLE-NEXT:    .cfi_offset w30, -8735; ENABLE-NEXT:    .cfi_offset w29, -16736; ENABLE-NEXT:    .cfi_offset w19, -24737; ENABLE-NEXT:    .cfi_offset w20, -32738; ENABLE-NEXT:    cbnz wzr, LBB10_3739; ENABLE-NEXT:  ; %bb.1: ; %if.then740; ENABLE-NEXT:    sub x19, sp, #16741; ENABLE-NEXT:    mov sp, x19742; ENABLE-NEXT:    mov w20, wzr743; ENABLE-NEXT:  LBB10_2: ; %for.body744; ENABLE-NEXT:    ; =>This Inner Loop Header: Depth=1745; ENABLE-NEXT:    bl _something746; ENABLE-NEXT:    add w20, w0, w20747; ENABLE-NEXT:    str w20, [x19]748; ENABLE-NEXT:    b LBB10_2749; ENABLE-NEXT:  LBB10_3: ; %if.end750; ENABLE-NEXT:    sub sp, x29, #16751; ENABLE-NEXT:    ldp x29, x30, [sp, #16] ; 16-byte Folded Reload752; ENABLE-NEXT:    ldp x20, x19, [sp], #32 ; 16-byte Folded Reload753; ENABLE-NEXT:    ret754;755; DISABLE-LABEL: infiniteloop:756; DISABLE:       ; %bb.0: ; %entry757; DISABLE-NEXT:    stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill758; DISABLE-NEXT:    stp x29, x30, [sp, #16] ; 16-byte Folded Spill759; DISABLE-NEXT:    add x29, sp, #16760; DISABLE-NEXT:    .cfi_def_cfa w29, 16761; DISABLE-NEXT:    .cfi_offset w30, -8762; DISABLE-NEXT:    .cfi_offset w29, -16763; DISABLE-NEXT:    .cfi_offset w19, -24764; DISABLE-NEXT:    .cfi_offset w20, -32765; DISABLE-NEXT:    cbnz wzr, LBB10_3766; DISABLE-NEXT:  ; %bb.1: ; %if.then767; DISABLE-NEXT:    sub x19, sp, #16768; DISABLE-NEXT:    mov sp, x19769; DISABLE-NEXT:    mov w20, wzr770; DISABLE-NEXT:  LBB10_2: ; %for.body771; DISABLE-NEXT:    ; =>This Inner Loop Header: Depth=1772; DISABLE-NEXT:    bl _something773; DISABLE-NEXT:    add w20, w0, w20774; DISABLE-NEXT:    str w20, [x19]775; DISABLE-NEXT:    b LBB10_2776; DISABLE-NEXT:  LBB10_3: ; %if.end777; DISABLE-NEXT:    sub sp, x29, #16778; DISABLE-NEXT:    ldp x29, x30, [sp, #16] ; 16-byte Folded Reload779; DISABLE-NEXT:    ldp x20, x19, [sp], #32 ; 16-byte Folded Reload780; DISABLE-NEXT:    ret781entry:782  br i1 undef, label %if.then, label %if.end783 784if.then:785  %ptr = alloca i32, i32 4786  br label %for.body787 788for.body:                                         ; preds = %for.body, %entry789  %sum.03 = phi i32 [ 0, %if.then ], [ %add, %for.body ]790  %call = tail call i32 @something()791  %add = add nsw i32 %call, %sum.03792  store i32 %add, ptr %ptr793  br label %for.body794 795if.end:796  ret void797}798 799; Another infinite loop test this time with a body bigger than just one block.800define void @infiniteloop2() {801; ENABLE-LABEL: infiniteloop2:802; ENABLE:       ; %bb.0: ; %entry803; ENABLE-NEXT:    stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill804; ENABLE-NEXT:    stp x29, x30, [sp, #16] ; 16-byte Folded Spill805; ENABLE-NEXT:    add x29, sp, #16806; ENABLE-NEXT:    .cfi_def_cfa w29, 16807; ENABLE-NEXT:    .cfi_offset w30, -8808; ENABLE-NEXT:    .cfi_offset w29, -16809; ENABLE-NEXT:    .cfi_offset w19, -24810; ENABLE-NEXT:    .cfi_offset w20, -32811; ENABLE-NEXT:    cbnz wzr, LBB11_3812; ENABLE-NEXT:  ; %bb.1: ; %if.then813; ENABLE-NEXT:    sub x8, sp, #16814; ENABLE-NEXT:    mov sp, x8815; ENABLE-NEXT:    mov w9, wzr816; ENABLE-NEXT:  LBB11_2: ; %for.body817; ENABLE-NEXT:    ; =>This Inner Loop Header: Depth=1818; ENABLE-NEXT:    ; InlineAsm Start819; ENABLE-NEXT:    mov x10, #0 ; =0x0820; ENABLE-NEXT:    ; InlineAsm End821; ENABLE-NEXT:    add w10, w10, w9822; ENABLE-NEXT:    mov w9, #1 ; =0x1823; ENABLE-NEXT:    str w10, [x8]824; ENABLE-NEXT:    ; InlineAsm Start825; ENABLE-NEXT:    nop826; ENABLE-NEXT:    ; InlineAsm End827; ENABLE-NEXT:    b LBB11_2828; ENABLE-NEXT:  LBB11_3: ; %if.end829; ENABLE-NEXT:    sub sp, x29, #16830; ENABLE-NEXT:    ldp x29, x30, [sp, #16] ; 16-byte Folded Reload831; ENABLE-NEXT:    ldp x20, x19, [sp], #32 ; 16-byte Folded Reload832; ENABLE-NEXT:    ret833;834; DISABLE-LABEL: infiniteloop2:835; DISABLE:       ; %bb.0: ; %entry836; DISABLE-NEXT:    stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill837; DISABLE-NEXT:    stp x29, x30, [sp, #16] ; 16-byte Folded Spill838; DISABLE-NEXT:    add x29, sp, #16839; DISABLE-NEXT:    .cfi_def_cfa w29, 16840; DISABLE-NEXT:    .cfi_offset w30, -8841; DISABLE-NEXT:    .cfi_offset w29, -16842; DISABLE-NEXT:    .cfi_offset w19, -24843; DISABLE-NEXT:    .cfi_offset w20, -32844; DISABLE-NEXT:    cbnz wzr, LBB11_3845; DISABLE-NEXT:  ; %bb.1: ; %if.then846; DISABLE-NEXT:    sub x8, sp, #16847; DISABLE-NEXT:    mov sp, x8848; DISABLE-NEXT:    mov w9, wzr849; DISABLE-NEXT:  LBB11_2: ; %for.body850; DISABLE-NEXT:    ; =>This Inner Loop Header: Depth=1851; DISABLE-NEXT:    ; InlineAsm Start852; DISABLE-NEXT:    mov x10, #0 ; =0x0853; DISABLE-NEXT:    ; InlineAsm End854; DISABLE-NEXT:    add w10, w10, w9855; DISABLE-NEXT:    mov w9, #1 ; =0x1856; DISABLE-NEXT:    str w10, [x8]857; DISABLE-NEXT:    ; InlineAsm Start858; DISABLE-NEXT:    nop859; DISABLE-NEXT:    ; InlineAsm End860; DISABLE-NEXT:    b LBB11_2861; DISABLE-NEXT:  LBB11_3: ; %if.end862; DISABLE-NEXT:    sub sp, x29, #16863; DISABLE-NEXT:    ldp x29, x30, [sp, #16] ; 16-byte Folded Reload864; DISABLE-NEXT:    ldp x20, x19, [sp], #32 ; 16-byte Folded Reload865; DISABLE-NEXT:    ret866entry:867  br i1 undef, label %if.then, label %if.end868 869if.then:870  %ptr = alloca i32, i32 4871  br label %for.body872 873for.body:                                         ; preds = %for.body, %entry874  %sum.03 = phi i32 [ 0, %if.then ], [ %add, %body1 ], [ 1, %body2]875  %call = tail call i32 asm "mov $0, #0", "=r,~{x19}"()876  %add = add nsw i32 %call, %sum.03877  store i32 %add, ptr %ptr878  br i1 undef, label %body1, label %body2879 880body1:881  tail call void asm sideeffect "nop", "~{x19}"()882  br label %for.body883 884body2:885  tail call void asm sideeffect "nop", "~{x19}"()886  br label %for.body887 888if.end:889  ret void890}891 892; Another infinite loop test this time with two nested infinite loop.893define void @infiniteloop3() {894; ENABLE-LABEL: infiniteloop3:895; ENABLE:       ; %bb.0: ; %entry896; ENABLE-NEXT:    cbnz wzr, LBB12_5897; ENABLE-NEXT:  ; %bb.1: ; %loop2a.preheader898; ENABLE-NEXT:    mov x8, xzr899; ENABLE-NEXT:    mov x9, xzr900; ENABLE-NEXT:    mov x11, xzr901; ENABLE-NEXT:    b LBB12_3902; ENABLE-NEXT:  LBB12_2: ; %loop2b903; ENABLE-NEXT:    ; in Loop: Header=BB12_3 Depth=1904; ENABLE-NEXT:    str x10, [x11]905; ENABLE-NEXT:    mov x11, x10906; ENABLE-NEXT:  LBB12_3: ; %loop1907; ENABLE-NEXT:    ; =>This Inner Loop Header: Depth=1908; ENABLE-NEXT:    mov x10, x9909; ENABLE-NEXT:    ldr x9, [x8]910; ENABLE-NEXT:    cbnz x8, LBB12_2911; ENABLE-NEXT:  ; %bb.4: ; in Loop: Header=BB12_3 Depth=1912; ENABLE-NEXT:    mov x8, x10913; ENABLE-NEXT:    mov x11, x10914; ENABLE-NEXT:    b LBB12_3915; ENABLE-NEXT:  LBB12_5: ; %end916; ENABLE-NEXT:    ret917;918; DISABLE-LABEL: infiniteloop3:919; DISABLE:       ; %bb.0: ; %entry920; DISABLE-NEXT:    cbnz wzr, LBB12_5921; DISABLE-NEXT:  ; %bb.1: ; %loop2a.preheader922; DISABLE-NEXT:    mov x8, xzr923; DISABLE-NEXT:    mov x9, xzr924; DISABLE-NEXT:    mov x11, xzr925; DISABLE-NEXT:    b LBB12_3926; DISABLE-NEXT:  LBB12_2: ; %loop2b927; DISABLE-NEXT:    ; in Loop: Header=BB12_3 Depth=1928; DISABLE-NEXT:    str x10, [x11]929; DISABLE-NEXT:    mov x11, x10930; DISABLE-NEXT:  LBB12_3: ; %loop1931; DISABLE-NEXT:    ; =>This Inner Loop Header: Depth=1932; DISABLE-NEXT:    mov x10, x9933; DISABLE-NEXT:    ldr x9, [x8]934; DISABLE-NEXT:    cbnz x8, LBB12_2935; DISABLE-NEXT:  ; %bb.4: ; in Loop: Header=BB12_3 Depth=1936; DISABLE-NEXT:    mov x8, x10937; DISABLE-NEXT:    mov x11, x10938; DISABLE-NEXT:    b LBB12_3939; DISABLE-NEXT:  LBB12_5: ; %end940; DISABLE-NEXT:    ret941entry:942  br i1 undef, label %loop2a, label %body943 944body:                                             ; preds = %entry945  br i1 undef, label %loop2a, label %end946 947loop1:                                            ; preds = %loop2a, %loop2b948  %var.phi = phi ptr [ %next.phi, %loop2b ], [ %var, %loop2a ]949  %next.phi = phi ptr [ %next.load, %loop2b ], [ %next.var, %loop2a ]950  %0 = icmp eq ptr %var, null951  %next.load = load ptr, ptr undef952  br i1 %0, label %loop2a, label %loop2b953 954loop2a:                                           ; preds = %loop1, %body, %entry955  %var = phi ptr [ null, %body ], [ null, %entry ], [ %next.phi, %loop1 ]956  %next.var = phi ptr [ undef, %body ], [ null, %entry ], [ %next.load, %loop1 ]957  br label %loop1958 959loop2b:                                           ; preds = %loop1960  store ptr %next.phi, ptr %var.phi961  br label %loop1962 963end:964  ret void965}966 967; Re-aligned stack pointer.  See bug 26642.  Avoid clobbering live968; values in the prologue when re-aligning the stack pointer.969define i32 @stack_realign(i32 %a, i32 %b, ptr %ptr1, ptr %ptr2) {970; ENABLE-LABEL: stack_realign:971; ENABLE:       ; %bb.0:972; ENABLE-NEXT:    lsl w9, w0, w1973; ENABLE-NEXT:    lsl w8, w1, w0974; ENABLE-NEXT:    cmp w0, w1975; ENABLE-NEXT:    b.ge LBB13_2976; ENABLE-NEXT:  ; %bb.1: ; %true977; ENABLE-NEXT:    stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill978; ENABLE-NEXT:    mov x29, sp979; ENABLE-NEXT:    sub x1, sp, #16980; ENABLE-NEXT:    and sp, x1, #0xffffffffffffffe0981; ENABLE-NEXT:    .cfi_def_cfa w29, 16982; ENABLE-NEXT:    .cfi_offset w30, -8983; ENABLE-NEXT:    .cfi_offset w29, -16984; ENABLE-NEXT:    str w0, [sp]985; ENABLE-NEXT:    mov sp, x29986; ENABLE-NEXT:    ldp x29, x30, [sp], #16 ; 16-byte Folded Reload987; ENABLE-NEXT:  LBB13_2: ; %false988; ENABLE-NEXT:    str w9, [x2]989; ENABLE-NEXT:    str w8, [x3]990; ENABLE-NEXT:    ret991;992; DISABLE-LABEL: stack_realign:993; DISABLE:       ; %bb.0:994; DISABLE-NEXT:    stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill995; DISABLE-NEXT:    mov x29, sp996; DISABLE-NEXT:    sub x9, sp, #16997; DISABLE-NEXT:    and sp, x9, #0xffffffffffffffe0998; DISABLE-NEXT:    .cfi_def_cfa w29, 16999; DISABLE-NEXT:    .cfi_offset w30, -81000; DISABLE-NEXT:    .cfi_offset w29, -161001; DISABLE-NEXT:    lsl w9, w0, w11002; DISABLE-NEXT:    lsl w8, w1, w01003; DISABLE-NEXT:    cmp w0, w11004; DISABLE-NEXT:    b.ge LBB13_21005; DISABLE-NEXT:  ; %bb.1: ; %true1006; DISABLE-NEXT:    str w0, [sp]1007; DISABLE-NEXT:  LBB13_2: ; %false1008; DISABLE-NEXT:    str w9, [x2]1009; DISABLE-NEXT:    str w8, [x3]1010; DISABLE-NEXT:    mov sp, x291011; DISABLE-NEXT:    ldp x29, x30, [sp], #16 ; 16-byte Folded Reload1012; DISABLE-NEXT:    ret1013  %tmp = alloca i32, align 321014  %shl1 = shl i32 %a, %b1015  %shl2 = shl i32 %b, %a1016  %tmp2 = icmp slt i32 %a, %b1017  br i1 %tmp2, label %true, label %false1018 1019true:1020  store i32 %a, ptr %tmp, align 41021  %tmp4 = load i32, ptr %tmp1022  br label %false1023 1024false:1025  %tmp.0 = phi i32 [ %tmp4, %true ], [ %a, %0 ]1026  store i32 %shl1, ptr %ptr11027  store i32 %shl2, ptr %ptr21028  ret i32 %tmp.01029}1030 1031; Re-aligned stack pointer with all caller-save regs live.  See bug1032; 26642.  In this case we currently avoid shrink wrapping because1033; ensuring we have a scratch register to re-align the stack pointer is1034; too complicated.  Output should be the same for both enabled and1035; disabled shrink wrapping.1036define void @stack_realign2(i32 %a, i32 %b, ptr %ptr1, ptr %ptr2, ptr %ptr3, ptr %ptr4, ptr %ptr5, ptr %ptr6) {1037; ENABLE-LABEL: stack_realign2:1038; ENABLE:       ; %bb.0:1039; ENABLE-NEXT:    stp x28, x27, [sp, #-96]! ; 16-byte Folded Spill1040; ENABLE-NEXT:    stp x26, x25, [sp, #16] ; 16-byte Folded Spill1041; ENABLE-NEXT:    stp x24, x23, [sp, #32] ; 16-byte Folded Spill1042; ENABLE-NEXT:    stp x22, x21, [sp, #48] ; 16-byte Folded Spill1043; ENABLE-NEXT:    stp x20, x19, [sp, #64] ; 16-byte Folded Spill1044; ENABLE-NEXT:    stp x29, x30, [sp, #80] ; 16-byte Folded Spill1045; ENABLE-NEXT:    add x29, sp, #801046; ENABLE-NEXT:    sub x9, sp, #321047; ENABLE-NEXT:    and sp, x9, #0xffffffffffffffe01048; ENABLE-NEXT:    .cfi_def_cfa w29, 161049; ENABLE-NEXT:    .cfi_offset w30, -81050; ENABLE-NEXT:    .cfi_offset w29, -161051; ENABLE-NEXT:    .cfi_offset w19, -241052; ENABLE-NEXT:    .cfi_offset w20, -321053; ENABLE-NEXT:    .cfi_offset w21, -401054; ENABLE-NEXT:    .cfi_offset w22, -481055; ENABLE-NEXT:    .cfi_offset w23, -561056; ENABLE-NEXT:    .cfi_offset w24, -641057; ENABLE-NEXT:    .cfi_offset w25, -721058; ENABLE-NEXT:    .cfi_offset w26, -801059; ENABLE-NEXT:    .cfi_offset w27, -881060; ENABLE-NEXT:    .cfi_offset w28, -961061; ENABLE-NEXT:    lsl w8, w1, w01062; ENABLE-NEXT:    lsr w9, w0, w11063; ENABLE-NEXT:    lsl w14, w0, w11064; ENABLE-NEXT:    lsr w11, w1, w01065; ENABLE-NEXT:    add w15, w1, w01066; ENABLE-NEXT:    sub w10, w8, w91067; ENABLE-NEXT:    subs w17, w1, w01068; ENABLE-NEXT:    add w16, w14, w81069; ENABLE-NEXT:    add w12, w9, w111070; ENABLE-NEXT:    add w13, w11, w151071; ENABLE-NEXT:    b.le LBB14_21072; ENABLE-NEXT:  ; %bb.1: ; %true1073; ENABLE-NEXT:    str w0, [sp]1074; ENABLE-NEXT:    ; InlineAsm Start1075; ENABLE-NEXT:    nop1076; ENABLE-NEXT:    ; InlineAsm End1077; ENABLE-NEXT:  LBB14_2: ; %false1078; ENABLE-NEXT:    str w14, [x2]1079; ENABLE-NEXT:    str w8, [x3]1080; ENABLE-NEXT:    str w9, [x4]1081; ENABLE-NEXT:    str w11, [x5]1082; ENABLE-NEXT:    str w15, [x6]1083; ENABLE-NEXT:    str w17, [x7]1084; ENABLE-NEXT:    stp w0, w1, [x2, #4]1085; ENABLE-NEXT:    stp w16, w10, [x2, #12]1086; ENABLE-NEXT:    stp w12, w13, [x2, #20]1087; ENABLE-NEXT:    sub sp, x29, #801088; ENABLE-NEXT:    ldp x29, x30, [sp, #80] ; 16-byte Folded Reload1089; ENABLE-NEXT:    ldp x20, x19, [sp, #64] ; 16-byte Folded Reload1090; ENABLE-NEXT:    ldp x22, x21, [sp, #48] ; 16-byte Folded Reload1091; ENABLE-NEXT:    ldp x24, x23, [sp, #32] ; 16-byte Folded Reload1092; ENABLE-NEXT:    ldp x26, x25, [sp, #16] ; 16-byte Folded Reload1093; ENABLE-NEXT:    ldp x28, x27, [sp], #96 ; 16-byte Folded Reload1094; ENABLE-NEXT:    ret1095;1096; DISABLE-LABEL: stack_realign2:1097; DISABLE:       ; %bb.0:1098; DISABLE-NEXT:    stp x28, x27, [sp, #-96]! ; 16-byte Folded Spill1099; DISABLE-NEXT:    stp x26, x25, [sp, #16] ; 16-byte Folded Spill1100; DISABLE-NEXT:    stp x24, x23, [sp, #32] ; 16-byte Folded Spill1101; DISABLE-NEXT:    stp x22, x21, [sp, #48] ; 16-byte Folded Spill1102; DISABLE-NEXT:    stp x20, x19, [sp, #64] ; 16-byte Folded Spill1103; DISABLE-NEXT:    stp x29, x30, [sp, #80] ; 16-byte Folded Spill1104; DISABLE-NEXT:    add x29, sp, #801105; DISABLE-NEXT:    sub x9, sp, #321106; DISABLE-NEXT:    and sp, x9, #0xffffffffffffffe01107; DISABLE-NEXT:    .cfi_def_cfa w29, 161108; DISABLE-NEXT:    .cfi_offset w30, -81109; DISABLE-NEXT:    .cfi_offset w29, -161110; DISABLE-NEXT:    .cfi_offset w19, -241111; DISABLE-NEXT:    .cfi_offset w20, -321112; DISABLE-NEXT:    .cfi_offset w21, -401113; DISABLE-NEXT:    .cfi_offset w22, -481114; DISABLE-NEXT:    .cfi_offset w23, -561115; DISABLE-NEXT:    .cfi_offset w24, -641116; DISABLE-NEXT:    .cfi_offset w25, -721117; DISABLE-NEXT:    .cfi_offset w26, -801118; DISABLE-NEXT:    .cfi_offset w27, -881119; DISABLE-NEXT:    .cfi_offset w28, -961120; DISABLE-NEXT:    lsl w8, w1, w01121; DISABLE-NEXT:    lsr w9, w0, w11122; DISABLE-NEXT:    lsl w14, w0, w11123; DISABLE-NEXT:    lsr w11, w1, w01124; DISABLE-NEXT:    add w15, w1, w01125; DISABLE-NEXT:    sub w10, w8, w91126; DISABLE-NEXT:    subs w17, w1, w01127; DISABLE-NEXT:    add w16, w14, w81128; DISABLE-NEXT:    add w12, w9, w111129; DISABLE-NEXT:    add w13, w11, w151130; DISABLE-NEXT:    b.le LBB14_21131; DISABLE-NEXT:  ; %bb.1: ; %true1132; DISABLE-NEXT:    str w0, [sp]1133; DISABLE-NEXT:    ; InlineAsm Start1134; DISABLE-NEXT:    nop1135; DISABLE-NEXT:    ; InlineAsm End1136; DISABLE-NEXT:  LBB14_2: ; %false1137; DISABLE-NEXT:    str w14, [x2]1138; DISABLE-NEXT:    str w8, [x3]1139; DISABLE-NEXT:    str w9, [x4]1140; DISABLE-NEXT:    str w11, [x5]1141; DISABLE-NEXT:    str w15, [x6]1142; DISABLE-NEXT:    str w17, [x7]1143; DISABLE-NEXT:    stp w0, w1, [x2, #4]1144; DISABLE-NEXT:    stp w16, w10, [x2, #12]1145; DISABLE-NEXT:    stp w12, w13, [x2, #20]1146; DISABLE-NEXT:    sub sp, x29, #801147; DISABLE-NEXT:    ldp x29, x30, [sp, #80] ; 16-byte Folded Reload1148; DISABLE-NEXT:    ldp x20, x19, [sp, #64] ; 16-byte Folded Reload1149; DISABLE-NEXT:    ldp x22, x21, [sp, #48] ; 16-byte Folded Reload1150; DISABLE-NEXT:    ldp x24, x23, [sp, #32] ; 16-byte Folded Reload1151; DISABLE-NEXT:    ldp x26, x25, [sp, #16] ; 16-byte Folded Reload1152; DISABLE-NEXT:    ldp x28, x27, [sp], #96 ; 16-byte Folded Reload1153; DISABLE-NEXT:    ret1154  %tmp = alloca i32, align 321155  %tmp1 = shl i32 %a, %b1156  %tmp2 = shl i32 %b, %a1157  %tmp3 = lshr i32 %a, %b1158  %tmp4 = lshr i32 %b, %a1159  %tmp5 = add i32 %b, %a1160  %tmp6 = sub i32 %b, %a1161  %tmp7 = add i32 %tmp1, %tmp21162  %tmp8 = sub i32 %tmp2, %tmp31163  %tmp9 = add i32 %tmp3, %tmp41164  %tmp10 = add i32 %tmp4, %tmp51165  %cmp = icmp slt i32 %a, %b1166  br i1 %cmp, label %true, label %false1167 1168true:1169  store i32 %a, ptr %tmp, align 41170  call void asm sideeffect "nop", "~{x19},~{x20},~{x21},~{x22},~{x23},~{x24},~{x25},~{x26},~{x27},~{x28}"() nounwind1171  br label %false1172 1173false:1174  store i32 %tmp1, ptr %ptr1, align 41175  store i32 %tmp2, ptr %ptr2, align 41176  store i32 %tmp3, ptr %ptr3, align 41177  store i32 %tmp4, ptr %ptr4, align 41178  store i32 %tmp5, ptr %ptr5, align 41179  store i32 %tmp6, ptr %ptr6, align 41180  %idx1 = getelementptr inbounds i32, ptr %ptr1, i64 11181  store i32 %a, ptr %idx1, align 41182  %idx2 = getelementptr inbounds i32, ptr %ptr1, i64 21183  store i32 %b, ptr %idx2, align 41184  %idx3 = getelementptr inbounds i32, ptr %ptr1, i64 31185  store i32 %tmp7, ptr %idx3, align 41186  %idx4 = getelementptr inbounds i32, ptr %ptr1, i64 41187  store i32 %tmp8, ptr %idx4, align 41188  %idx5 = getelementptr inbounds i32, ptr %ptr1, i64 51189  store i32 %tmp9, ptr %idx5, align 41190  %idx6 = getelementptr inbounds i32, ptr %ptr1, i64 61191  store i32 %tmp10, ptr %idx6, align 41192 1193  ret void1194}1195