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

Kostya Serebryany kcc at google.com
Thu Nov 21 01:23:34 PST 2013


The test uses -debug flag of llc, which is not available in
the LLVM_ENABLE_ASSERTIONS=OFF build.
Can we somehow limit this test to only run when assertions are enabled?



On Thu, Nov 21, 2013 at 1:11 PM, Kostya Serebryany <kcc at google.com> wrote:

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


More information about the llvm-commits mailing list