[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