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

Robinson, Paul Paul_Robinson at playstation.sony.com
Fri Nov 22 11:17:53 PST 2013


Tweaked patch (with completely different test) in r195491.
Should be okay even on i686. :-)
--paulr

> -----Original Message-----
> From: llvm-commits-bounces at cs.uiuc.edu [mailto:llvm-commits-
> bounces at cs.uiuc.edu] On Behalf Of Robinson, Paul
> Sent: Thursday, November 21, 2013 2:26 PM
> To: NAKAMURA Takumi; Kostya Serebryany
> Cc: LLVM Commits
> Subject: RE: [llvm] r195317 - Teach ISel not to optimize 'optnone'
> functions.
> 
> 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
> > >
> 
> 
> 
> _______________________________________________
> 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