[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