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

Robinson, Paul Paul_Robinson at playstation.sony.com
Thu Nov 21 14:25:41 PST 2013


The original patch reset fast-math, BillW said don't do that,
I fixed it and took out the fast-math specific test.  I forgot
that this test also had something in it.  I will fix.
--paulr

> -----Original Message-----
> From: NAKAMURA Takumi [mailto:geek4civic at gmail.com]
> Sent: Thursday, November 21, 2013 3:49 AM
> To: Kostya Serebryany
> Cc: Renato Golin; LLVM Commits; Robinson, Paul
> Subject: Re: [llvm] r195317 - Teach ISel not to optimize 'optnone'
> functions.
> 
> It had been still crashing for i686-*. Reverted in r195339.
> 
> 2013/11/21 Kostya Serebryany <kcc at google.com>:
> > Should be fixed by r195333.
> >
> >
> > On Thu, Nov 21, 2013 at 1:23 PM, Kostya Serebryany <kcc at google.com>
> wrote:
> >>
> >> 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=195
> 316&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=195
> 317&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
> >>>>
> >>>
> >>
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> >






More information about the llvm-commits mailing list