brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.0 KiB · 5f5b27a Raw
142 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 42; RUN: llc -mtriple=arm64-apple-macosx -o - %s | FileCheck %s3 4%struct.zot = type { ptr, i32, ptr, ptr, i32, i32, i32, i32, i32, i32 }5 6; FIXME: currently the AND is performed on 64 bit unnecessarily.7 8; Test cases where an AND is extended from i32 -> i64 which is free. Make9; sure the extends do not get moved to the arguments, which would perform the10; AND on 64 bits unnecessarily.11 12define void @avoid_promotion_1_and(ptr nocapture noundef %arg, ptr %p) {13; CHECK-LABEL: avoid_promotion_1_and:14; CHECK:       ; %bb.0: ; %bb15; CHECK-NEXT:    ldr w8, [x0, #52]16; CHECK-NEXT:    mov w9, #10 ; =0xa17; CHECK-NEXT:  LBB0_1: ; %bb818; CHECK-NEXT:    ; =>This Inner Loop Header: Depth=119; CHECK-NEXT:    cmp w8, #320; CHECK-NEXT:    b.lo LBB0_121; CHECK-NEXT:  ; %bb.2: ; %bb922; CHECK-NEXT:    ; in Loop: Header=BB0_1 Depth=123; CHECK-NEXT:    ldr w10, [x0, #32]24; CHECK-NEXT:    ldr w11, [x1, #76]25; CHECK-NEXT:    ldr w12, [x1]26; CHECK-NEXT:    eor w10, w10, w1127; CHECK-NEXT:    and w10, w10, w1228; CHECK-NEXT:    str w10, [x0, #32]29; CHECK-NEXT:    strh w9, [x1, w10, uxtw #1]30; CHECK-NEXT:    b LBB0_131bb:32  %gep = getelementptr inbounds %struct.zot, ptr %arg, i64 0, i32 933  %l = load i32, ptr %gep, align 434  %icmp = icmp ugt i32 %l, 235  %gep1 = getelementptr inbounds %struct.zot, ptr %arg, i64 0, i32 436  %gep2 = getelementptr inbounds %struct.zot, ptr %arg, i64 0, i32 737  br label %bb838 39bb8:                                              ; preds = %bb27, %bb40  br i1 %icmp, label %bb9, label %bb2741 42bb9:                                              ; preds = %bb843  %l10 = load i32, ptr %gep1, align 844  %gep14 = getelementptr inbounds i32, ptr %p, i64 1945  %l15 = load i32, ptr %gep14, align 146  %xor = xor i32 %l10, %l1547  %l17 = load i32, ptr %p, align 848  %and = and i32 %xor, %l1749  store i32 %and, ptr %gep1, align 850  %zext19 = zext i32 %and to i6451  %gep20 = getelementptr inbounds i16, ptr %p, i64 %zext1952  store i16 10, ptr %gep20, align 253  br label %bb2754 55bb27:                                             ; preds = %bb9, %bb856  br label %bb857}58 59define void @avoid_promotion_2_and(ptr nocapture noundef %arg) {60; CHECK-LABEL: avoid_promotion_2_and:61; CHECK:       ; %bb.0: ; %entry62; CHECK-NEXT:    mov x8, xzr63; CHECK-NEXT:    add x9, x0, #3264; CHECK-NEXT:  LBB1_1: ; %loop65; CHECK-NEXT:    ; =>This Inner Loop Header: Depth=166; CHECK-NEXT:    ldr w10, [x9, #20]67; CHECK-NEXT:    cmp w10, #368; CHECK-NEXT:    b.lo LBB1_369; CHECK-NEXT:  ; %bb.2: ; %then70; CHECK-NEXT:    ; in Loop: Header=BB1_1 Depth=171; CHECK-NEXT:    ldp w13, w12, [x9, #12]72; CHECK-NEXT:    ldr w10, [x9]73; CHECK-NEXT:    ldr x11, [x0]74; CHECK-NEXT:    add x8, x8, #175; CHECK-NEXT:    ldr w14, [x9, #8]76; CHECK-NEXT:    lsl w10, w10, w1377; CHECK-NEXT:    ldrb w11, [x11, x12]78; CHECK-NEXT:    eor w10, w10, w1179; CHECK-NEXT:    ldur w11, [x9, #-24]80; CHECK-NEXT:    and w10, w10, w1481; CHECK-NEXT:    ldp x14, x13, [x9, #-16]82; CHECK-NEXT:    str w10, [x9], #5683; CHECK-NEXT:    and w11, w11, w1284; CHECK-NEXT:    ldrh w15, [x13, w10, uxtw #1]85; CHECK-NEXT:    strh w15, [x14, w11, uxtw #1]86; CHECK-NEXT:    strh w12, [x13, w10, uxtw #1]87; CHECK-NEXT:    b LBB1_188; CHECK-NEXT:  LBB1_3: ; %exit.critedge89; CHECK-NEXT:    ret90entry:91  br label %loop92 93loop:94  %p = phi i64 [ 0, %entry ], [ %p.next, %latch ]95  %gep = getelementptr inbounds %struct.zot, ptr %arg, i64 %p, i32 996  %l = load i32, ptr %gep, align 497  %icmp = icmp ugt i32 %l, 298  %gep1 = getelementptr inbounds %struct.zot, ptr %arg, i64 %p, i32 499  %gep2 = getelementptr inbounds %struct.zot, ptr %arg, i64 %p, i32 7100  %gep3 = getelementptr inbounds %struct.zot, ptr %arg, i64 %p, i32 8101  %gep4 = getelementptr inbounds %struct.zot, ptr %arg, i64 %p, i32 6102  %gep5 = getelementptr inbounds %struct.zot, ptr %arg, i64 %p, i32 3103  %gep6 = getelementptr inbounds %struct.zot, ptr %arg, i64 %p, i32 2104  %gep7 = getelementptr inbounds %struct.zot, ptr %arg, i64 %p, i32 1105  br i1 %icmp, label %then, label %latch106 107then:108  %l10 = load i32, ptr %gep1, align 8109  %l11 = load i32, ptr %gep2, align 4110  %shl = shl i32 %l10, %l11111  %l12 = load ptr, ptr %arg, align 8112  %l13 = load i32, ptr %gep3, align 8113  %zext = zext i32 %l13 to i64114  %gep14 = getelementptr inbounds i8, ptr %l12, i64 %zext115  %l15 = load i8, ptr %gep14, align 1116  %zext16 = zext i8 %l15 to i32117  %xor = xor i32 %shl, %zext16118  %l17 = load i32, ptr %gep4, align 8119  %and = and i32 %xor, %l17120  store i32 %and, ptr %gep1, align 8121  %l18 = load ptr, ptr %gep5, align 8122  %zext19 = zext i32 %and to i64123  %gep20 = getelementptr inbounds i16, ptr %l18, i64 %zext19124  %l21 = load i16, ptr %gep20, align 2125  %l22 = load ptr, ptr %gep6, align 8126  %l23 = load i32, ptr %gep7, align 8127  %and24 = and i32 %l23, %l13128  %zext25 = zext i32 %and24 to i64129  %gep26 = getelementptr inbounds i16, ptr %l22, i64 %zext25130  store i16 %l21, ptr %gep26, align 2131  %trunc = trunc i32 %l13 to i16132  store i16 %trunc, ptr %gep20, align 2133  br label %latch134 135latch:136  %p.next = add i64 %p, 1137  br i1 %icmp, label %loop, label %exit138 139exit:140  ret void141}142