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