diff --git a/llvm/lib/CodeGen/InitUndef.cpp b/llvm/lib/CodeGen/InitUndef.cpp index d4ac131a32a95..d8b3190f31003 100644 --- a/llvm/lib/CodeGen/InitUndef.cpp +++ b/llvm/lib/CodeGen/InitUndef.cpp @@ -164,6 +164,14 @@ bool InitUndef::handleSubReg(MachineFunction &MF, MachineInstr &MI, TRI->getCoveringSubRegIndexes(*MRI, TargetRegClass, NeedDef, SubRegIndexNeedInsert); + // It's not possible to create the INIT_UNDEF when there is no register + // class associated for the subreg. This may happen for artificial subregs + // that are not directly addressable. + if (any_of(SubRegIndexNeedInsert, [&](unsigned Ind) -> bool { + return !TRI->getSubRegisterClass(TargetRegClass, Ind); + })) + continue; + Register LatestReg = Reg; for (auto ind : SubRegIndexNeedInsert) { Changed = true; diff --git a/llvm/test/CodeGen/AArch64/init-undef.mir b/llvm/test/CodeGen/AArch64/init-undef.mir index 7935c09d7df5e..c9d23006d3523 100644 --- a/llvm/test/CodeGen/AArch64/init-undef.mir +++ b/llvm/test/CodeGen/AArch64/init-undef.mir @@ -1,5 +1,6 @@ # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5 -# RUN: llc -mtriple=aarch64-- -run-pass=init-undef -o - %s | FileCheck %s +# RUN: llc -mtriple=aarch64-- -aarch64-enable-subreg-liveness-tracking=false -run-pass=init-undef -o - %s | FileCheck %s +# RUN: llc -mtriple=aarch64-- -aarch64-enable-subreg-liveness-tracking=true -run-pass=init-undef -o - %s | FileCheck %s --- name: test_stxp_undef