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

Kostya Serebryany kcc at google.com
Thu Nov 21 01:11:49 PST 2013


We observe failures on this test too... investigating...


On Thu, Nov 21, 2013 at 11:30 AM, Renato Golin <renato.golin at linaro.org>wrote:

> 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
>>
>
>
> _______________________________________________
> 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/db95a9c2/attachment.html>


More information about the llvm-commits mailing list