1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=aarch64-linux-gnu -verify-machineinstrs -o - %s | FileCheck %s 3 4%struct_type = type { [10000 x i32], i32, i32 } 5 6define void @test1(ptr %s, i32 %n) { 7; CHECK-LABEL: test1: 8; CHECK: // %bb.0: // %entry 9; CHECK-NEXT: ldr x8, [x0] 10; CHECK-NEXT: mov w9, wzr 11; CHECK-NEXT: add x8, x8, #9, lsl #12 // =36864 12; CHECK-NEXT: cmp w9, w1 13; CHECK-NEXT: b.ge .LBB0_2 14; CHECK-NEXT: .LBB0_1: // %while_body 15; CHECK-NEXT: // =>This Inner Loop Header: Depth=1 16; CHECK-NEXT: str w9, [x8, #3140] 17; CHECK-NEXT: add w9, w9, #1 18; CHECK-NEXT: str w9, [x8, #3136] 19; CHECK-NEXT: cmp w9, w1 20; CHECK-NEXT: b.lt .LBB0_1 21; CHECK-NEXT: .LBB0_2: // %while_end 22; CHECK-NEXT: ret 23entry: 24 %struct = load ptr, ptr %s 25 br label %while_cond 26 27while_cond: 28 %phi = phi i32 [ 0, %entry ], [ %i, %while_body ] 29 %gep0 = getelementptr %struct_type, ptr %struct, i64 0, i32 1 30 %gep1 = getelementptr %struct_type, ptr %struct, i64 0, i32 2 31 %cmp = icmp slt i32 %phi, %n 32 br i1 %cmp, label %while_body, label %while_end 33 34while_body: 35 %i = add i32 %phi, 1 36 store i32 %i, ptr %gep0 37 store i32 %phi, ptr %gep1 38 br label %while_cond 39 40while_end: 41 ret void 42} 43 44define void @test2(ptr %struct, i32 %n) { 45; CHECK-LABEL: test2: 46; CHECK: // %bb.0: // %entry 47; CHECK-NEXT: cbz x0, .LBB1_3 48; CHECK-NEXT: // %bb.1: // %while_cond.preheader 49; CHECK-NEXT: mov w9, wzr 50; CHECK-NEXT: add x8, x0, #9, lsl #12 // =36864 51; CHECK-NEXT: cmp w9, w1 52; CHECK-NEXT: b.ge .LBB1_3 53; CHECK-NEXT: .LBB1_2: // %while_body 54; CHECK-NEXT: // =>This Inner Loop Header: Depth=1 55; CHECK-NEXT: str w9, [x8, #3140] 56; CHECK-NEXT: add w9, w9, #1 57; CHECK-NEXT: str w9, [x8, #3136] 58; CHECK-NEXT: cmp w9, w1 59; CHECK-NEXT: b.lt .LBB1_2 60; CHECK-NEXT: .LBB1_3: // %while_end 61; CHECK-NEXT: ret 62entry: 63 %cmp = icmp eq ptr %struct, null 64 br i1 %cmp, label %while_end, label %while_cond 65 66while_cond: 67 %phi = phi i32 [ 0, %entry ], [ %i, %while_body ] 68 %gep0 = getelementptr %struct_type, ptr %struct, i64 0, i32 1 69 %gep1 = getelementptr %struct_type, ptr %struct, i64 0, i32 2 70 %cmp1 = icmp slt i32 %phi, %n 71 br i1 %cmp1, label %while_body, label %while_end 72 73while_body: 74 %i = add i32 %phi, 1 75 store i32 %i, ptr %gep0 76 store i32 %phi, ptr %gep1 77 br label %while_cond 78 79while_end: 80 ret void 81} 82 83define void @test3(ptr %s1, ptr %s2, i1 %cond, i32 %n) { 84; CHECK-LABEL: test3: 85; CHECK: // %bb.0: // %entry 86; CHECK-NEXT: tst w2, #0x1 87; CHECK-NEXT: csel x8, x1, x0, ne 88; CHECK-NEXT: cbz x8, .LBB2_3 89; CHECK-NEXT: // %bb.1: // %while_cond.preheader 90; CHECK-NEXT: mov w9, wzr 91; CHECK-NEXT: add x8, x8, #9, lsl #12 // =36864 92; CHECK-NEXT: cmp w9, w3 93; CHECK-NEXT: b.ge .LBB2_3 94; CHECK-NEXT: .LBB2_2: // %while_body 95; CHECK-NEXT: // =>This Inner Loop Header: Depth=1 96; CHECK-NEXT: str w9, [x8, #3140] 97; CHECK-NEXT: add w9, w9, #1 98; CHECK-NEXT: str w9, [x8, #3136] 99; CHECK-NEXT: cmp w9, w3 100; CHECK-NEXT: b.lt .LBB2_2 101; CHECK-NEXT: .LBB2_3: // %while_end 102; CHECK-NEXT: ret 103entry: 104 br i1 %cond, label %if_true, label %if_end 105 106if_true: 107 br label %if_end 108 109if_end: 110 %struct = phi ptr [ %s1, %entry ], [ %s2, %if_true ] 111 %cmp = icmp eq ptr %struct, null 112 br i1 %cmp, label %while_end, label %while_cond 113 114while_cond: 115 %phi = phi i32 [ 0, %if_end ], [ %i, %while_body ] 116 %gep0 = getelementptr %struct_type, ptr %struct, i64 0, i32 1 117 %gep1 = getelementptr %struct_type, ptr %struct, i64 0, i32 2 118 %cmp1 = icmp slt i32 %phi, %n 119 br i1 %cmp1, label %while_body, label %while_end 120 121while_body: 122 %i = add i32 %phi, 1 123 store i32 %i, ptr %gep0 124 store i32 %phi, ptr %gep1 125 br label %while_cond 126 127while_end: 128 ret void 129} 130 131declare ptr @foo() 132declare void @foo2() 133 134define void @test4(i32 %n) uwtable personality ptr @__FrameHandler { 135; CHECK-LABEL: test4: 136; CHECK: .Lfunc_begin0: 137; CHECK-NEXT: .cfi_startproc 138; CHECK-NEXT: .cfi_personality 156, DW.ref.__FrameHandler 139; CHECK-NEXT: .cfi_lsda 28, .Lexception0 140; CHECK-NEXT: // %bb.0: // %entry 141; CHECK-NEXT: str x30, [sp, #-32]! // 8-byte Folded Spill 142; CHECK-NEXT: .cfi_def_cfa_offset 32 143; CHECK-NEXT: stp x20, x19, [sp, #16] // 16-byte Folded Spill 144; CHECK-NEXT: .cfi_offset w19, -8 145; CHECK-NEXT: .cfi_offset w20, -16 146; CHECK-NEXT: .cfi_offset w30, -32 147; CHECK-NEXT: .cfi_remember_state 148; CHECK-NEXT: mov w19, w0 149; CHECK-NEXT: mov w20, wzr 150; CHECK-NEXT: .LBB3_1: // %while_cond 151; CHECK-NEXT: // =>This Inner Loop Header: Depth=1 152; CHECK-NEXT: .Ltmp0: 153; CHECK-NEXT: bl foo 154; CHECK-NEXT: .Ltmp1: 155; CHECK-NEXT: // %bb.2: // %while_cond_x.split 156; CHECK-NEXT: // in Loop: Header=BB3_1 Depth=1 157; CHECK-NEXT: add x8, x0, #9, lsl #12 // =36864 158; CHECK-NEXT: cmp w20, w19 159; CHECK-NEXT: str wzr, [x8, #3136] 160; CHECK-NEXT: b.ge .LBB3_4 161; CHECK-NEXT: // %bb.3: // %while_body 162; CHECK-NEXT: // in Loop: Header=BB3_1 Depth=1 163; CHECK-NEXT: str w20, [x8, #3140] 164; CHECK-NEXT: add w20, w20, #1 165; CHECK-NEXT: str w20, [x8, #3136] 166; CHECK-NEXT: b .LBB3_1 167; CHECK-NEXT: .LBB3_4: // %while_end 168; CHECK-NEXT: ldp x20, x19, [sp, #16] // 16-byte Folded Reload 169; CHECK-NEXT: ldr x30, [sp], #32 // 8-byte Folded Reload 170; CHECK-NEXT: .cfi_def_cfa_offset 0 171; CHECK-NEXT: .cfi_restore w19 172; CHECK-NEXT: .cfi_restore w20 173; CHECK-NEXT: .cfi_restore w30 174; CHECK-NEXT: ret 175; CHECK-NEXT: .LBB3_5: // %cleanup 176; CHECK-NEXT: .cfi_restore_state 177; CHECK-NEXT: .Ltmp2: 178; CHECK-NEXT: mov x19, x0 179; CHECK-NEXT: bl foo2 180; CHECK-NEXT: mov x0, x19 181; CHECK-NEXT: bl _Unwind_Resume 182entry: 183 br label %while_cond 184 185while_cond: 186 %phi = phi i32 [ 0, %entry ], [ %i, %while_body ] 187 %struct = invoke ptr @foo() to label %while_cond_x unwind label %cleanup 188 189while_cond_x: 190 %gep0 = getelementptr %struct_type, ptr %struct, i64 0, i32 1 191 %gep1 = getelementptr %struct_type, ptr %struct, i64 0, i32 2 192 store i32 0, ptr %gep0 193 %cmp = icmp slt i32 %phi, %n 194 br i1 %cmp, label %while_body, label %while_end 195 196while_body: 197 %i = add i32 %phi, 1 198 store i32 %i, ptr %gep0 199 store i32 %phi, ptr %gep1 200 br label %while_cond 201 202while_end: 203 ret void 204 205cleanup: 206 %x10 = landingpad { ptr, i32 } 207 cleanup 208 call void @foo2() 209 resume { ptr, i32 } %x10 210} 211 212declare i32 @__FrameHandler(...) 213 214define void @test5(ptr %s, i32 %n) { 215; CHECK-LABEL: test5: 216; CHECK: // %bb.0: // %entry 217; CHECK-NEXT: ldr x8, [x0] 218; CHECK-NEXT: mov w9, wzr 219; CHECK-NEXT: add x8, x8, #19, lsl #12 // =77824 220; CHECK-NEXT: cmp w9, w1 221; CHECK-NEXT: b.ge .LBB4_2 222; CHECK-NEXT: .LBB4_1: // %while_body 223; CHECK-NEXT: // =>This Inner Loop Header: Depth=1 224; CHECK-NEXT: str w9, [x8, #2180] 225; CHECK-NEXT: add w9, w9, #1 226; CHECK-NEXT: str w9, [x8, #2176] 227; CHECK-NEXT: cmp w9, w1 228; CHECK-NEXT: b.lt .LBB4_1 229; CHECK-NEXT: .LBB4_2: // %while_end 230; CHECK-NEXT: ret 231entry: 232 %struct = load ptr, ptr %s 233 br label %while_cond 234 235while_cond: 236 %phi = phi i32 [ 0, %entry ], [ %i, %while_body ] 237 %gep0 = getelementptr [65536 x i32], ptr %struct, i64 0, i32 20000 238 %gep1 = getelementptr [65536 x i32], ptr %struct, i64 0, i32 20001 239 %cmp = icmp slt i32 %phi, %n 240 br i1 %cmp, label %while_body, label %while_end 241 242while_body: 243 %i = add i32 %phi, 1 244 store i32 %i, ptr %gep0 245 store i32 %phi, ptr %gep1 246 br label %while_cond 247 248while_end: 249 ret void 250} 251 252declare ptr @llvm.strip.invariant.group.p0(ptr) 253 254define void @test_invariant_group(i32 %arg, i1 %c) { 255; CHECK-LABEL: test_invariant_group: 256; CHECK: // %bb.0: // %bb 257; CHECK-NEXT: tbz w1, #0, .LBB5_4 258; CHECK-NEXT: // %bb.1: // %bb6 259; CHECK-NEXT: cbz w0, .LBB5_3 260; CHECK-NEXT: .LBB5_2: // %bb1 261; CHECK-NEXT: // =>This Inner Loop Header: Depth=1 262; CHECK-NEXT: tbnz w1, #0, .LBB5_2 263; CHECK-NEXT: b .LBB5_4 264; CHECK-NEXT: .LBB5_3: // %bb2 265; CHECK-NEXT: tbz w1, #0, .LBB5_5 266; CHECK-NEXT: .LBB5_4: // %bb5 267; CHECK-NEXT: ret 268; CHECK-NEXT: .LBB5_5: // %bb4 269; CHECK-NEXT: mov w8, #1 // =0x1 270; CHECK-NEXT: str x8, [x8] 271; CHECK-NEXT: ret 272bb: 273 br i1 %c, label %bb6, label %bb5 274 275bb1: ; preds = %bb6, %bb1 276 br i1 %c, label %bb1, label %bb5 277 278bb2: ; preds = %bb6 279 %i = getelementptr inbounds i8, ptr %i7, i32 40000 280 br i1 %c, label %bb5, label %bb4 281 282bb4: ; preds = %bb2 283 store i64 1, ptr %i, align 8 284 br label %bb5 285 286bb5: ; preds = %bb4, %bb2, %bb1, %bb 287 ret void 288 289bb6: ; preds = %bb 290 %i7 = call ptr @llvm.strip.invariant.group.p0(ptr nonnull undef) 291 %i8 = icmp eq i32 %arg, 0 292 br i1 %i8, label %bb2, label %bb1 293} 294