Index: lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp =================================================================== --- lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -443,7 +443,7 @@ TM.resetTargetOptions(Fn); // Reset OptLevel to None for optnone functions. CodeGenOpt::Level NewOptLevel = OptLevel; - if (Fn.hasFnAttribute(Attribute::OptimizeNone)) + if (OptLevel != CodeGenOpt::None && skipFunction(Fn)) NewOptLevel = CodeGenOpt::None; OptLevelChanger OLC(*this, NewOptLevel); Index: test/Other/X86/opt-bisect-isel.ll =================================================================== --- test/Other/X86/opt-bisect-isel.ll +++ test/Other/X86/opt-bisect-isel.ll @@ -0,0 +1,22 @@ +; This test verifies that no optimizations are performed on the @f function +; when the -opt-bisect-limit=0 option is used. In particular, the X86 +; instruction selector will optimize cmp instruction to a sub instruction if it +; is not run in -O0 mode. + +; RUN: llc -O3 -opt-bisect-limit=0 -o - %s | FileCheck %s + +target triple = "x86_64-unknown-linux-gnu" + +define void @f() { +entry: + %cmp = icmp slt i32 undef, 8 + br i1 %cmp, label %middle, label %end + +middle: + br label %end + +end: + ret void +} + +; CHECK: cmpl $8, %eax