[llvm] r195317 - Teach ISel not to optimize 'optnone' functions.
Kostya Serebryany
kcc at google.com
Thu Nov 21 01:32:26 PST 2013
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=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/7ed17332/attachment.html>
More information about the llvm-commits
mailing list