71 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mattr=+sve2 -verify-machineinstrs < %s -o - | FileCheck %s3 4target triple = "aarch64-unknown-linux-gnu"5 6; This test is reduced from a real world example that would cause the DAGCombiner to hang.7 8define void @histcnt_loop(ptr %0, i64 %1, ptr %2, i64 %3, i64 %4) {9; CHECK-LABEL: histcnt_loop:10; CHECK: // %bb.0: // %entry11; CHECK-NEXT: mov z0.d, #1 // =0x112; CHECK-NEXT: ptrue p0.d13; CHECK-NEXT: mov x8, xzr14; CHECK-NEXT: add x9, x0, x115; CHECK-NEXT: .LBB0_1: // %loop16; CHECK-NEXT: // =>This Inner Loop Header: Depth=117; CHECK-NEXT: ld1h { z1.d }, p0/z, [x0, x8, lsl #1]18; CHECK-NEXT: lsl x10, x8, #119; CHECK-NEXT: add x11, x0, x1020; CHECK-NEXT: add x10, x9, x1021; CHECK-NEXT: lsl z1.d, z1.d, #122; CHECK-NEXT: ld1h { z4.d }, p0/z, [x11, #1, mul vl]23; CHECK-NEXT: ld1h { z5.d }, p0/z, [x10, #1, mul vl]24; CHECK-NEXT: histcnt z2.d, p0/z, z1.d, z1.d25; CHECK-NEXT: ld1h { z3.d }, p0/z, [x2, z1.d]26; CHECK-NEXT: mad z2.d, p0/m, z0.d, z3.d27; CHECK-NEXT: ld1h { z3.d }, p0/z, [x9, x8, lsl #1]28; CHECK-NEXT: add x8, x8, x329; CHECK-NEXT: cmp x4, x830; CHECK-NEXT: st1h { z2.d }, p0, [x2, z1.d]31; CHECK-NEXT: lsl z1.d, z4.d, #132; CHECK-NEXT: histcnt z2.d, p0/z, z1.d, z1.d33; CHECK-NEXT: ld1h { z4.d }, p0/z, [x2, z1.d]34; CHECK-NEXT: mad z2.d, p0/m, z0.d, z4.d35; CHECK-NEXT: st1h { z2.d }, p0, [x2, z1.d]36; CHECK-NEXT: lsl z1.d, z3.d, #137; CHECK-NEXT: histcnt z2.d, p0/z, z1.d, z1.d38; CHECK-NEXT: ld1h { z3.d }, p0/z, [x2, z1.d]39; CHECK-NEXT: mad z2.d, p0/m, z0.d, z3.d40; CHECK-NEXT: st1h { z2.d }, p0, [x2, z1.d]41; CHECK-NEXT: lsl z1.d, z5.d, #142; CHECK-NEXT: histcnt z2.d, p0/z, z1.d, z1.d43; CHECK-NEXT: ld1h { z3.d }, p0/z, [x2, z1.d]44; CHECK-NEXT: mad z2.d, p0/m, z0.d, z3.d45; CHECK-NEXT: st1h { z2.d }, p0, [x2, z1.d]46; CHECK-NEXT: b.ne .LBB0_147; CHECK-NEXT: // %bb.2: // %exit48; CHECK-NEXT: ret49entry:50 br label %loop51 52loop:53 %6 = phi i64 [ 0, %entry ], [ %15, %loop ]54 %7 = getelementptr inbounds nuw i16, ptr %0, i64 %655 %8 = getelementptr inbounds nuw i8, ptr %7, i64 %156 %9 = load <vscale x 4 x i16>, ptr %7, align 257 %10 = load <vscale x 4 x i16>, ptr %8, align 258 %11 = zext <vscale x 4 x i16> %9 to <vscale x 4 x i64>59 %12 = zext <vscale x 4 x i16> %10 to <vscale x 4 x i64>60 %13 = getelementptr inbounds nuw [16 x i16], ptr %2, i64 0, <vscale x 4 x i64> %1161 %14 = getelementptr inbounds nuw [16 x i16], ptr %2, i64 0, <vscale x 4 x i64> %1262 call void @llvm.experimental.vector.histogram.add.nxv4p0.i16(<vscale x 4 x ptr> %13, i16 1, <vscale x 4 x i1> splat (i1 true))63 call void @llvm.experimental.vector.histogram.add.nxv4p0.i16(<vscale x 4 x ptr> %14, i16 1, <vscale x 4 x i1> splat (i1 true))64 %15 = add nuw i64 %6, %365 %16 = icmp eq i64 %15, %466 br i1 %16, label %exit, label %loop67 68exit:69 ret void70}71