diff --git a/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp b/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp --- a/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp +++ b/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp @@ -88,8 +88,7 @@ void emitEndOfAsmFile(Module &M) override; void emitFunctionEntryLabel() override; - void emitDirectiveOptionArch(); - bool isSameAttribute(); + bool emitDirectiveOptionArch(); private: void emitAttributes(); @@ -252,7 +251,7 @@ return false; } -void RISCVAsmPrinter::emitDirectiveOptionArch() { +bool RISCVAsmPrinter::emitDirectiveOptionArch() { RISCVTargetStreamer &RTS = static_cast(*OutStreamer->getTargetStreamer()); SmallVector NeedEmitStdOptionArgs; @@ -268,28 +267,26 @@ : RISCVOptionArchArgType::Minus; NeedEmitStdOptionArgs.emplace_back(Delta, Feature.Key); } - if (!NeedEmitStdOptionArgs.empty()) + if (!NeedEmitStdOptionArgs.empty()) { + RTS.emitDirectiveOptionPush(); RTS.emitDirectiveOptionArch(NeedEmitStdOptionArgs); -} + return true; + } -bool RISCVAsmPrinter::isSameAttribute() { - const MCSubtargetInfo &MCSTI = *TM.getMCSubtargetInfo(); - return MCSTI.getFeatureBits() == STI->getFeatureBits(); + return false; } bool RISCVAsmPrinter::runOnMachineFunction(MachineFunction &MF) { STI = &MF.getSubtarget(); RISCVTargetStreamer &RTS = static_cast(*OutStreamer->getTargetStreamer()); - if (!isSameAttribute()) { - RTS.emitDirectiveOptionPush(); - emitDirectiveOptionArch(); - } + + bool EmittedOptionArch = emitDirectiveOptionArch(); SetupMachineFunction(MF); emitFunctionBody(); - if (!isSameAttribute()) + if (EmittedOptionArch) RTS.emitDirectiveOptionPop(); return false; } diff --git a/llvm/test/CodeGen/RISCV/riscv-func-target-feature.ll b/llvm/test/CodeGen/RISCV/riscv-func-target-feature.ll --- a/llvm/test/CodeGen/RISCV/riscv-func-target-feature.ll +++ b/llvm/test/CodeGen/RISCV/riscv-func-target-feature.ll @@ -35,10 +35,10 @@ ret void } -; CHECK: .option push +; CHECK-NOT: .option push define void @test5() "target-features"="+unaligned-scalar-mem" { ; CHECK-LABEL: test5 -; CHECK: .option pop +; CHECK-NOT: .option pop entry: ret void }