[llvm] r195317 - Teach ISel not to optimize 'optnone' functions.

Renato Golin renato.golin at linaro.org
Wed Nov 20 23:30:32 PST 2013


Hi Paul,

I know our bot is a bit unstable lately, but this seems like a real test
error:

http://lab.llvm.org:8011/builders/clang-native-arm-cortex-a9/builds/13534

cheers,
--renato


On 21 November 2013 06:33, Paul Robinson <paul_robinson at playstation.sony.com
> wrote:

> Author: probinson
> Date: Thu Nov 21 00:33:32 2013
> New Revision: 195317
>
> URL: http://llvm.org/viewvc/llvm-project?rev=195317&view=rev
> Log:
> Teach ISel not to optimize 'optnone' functions.
>
> Based on work by Andrea Di Biagio.
>
> Added:
>     llvm/trunk/test/CodeGen/Generic/isel-optnone.ll
> Modified:
>     llvm/trunk/include/llvm/MC/MCCodeGenInfo.h
>     llvm/trunk/include/llvm/Target/TargetMachine.h
>     llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
>     llvm/trunk/lib/Target/TargetMachine.cpp
>
> Modified: llvm/trunk/include/llvm/MC/MCCodeGenInfo.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCCodeGenInfo.h?rev=195317&r1=195316&r2=195317&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCCodeGenInfo.h (original)
> +++ llvm/trunk/include/llvm/MC/MCCodeGenInfo.h Thu Nov 21 00:33:32 2013
> @@ -42,6 +42,9 @@ namespace llvm {
>      CodeModel::Model getCodeModel() const { return CMModel; }
>
>      CodeGenOpt::Level getOptLevel() const { return OptLevel; }
> +
> +    // Allow overriding OptLevel on a per-function basis.
> +    void setOptLevel(CodeGenOpt::Level Level) { OptLevel = Level; }
>    };
>  } // namespace llvm
>
>
> Modified: llvm/trunk/include/llvm/Target/TargetMachine.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetMachine.h?rev=195317&r1=195316&r2=195317&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Target/TargetMachine.h (original)
> +++ llvm/trunk/include/llvm/Target/TargetMachine.h Thu Nov 21 00:33:32 2013
> @@ -75,7 +75,8 @@ protected: // Can only create subclasses
>    std::string TargetFS;
>
>    /// CodeGenInfo - Low level target information such as relocation model.
> -  const MCCodeGenInfo *CodeGenInfo;
> +  /// Non-const to allow resetting optimization level per-function.
> +  MCCodeGenInfo *CodeGenInfo;
>
>    /// AsmInfo - Contains target specific asm information.
>    ///
> @@ -213,6 +214,9 @@ public:
>    /// Default, or Aggressive.
>    CodeGenOpt::Level getOptLevel() const;
>
> +  /// \brief Overrides the optimization level.
> +  void setOptLevel(CodeGenOpt::Level Level) const;
> +
>    void setFastISel(bool Enable) { Options.EnableFastISel = Enable; }
>
>    bool shouldPrintMachineCode() const { return Options.PrintMachineCode; }
>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp?rev=195317&r1=195316&r2=195317&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Thu Nov 21
> 00:33:32 2013
> @@ -223,6 +223,39 @@ defaultListDAGScheduler("default", "Best
>
>  namespace llvm {
>
>  //===--------------------------------------------------------------------===//
> +  /// \brief This struct is used by SelectionDAGISel to temporarily
> override
> +  /// the optimization level on a per-function basis.
> +  class OptLevelChanger {
> +    SelectionDAGISel &IS;
> +    CodeGenOpt::Level SavedOptLevel;
> +
> +  public:
> +    OptLevelChanger(SelectionDAGISel &ISel,
> +                    CodeGenOpt::Level NewOptLevel) : IS(ISel) {
> +      SavedOptLevel = IS.OptLevel;
> +      if (NewOptLevel == SavedOptLevel)
> +        return;
> +      IS.OptLevel = NewOptLevel;
> +      IS.TM.setOptLevel(NewOptLevel);
> +      DEBUG(dbgs() << "\nChanging optimization level for Function "
> +            << IS.MF->getFunction()->getName() << "\n");
> +      DEBUG(dbgs() << "\tBefore: -O" << SavedOptLevel
> +            << " ; After: -O" << NewOptLevel << "\n");
> +    }
> +
> +    ~OptLevelChanger() {
> +      if (IS.OptLevel == SavedOptLevel)
> +        return;
> +      DEBUG(dbgs() << "\nRestoring optimization level for Function "
> +            << IS.MF->getFunction()->getName() << "\n");
> +      DEBUG(dbgs() << "\tBefore: -O" << IS.OptLevel
> +            << " ; After: -O" << SavedOptLevel << "\n");
> +      IS.OptLevel = SavedOptLevel;
> +      IS.TM.setOptLevel(SavedOptLevel);
> +    }
> +  };
> +
> +
>  //===--------------------------------------------------------------------===//
>    /// createDefaultScheduler - This creates an instruction scheduler
> appropriate
>    /// for the target.
>    ScheduleDAGSDNodes* createDefaultScheduler(SelectionDAGISel *IS,
> @@ -370,6 +403,12 @@ bool SelectionDAGISel::runOnMachineFunct
>    ST.resetSubtargetFeatures(MF);
>    TM.resetTargetOptions(MF);
>
> +  // Reset OptLevel to None for optnone functions.
> +  CodeGenOpt::Level NewOptLevel = OptLevel;
> +  if (Fn.hasFnAttribute(Attribute::OptimizeNone))
> +    NewOptLevel = CodeGenOpt::None;
> +  OptLevelChanger OLC(*this, NewOptLevel);
> +
>    DEBUG(dbgs() << "\n\n\n=== " << Fn.getName() << "\n");
>
>    SplitCriticalSideEffectEdges(const_cast<Function&>(Fn), this);
> @@ -948,7 +987,7 @@ static void collectFailStats(const Instr
>  void SelectionDAGISel::SelectAllBasicBlocks(const Function &Fn) {
>    // Initialize the Fast-ISel state, if needed.
>    FastISel *FastIS = 0;
> -  if (TM.Options.EnableFastISel)
> +  if (TM.Options.EnableFastISel ||
> Fn.hasFnAttribute(Attribute::OptimizeNone))
>      FastIS = getTargetLowering()->createFastISel(*FuncInfo, LibInfo);
>
>    // Iterate over all basic blocks in the function.
>
> Modified: llvm/trunk/lib/Target/TargetMachine.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/TargetMachine.cpp?rev=195317&r1=195316&r2=195317&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/TargetMachine.cpp (original)
> +++ llvm/trunk/lib/Target/TargetMachine.cpp Thu Nov 21 00:33:32 2013
> @@ -164,6 +164,11 @@ CodeGenOpt::Level TargetMachine::getOptL
>    return CodeGenInfo->getOptLevel();
>  }
>
> +void TargetMachine::setOptLevel(CodeGenOpt::Level Level) const {
> +  if (CodeGenInfo)
> +    CodeGenInfo->setOptLevel(Level);
> +}
> +
>  bool TargetMachine::getAsmVerbosityDefault() {
>    return AsmVerbosityDefault;
>  }
>
> Added: llvm/trunk/test/CodeGen/Generic/isel-optnone.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Generic/isel-optnone.ll?rev=195317&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/Generic/isel-optnone.ll (added)
> +++ llvm/trunk/test/CodeGen/Generic/isel-optnone.ll Thu Nov 21 00:33:32
> 2013
> @@ -0,0 +1,31 @@
> +; RUN: llc -debug < %s -o /dev/null 2>&1 | FileCheck %s
> +
> +; Verify that the backend correctly overrides the optimization level
> +; of optnone functions during instruction selection.
> +
> +define float @foo(float %x) #0 {
> +entry:
> +  %add = fadd fast float %x, %x
> +  %add1 = fadd fast float %add, %x
> +  ret float %add1
> +}
> +
> +; CHECK-NOT: Changing optimization level for Function foo
> +; CHECK-NOT: Restoring optimization level for Function foo
> +
> +; Function Attrs: noinline optnone
> +define float @fooWithOptnone(float %x) #1 {
> +entry:
> +  %add = fadd fast float %x, %x
> +  %add1 = fadd fast float %add, %x
> +  ret float %add1
> +}
> +
> +; CHECK: Changing optimization level for Function fooWithOptnone
> +; CHECK-NEXT: Before: -O2 ; After: -O0
> +
> +; CHECK: Restoring optimization level for Function fooWithOptnone
> +; CHECK-NEXT: Before: -O0 ; After: -O2
> +
> +attributes #0 = { "unsafe-fp-math"="true" }
> +attributes #1 = { noinline optnone "unsafe-fp-math"="true" }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20131121/bf2d15a3/attachment.html>


More information about the llvm-commits mailing list