diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp @@ -357,8 +357,10 @@ bool HasStdExtC = STI->getFeatureBits()[RISCV::FeatureStdExtC]; unsigned MinNopLen = HasStdExtC ? 2 : 4; - if ((Count % MinNopLen) != 0) - return false; + // Align the Count to 4 (or 2 if HasStdExtC) to avoid unaligned + // nop instruction + if (Count % MinNopLen) + OS.write_zeros(Count % MinNopLen); // The canonical nop on RISC-V is addi x0, x0, 0. for (; Count >= 4; Count -= 4) diff --git a/llvm/test/MC/RISCV/align-odd.s b/llvm/test/MC/RISCV/align-odd.s new file mode 100644 --- /dev/null +++ b/llvm/test/MC/RISCV/align-odd.s @@ -0,0 +1,16 @@ +# RUN: llvm-mc -filetype=obj -triple riscv64 -mattr=-relax %s -o %t +# RUN: llvm-objdump -d %t | FileCheck %s + +# CHECK:000000000000000 <.text>: +# CHECK-NEXT: 0: 01 00 +# CHECK-NEXT: 2: 00 00 +# CHECK-NEXT: 4: 00 00 +# CHECK-NEXT: 6: 00 00 +# CHECK-NEXT: 8: 33 05 a5 00 + + + .text + .byte 1 + .word 0 + .p2align 3 + add a0, a0, a0