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,8 @@ void emitEndOfAsmFile(Module &M) override; void emitFunctionEntryLabel() override; - void emitDirectiveOptionArch(); - bool isSameAttribute(); + bool emitDirectiveOptionArch(); + bool isSameSupportedAttribute(); private: void emitAttributes(); @@ -252,9 +252,14 @@ return false; } -void RISCVAsmPrinter::emitDirectiveOptionArch() { +bool RISCVAsmPrinter::emitDirectiveOptionArch() { + if (isSameSupportedAttribute()) + return false; + RISCVTargetStreamer &RTS = static_cast(*OutStreamer->getTargetStreamer()); + RTS.emitDirectiveOptionPush(); + SmallVector NeedEmitStdOptionArgs; const MCSubtargetInfo &MCSTI = *TM.getMCSubtargetInfo(); for (const auto &Feature : RISCVFeatureKV) { @@ -270,26 +275,35 @@ } if (!NeedEmitStdOptionArgs.empty()) RTS.emitDirectiveOptionArch(NeedEmitStdOptionArgs); + + return true; } -bool RISCVAsmPrinter::isSameAttribute() { +bool RISCVAsmPrinter::isSameSupportedAttribute() { const MCSubtargetInfo &MCSTI = *TM.getMCSubtargetInfo(); - return MCSTI.getFeatureBits() == STI->getFeatureBits(); + for (const auto &Feature : RISCVFeatureKV) { + if (STI->hasFeature(Feature.Value) == MCSTI.hasFeature(Feature.Value)) + continue; + + if (!llvm::RISCVISAInfo::isSupportedExtensionFeature(Feature.Key)) + continue; + + return false; + } + return true; } bool RISCVAsmPrinter::runOnMachineFunction(MachineFunction &MF) { STI = &MF.getSubtarget(); RISCVTargetStreamer &RTS = static_cast(*OutStreamer->getTargetStreamer()); - if (!isSameAttribute()) { - RTS.emitDirectiveOptionPush(); - emitDirectiveOptionArch(); - } + + bool NeedEmitOptionArch = emitDirectiveOptionArch(); SetupMachineFunction(MF); emitFunctionBody(); - if (!isSameAttribute()) + if (NeedEmitOptionArch) 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 }