Index: llvm/trunk/lib/Transforms/Scalar/GuardWidening.cpp =================================================================== --- llvm/trunk/lib/Transforms/Scalar/GuardWidening.cpp +++ llvm/trunk/lib/Transforms/Scalar/GuardWidening.cpp @@ -347,6 +347,12 @@ Instruction *GuardInst, const df_iterator &DFSI, const DenseMap> & GuardsInBlock, bool InvertCondition) { + // Ignore trivial true or false conditions. These instructions will be + // trivially eliminated by any cleanup pass. Do not erase them because other + // guards can possibly be widened into them. + if (isa(getCondition(GuardInst))) + return false; + Instruction *BestSoFar = nullptr; auto BestScoreSoFar = WS_IllegalOrNegative; auto *GuardInstLoop = LI.getLoopFor(GuardInst->getParent()); Index: llvm/trunk/test/Transforms/GuardWidening/basic.ll =================================================================== --- llvm/trunk/test/Transforms/GuardWidening/basic.ll +++ llvm/trunk/test/Transforms/GuardWidening/basic.ll @@ -379,3 +379,29 @@ right: ret void } + +; Make sure we do not widen guard by trivial true conditions into something. +define void @f_15(i1 %cond_0, i1 %cond_1) { +; CHECK-LABEL: @f_15( +entry: +; CHECK: call void (i1, ...) @llvm.experimental.guard(i1 %cond_0) [ "deopt"() ] +; CHECK: call void (i1, ...) @llvm.experimental.guard(i1 true) [ "deopt"() ] +; CHECK: ret void + + call void(i1, ...) @llvm.experimental.guard(i1 %cond_0) [ "deopt"() ] + call void(i1, ...) @llvm.experimental.guard(i1 true) [ "deopt"() ] + ret void +} + +; Make sure we do not widen guard by trivial false conditions into something. +define void @f_16(i1 %cond_0, i1 %cond_1) { +; CHECK-LABEL: @f_16( +entry: +; CHECK: call void (i1, ...) @llvm.experimental.guard(i1 %cond_0) [ "deopt"() ] +; CHECK: call void (i1, ...) @llvm.experimental.guard(i1 false) [ "deopt"() ] +; CHECK: ret void + + call void(i1, ...) @llvm.experimental.guard(i1 %cond_0) [ "deopt"() ] + call void(i1, ...) @llvm.experimental.guard(i1 false) [ "deopt"() ] + ret void +}