diff --git a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp index 87ab3847a0e9..5fef8537d1a2 100644 --- a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp +++ b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp @@ -1006,6 +1006,11 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalar(MachineInstr &MI, Observer.changedInstr(MI); return Legalized; case TargetOpcode::G_PHI: { + // FIXME: add support for when SizeOp0 isn't an exact multiple of + // NarrowSize. + if (SizeOp0 % NarrowSize != 0) + return UnableToLegalize; + unsigned NumParts = SizeOp0 / NarrowSize; SmallVector DstRegs(NumParts); SmallVector, 2> SrcRegs(MI.getNumOperands() / 2); diff --git a/llvm/test/CodeGen/AArch64/pr48188.ll b/llvm/test/CodeGen/AArch64/pr48188.ll new file mode 100644 index 000000000000..2da02e640ec1 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/pr48188.ll @@ -0,0 +1,27 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc -O0 -mtriple=aarch64-unknown-linux-gnu < %s | FileCheck %s + +; GlobalISel cannot legalize this phi, so we fall back to SDAG. +define void @test() nounwind { +; CHECK-LABEL: test: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: sub sp, sp, #16 // =16 +; CHECK-NEXT: mov x1, xzr +; CHECK-NEXT: mov x0, x1 +; CHECK-NEXT: str x1, [sp] // 8-byte Folded Spill +; CHECK-NEXT: str x0, [sp, #8] // 8-byte Folded Spill +; CHECK-NEXT: b .LBB0_1 +; CHECK-NEXT: .LBB0_1: // %loop +; CHECK-NEXT: // =>This Inner Loop Header: Depth=1 +; CHECK-NEXT: ldr x0, [sp, #8] // 8-byte Folded Reload +; CHECK-NEXT: ldr x1, [sp] // 8-byte Folded Reload +; CHECK-NEXT: str x1, [sp] // 8-byte Folded Spill +; CHECK-NEXT: str x0, [sp, #8] // 8-byte Folded Spill +; CHECK-NEXT: b .LBB0_1 +entry: + br label %loop + +loop: + %p = phi i72 [ 0, %entry ], [ %p, %loop ] + br label %loop +}