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