brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.1 KiB · 4d383fe Raw
414 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s | FileCheck %s3target triple = "aarch64-linux"4 5declare i32 @use(...)6 7define i32 @f0(i1 %c1, ptr %p) nounwind {8; CHECK-LABEL: f0:9; CHECK:       // %bb.0: // %entry10; CHECK-NEXT:    tbz w0, #0, .LBB0_211; CHECK-NEXT:  // %bb.1: // %if.then12; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill13; CHECK-NEXT:    add x0, x1, #814; CHECK-NEXT:    bl use15; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload16; CHECK-NEXT:    ret17; CHECK-NEXT:  .LBB0_2: // %if.else18; CHECK-NEXT:    ldur w0, [x1, #8]19; CHECK-NEXT:    ret20entry:21  %a = getelementptr i32, ptr %p, i32 222  br i1 %c1, label %if.then, label %if.else23 24if.then:25  %v0 = call i32 @use(ptr %a)26  br label %exit27 28if.else:29  %v1 = load i32, ptr %a30  br label %exit31 32exit:33  %v = phi i32 [%v0, %if.then], [%v1, %if.else]34  ret i32 %v35}36 37define i32 @f1(i1 %c1, ptr %p, i64 %i) nounwind {38; CHECK-LABEL: f1:39; CHECK:       // %bb.0: // %entry40; CHECK-NEXT:    tbz w0, #0, .LBB1_241; CHECK-NEXT:  // %bb.1: // %if.then42; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill43; CHECK-NEXT:    add x0, x1, x244; CHECK-NEXT:    bl use45; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload46; CHECK-NEXT:    ret47; CHECK-NEXT:  .LBB1_2: // %if.else48; CHECK-NEXT:    ldr w0, [x1, x2]49; CHECK-NEXT:    ret50entry:51  %a = getelementptr i8, ptr %p, i64 %i52  br i1 %c1, label %if.then, label %if.else53 54if.then:55  %v0 = call i32 @use(ptr %a)56  br label %exit57 58if.else:59  %v1 = load i32, ptr %a60  br label %exit61 62exit:63  %v = phi i32 [%v0, %if.then], [%v1, %if.else]64  ret i32 %v65}66 67; Address calculation too slow.68%S = type {i32, [7 x i32] }69define i32 @f2(i1 %c1, ptr %p, i64 %i) nounwind "target-features"="+alu-lsl-fast" {70; CHECK-LABEL: f2:71; CHECK:       // %bb.0: // %entry72; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill73; CHECK-NEXT:    add x1, x1, x2, lsl #574; CHECK-NEXT:    tbz w0, #0, .LBB2_275; CHECK-NEXT:  // %bb.1: // %if.then76; CHECK-NEXT:    mov x0, x177; CHECK-NEXT:    bl use78; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload79; CHECK-NEXT:    ret80; CHECK-NEXT:  .LBB2_2: // %if.else81; CHECK-NEXT:    mov w0, #1 // =0x182; CHECK-NEXT:    bl use83; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload84; CHECK-NEXT:    ret85entry:86  %a = getelementptr %S, ptr %p, i64 %i87  br i1 %c1, label %if.then, label %if.else88 89if.then:90  %v0 = call i32 @use(ptr %a)91  br label %exit92 93if.else:94  %v1 = call i32 @use(i32 1, ptr %a)95  br label %exit96 97exit:98  %v = phi i32 [%v0, %if.then], [%v1, %if.else]99  ret i32 %v100}101 102; Address calculation cheap enough on some cores.103define i32 @f3(i1 %c1, ptr %p, i64 %i) nounwind  "target-features"="+alu-lsl-fast" {104; CHECK-LABEL: f3:105; CHECK:       // %bb.0: // %entry106; CHECK-NEXT:    tbz w0, #0, .LBB3_2107; CHECK-NEXT:  // %bb.1: // %if.then108; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill109; CHECK-NEXT:    add x0, x1, x2, lsl #2110; CHECK-NEXT:    bl use111; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload112; CHECK-NEXT:    ret113; CHECK-NEXT:  .LBB3_2: // %if.else114; CHECK-NEXT:    ldr w0, [x1, x2, lsl #2]115; CHECK-NEXT:    ret116entry:117  %a = getelementptr i32, ptr %p, i64 %i118  br i1 %c1, label %if.then, label %if.else119 120if.then:121  %v0 = call i32 @use(ptr %a)122  br label %exit123 124if.else:125  %v1 = load i32, ptr %a126  br label %exit127 128exit:129  %v = phi i32 [%v0, %if.then], [%v1, %if.else]130  ret i32 %v131}132 133define void @f4(ptr %a, i64 %n) nounwind "target-features"="+alu-lsl-fast" {134; CHECK-LABEL: f4:135; CHECK:       // %bb.0: // %entry136; CHECK-NEXT:    cmp x1, #1137; CHECK-NEXT:    b.lt .LBB4_9138; CHECK-NEXT:  // %bb.1: // %LI.preheader139; CHECK-NEXT:    stp x30, x23, [sp, #-48]! // 16-byte Folded Spill140; CHECK-NEXT:    stp x22, x21, [sp, #16] // 16-byte Folded Spill141; CHECK-NEXT:    mov x22, xzr142; CHECK-NEXT:    stp x20, x19, [sp, #32] // 16-byte Folded Spill143; CHECK-NEXT:    mov x19, x1144; CHECK-NEXT:    mov x20, x0145; CHECK-NEXT:    b .LBB4_3146; CHECK-NEXT:  .LBB4_2: // %LI.latch147; CHECK-NEXT:    // in Loop: Header=BB4_3 Depth=1148; CHECK-NEXT:    cmp x22, x19149; CHECK-NEXT:    mov x22, x23150; CHECK-NEXT:    b.ge .LBB4_8151; CHECK-NEXT:  .LBB4_3: // %LI152; CHECK-NEXT:    // =>This Loop Header: Depth=1153; CHECK-NEXT:    // Child Loop BB4_6 Depth 2154; CHECK-NEXT:    mov x21, xzr155; CHECK-NEXT:    add x23, x22, #1156; CHECK-NEXT:    b .LBB4_6157; CHECK-NEXT:  .LBB4_4: // %if.else158; CHECK-NEXT:    // in Loop: Header=BB4_6 Depth=2159; CHECK-NEXT:    ldr w0, [x20, x22, lsl #2]160; CHECK-NEXT:  .LBB4_5: // %LJ.latch161; CHECK-NEXT:    // in Loop: Header=BB4_6 Depth=2162; CHECK-NEXT:    add x8, x21, #1163; CHECK-NEXT:    str w0, [x20, x21, lsl #2]164; CHECK-NEXT:    sub x9, x8, #1165; CHECK-NEXT:    mov x21, x8166; CHECK-NEXT:    cmp x9, x19167; CHECK-NEXT:    b.ge .LBB4_2168; CHECK-NEXT:  .LBB4_6: // %LJ169; CHECK-NEXT:    // Parent Loop BB4_3 Depth=1170; CHECK-NEXT:    // => This Inner Loop Header: Depth=2171; CHECK-NEXT:    ldr w8, [x20, x21, lsl #2]172; CHECK-NEXT:    tbz w8, #31, .LBB4_4173; CHECK-NEXT:  // %bb.7: // %if.then174; CHECK-NEXT:    // in Loop: Header=BB4_6 Depth=2175; CHECK-NEXT:    add x0, x20, x22, lsl #2176; CHECK-NEXT:    mov x1, x21177; CHECK-NEXT:    bl use178; CHECK-NEXT:    b .LBB4_5179; CHECK-NEXT:  .LBB4_8:180; CHECK-NEXT:    ldp x20, x19, [sp, #32] // 16-byte Folded Reload181; CHECK-NEXT:    ldp x22, x21, [sp, #16] // 16-byte Folded Reload182; CHECK-NEXT:    ldp x30, x23, [sp], #48 // 16-byte Folded Reload183; CHECK-NEXT:  .LBB4_9: // %exit184; CHECK-NEXT:    ret185entry:186    %c0 = icmp slt i64 %n, 1187    br i1 %c0, label %exit, label %LI188 189LI:190    %i = phi i64 [0, %entry], [%i.next, %LI.latch]191    %i.next = add i64 %i, 1192    %ai.ptr = getelementptr i32, ptr %a, i64 %i193    br label %LJ194 195LJ:196    %j = phi i64 [0, %LI], [%j.next, %LJ.latch]197    %j.next = add i64 %j, 1198    %aj.ptr = getelementptr i32, ptr %a, i64 %j199    %aj = load i32, ptr %aj.ptr200    %c1 = icmp slt i32 %aj, 0201    br i1 %c1, label %if.then, label %if.else202 203if.then:204    %v = call i32 @use(ptr %ai.ptr, i64 %j)205    store i32 %v, ptr %aj.ptr206    br label %LJ.latch207 208if.else:209    %ai = load i32, ptr %ai.ptr210    store i32 %ai, ptr %aj.ptr211    br label %LJ.latch212 213LJ.latch:214    %c2 = icmp slt i64 %j, %n215    br i1 %c2, label %LJ, label %LI.latch216 217LI.latch:218    %c3 = icmp slt i64 %i, %n219    br i1 %c3, label %LI, label %exit220 221exit:222    ret void223}224 225%T = type { i32, i32, i32 }226 227define void @f5(ptr %a, i32 %n, i32 %k) nounwind {228; CHECK-LABEL: f5:229; CHECK:       // %bb.0: // %entry230; CHECK-NEXT:    cmp w1, #1231; CHECK-NEXT:    b.lt .LBB5_7232; CHECK-NEXT:  // %bb.1: // %L.preheader233; CHECK-NEXT:    str x30, [sp, #-48]! // 8-byte Folded Spill234; CHECK-NEXT:    mov w8, #12 // =0xc235; CHECK-NEXT:    stp x20, x19, [sp, #32] // 16-byte Folded Spill236; CHECK-NEXT:    mov w19, w1237; CHECK-NEXT:    smaddl x20, w2, w8, x0238; CHECK-NEXT:    stp x22, x21, [sp, #16] // 16-byte Folded Spill239; CHECK-NEXT:    add x21, x0, #8240; CHECK-NEXT:    mov w22, #-1 // =0xffffffff241; CHECK-NEXT:    b .LBB5_4242; CHECK-NEXT:  .LBB5_2: // %if.else243; CHECK-NEXT:    // in Loop: Header=BB5_4 Depth=1244; CHECK-NEXT:    ldur w0, [x20, #4]245; CHECK-NEXT:  .LBB5_3: // %L.latch246; CHECK-NEXT:    // in Loop: Header=BB5_4 Depth=1247; CHECK-NEXT:    add w22, w22, #1248; CHECK-NEXT:    str w0, [x21], #12249; CHECK-NEXT:    cmp w22, w19250; CHECK-NEXT:    b.ge .LBB5_6251; CHECK-NEXT:  .LBB5_4: // %L252; CHECK-NEXT:    // =>This Inner Loop Header: Depth=1253; CHECK-NEXT:    ldr w8, [x21]254; CHECK-NEXT:    tbz w8, #31, .LBB5_2255; CHECK-NEXT:  // %bb.5: // %if.then256; CHECK-NEXT:    // in Loop: Header=BB5_4 Depth=1257; CHECK-NEXT:    add x0, x20, #4258; CHECK-NEXT:    add w1, w22, #1259; CHECK-NEXT:    bl use260; CHECK-NEXT:    b .LBB5_3261; CHECK-NEXT:  .LBB5_6:262; CHECK-NEXT:    ldp x20, x19, [sp, #32] // 16-byte Folded Reload263; CHECK-NEXT:    ldp x22, x21, [sp, #16] // 16-byte Folded Reload264; CHECK-NEXT:    ldr x30, [sp], #48 // 8-byte Folded Reload265; CHECK-NEXT:  .LBB5_7: // %exit266; CHECK-NEXT:    ret267entry:268    %p = getelementptr %T, ptr %a, i32 %k, i32 1269    %c0 = icmp slt i32 %n, 1270    br i1 %c0, label %exit, label %L271 272L:273    %i = phi i32 [0, %entry], [%i.next, %L.latch]274    %i.next = add i32 %i, 1275    %ai.ptr = getelementptr %T, ptr %a, i32 %i, i32 2276    %ai = load i32, ptr %ai.ptr277    %c1 = icmp slt i32 %ai, 0278    br i1 %c1, label %if.then, label %if.else279 280if.then:281    %u.0 = call i32 @use(ptr %p, i32 %i)282    br label %L.latch283 284if.else:285    %u.1 = load i32, ptr %p286    br label %L.latch287 288L.latch:289    %u = phi i32 [%u.0, %if.then], [%u.1, %if.else]290    store i32 %u, ptr %ai.ptr291    %c2 = icmp slt i32 %i, %n292    br i1 %c2, label %L, label %exit293 294exit:295    ret void296}297 298define i32 @f6(i1 %c, ptr %a, i32 %i) {299; CHECK-LABEL: f6:300; CHECK:       // %bb.0: // %entry301; CHECK-NEXT:    tbz w0, #0, .LBB6_2302; CHECK-NEXT:  // %bb.1: // %if.then303; CHECK-NEXT:    mov w0, wzr304; CHECK-NEXT:    str wzr, [x1, w2, sxtw #2]305; CHECK-NEXT:    ret306; CHECK-NEXT:  .LBB6_2: // %if.else307; CHECK-NEXT:    ldr w0, [x1, w2, sxtw #2]308; CHECK-NEXT:    ret309entry:310    %j = sext i32 %i to i64311    br i1 %c, label %if.then, label %if.else312 313if.then:314    %p0 = getelementptr i32, ptr %a, i64 %j315    store i32 0, ptr %p0316    br label %exit317 318if.else:319    %p1 = getelementptr i32, ptr %a, i64 %j320    %v0 = load i32, ptr %p1321    br label %exit322 323exit:324    %v = phi i32 [0, %if.then], [%v0, %if.else]325    ret i32 %v326}327 328define i8 @f7(i1 %c, ptr %a, i32 %i) {329; CHECK-LABEL: f7:330; CHECK:       // %bb.0: // %entry331; CHECK-NEXT:    tbz w0, #0, .LBB7_2332; CHECK-NEXT:  // %bb.1: // %if.then333; CHECK-NEXT:    mov w0, wzr334; CHECK-NEXT:    strb wzr, [x1, w2, uxtw]335; CHECK-NEXT:    ret336; CHECK-NEXT:  .LBB7_2: // %if.else337; CHECK-NEXT:    ldrb w0, [x1, w2, uxtw]338; CHECK-NEXT:    ret339entry:340    %j = zext i32 %i to i64341    br i1 %c, label %if.then, label %if.else342 343if.then:344    %p0 = getelementptr i8, ptr %a, i64 %j345    store i8 0, ptr %p0346    br label %exit347 348if.else:349    %p1 = getelementptr i8, ptr %a, i64 %j350    %v0 = load i8, ptr %p1351    br label %exit352 353exit:354    %v = phi i8 [0, %if.then], [%v0, %if.else]355    ret i8 %v356}357 358define i32 @f8(i1 %c, ptr %a, i32 %i) {359; CHECK-LABEL: f8:360; CHECK:       // %bb.0: // %entry361; CHECK-NEXT:    tbz w0, #0, .LBB8_2362; CHECK-NEXT:  // %bb.1: // %if.then363; CHECK-NEXT:    mov w0, wzr364; CHECK-NEXT:    str wzr, [x1, w2, sxtw #2]365; CHECK-NEXT:    ret366; CHECK-NEXT:  .LBB8_2: // %if.else367; CHECK-NEXT:    ldr w0, [x1, w2, sxtw #2]368; CHECK-NEXT:    ret369entry:370    %p = getelementptr i32, ptr %a, i32 %i371    br i1 %c, label %if.then, label %if.else372 373if.then:374    store i32 0, ptr %p375    br label %exit376 377if.else:378    %v0 = load i32, ptr %p379    br label %exit380 381exit:382    %v = phi i32 [0, %if.then], [%v0, %if.else]383    ret i32 %v384}385 386define i64 @f9(i1 %c, ptr %a, i32 %i) {387; CHECK-LABEL: f9:388; CHECK:       // %bb.0: // %entry389; CHECK-NEXT:    tbz w0, #0, .LBB9_2390; CHECK-NEXT:  // %bb.1: // %if.then391; CHECK-NEXT:    mov x0, xzr392; CHECK-NEXT:    str xzr, [x1, w2, uxtw #3]393; CHECK-NEXT:    ret394; CHECK-NEXT:  .LBB9_2: // %if.else395; CHECK-NEXT:    ldr x0, [x1, w2, uxtw #3]396; CHECK-NEXT:    ret397entry:398    %j = zext i32 %i to i64399    %p = getelementptr i64, ptr %a, i64 %j400    br i1 %c, label %if.then, label %if.else401 402if.then:403    store i64 0, ptr %p404    br label %exit405 406if.else:407    %v0 = load i64, ptr %p408    br label %exit409 410exit:411    %v = phi i64 [0, %if.then], [%v0, %if.else]412    ret i64 %v413}414