diff --git a/llvm/lib/Target/AVR/AVRISelLowering.cpp b/llvm/lib/Target/AVR/AVRISelLowering.cpp --- a/llvm/lib/Target/AVR/AVRISelLowering.cpp +++ b/llvm/lib/Target/AVR/AVRISelLowering.cpp @@ -1151,6 +1151,12 @@ return false; } + // FIXME: We temporarily disable post-increment load from program memory, + // due to bug https://github.com/llvm/llvm-project/issues/59914. + if (const LoadSDNode *LD = dyn_cast(N)) + if (AVR::isProgramMemoryAccess(LD)) + return false; + Base = Op->getOperand(0); Offset = DAG.getConstant(RHSC, DL, MVT::i8); AM = ISD::POST_INC; diff --git a/llvm/test/CodeGen/AVR/load.ll b/llvm/test/CodeGen/AVR/load.ll --- a/llvm/test/CodeGen/AVR/load.ll +++ b/llvm/test/CodeGen/AVR/load.ll @@ -140,3 +140,18 @@ %r.0.lcssa = phi i16 [ 0, %entry ], [ %add, %while.body ] ret i16 %r.0.lcssa } + +define ptr addrspace(1) @load16_postinc_progmem(ptr addrspace(1) readonly %0) { +; CHECK-LABEL: load16_postinc_progmem: +; CHECK: movw r30, [[REG0:r[0-9]+]] +; CHECK: lpm [[REG1:r[0-9]+]], Z+ +; CHECK: lpm [[REG1:r[0-9]+]], Z +; CHECK: call foo +; CHECK: adiw [[REG0:r[0-9]+]], 2 + %2 = load i16, ptr addrspace(1) %0, align 1 + tail call addrspace(1) void @foo(i16 %2) + %3 = getelementptr inbounds i16, ptr addrspace(1) %0, i16 1 + ret ptr addrspace(1) %3 +} + +declare void @foo(i16)