[llvm] r195317 - Teach ISel not to optimize 'optnone' functions.
NAKAMURA Takumi
geek4civic at gmail.com
Thu Nov 21 03:49:22 PST 2013
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=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
>>>>
>>>
>>
>
>
> _______________________________________________
> 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