Skip to content

Commit

Permalink
Merged master:9130651126b7 into amd-gfx:02301f694469
Browse files Browse the repository at this point in the history
Local branch amd-gfx 02301f6 Merged master:28d7ba15435f into amd-gfx:b20f02ee5a0a
Remote branch master 9130651 Revert "[SCEV] Generalize no-self-wrap check in isLoopInvariantExitCondDuringFirstIterations"
  • Loading branch information
Sw authored and Sw committed Nov 25, 2020
2 parents 02301f6 + 9130651 commit 3f56339
Show file tree
Hide file tree
Showing 16 changed files with 149 additions and 69 deletions.
9 changes: 9 additions & 0 deletions llvm/include/llvm/CodeGen/TargetLowering.h
Original file line number Diff line number Diff line change
Expand Up @@ -4277,6 +4277,15 @@ class TargetLowering : public TargetLoweringBase {
return SDValue();
}

/// Return a target-dependent comparison result if the input operand is
/// suitable for use with a square root estimate calculation. For example, the
/// comparison may check if the operand is NAN, INF, zero, normal, etc. The
/// result should be used as the condition operand for a select or branch.
virtual SDValue getSqrtInputTest(SDValue Operand, SelectionDAG &DAG,
const DenormalMode &Mode) const {
return SDValue();
}

//===--------------------------------------------------------------------===//
// Legalization utility functions
//
Expand Down
12 changes: 12 additions & 0 deletions llvm/include/llvm/Passes/PassBuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -597,6 +597,15 @@ class PassBuilder {
PipelineStartEPCallbacks.push_back(C);
}

/// Register a callback for a default optimizer pipeline extension point.
///
/// This extension point allows adding optimization right after passes that do
/// basic simplification of the input IR.
void registerPipelineEarlySimplificationEPCallback(
const std::function<void(ModulePassManager &, OptimizationLevel)> &C) {
PipelineEarlySimplificationEPCallbacks.push_back(C);
}

/// Register a callback for a default optimizer pipeline extension point
///
/// This extension point allows adding optimizations at the very end of the
Expand Down Expand Up @@ -729,6 +738,9 @@ class PassBuilder {
// Module callbacks
SmallVector<std::function<void(ModulePassManager &, OptimizationLevel)>, 2>
PipelineStartEPCallbacks;
SmallVector<std::function<void(ModulePassManager &, OptimizationLevel)>, 2>
PipelineEarlySimplificationEPCallbacks;

SmallVector<std::function<void(ModuleAnalysisManager &)>, 2>
ModuleAnalysisRegistrationCallbacks;
SmallVector<std::function<bool(StringRef, ModulePassManager &,
Expand Down
31 changes: 15 additions & 16 deletions llvm/lib/Analysis/ScalarEvolution.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9643,33 +9643,32 @@ ScalarEvolution::getLoopInvariantExitCondDuringFirstIterations(
if (!ICmpInst::isRelational(Pred))
return None;

// TODO: Support steps other than +/- 1.
const SCEV *Step = AR->getStepRecurrence(*this);
bool IsStepNonPositive = isKnownNonPositive(Step);
if (!IsStepNonPositive && !isKnownNonNegative(Step))
auto *One = getOne(Step->getType());
auto *MinusOne = getNegativeSCEV(One);
if (Step != One && Step != MinusOne)
return None;
bool HasNoSelfWrap = AR->hasNoSelfWrap();
if (!HasNoSelfWrap)
// If num iter has same type as the AddRec, and step is +/- 1, even max
// possible number of iterations is not enough to self-wrap.
if (MaxIter->getType() == AR->getType())
if (Step == getOne(AR->getType()) || Step == getMinusOne(AR->getType()))
HasNoSelfWrap = true;
// Only proceed with non-self-wrapping ARs.
if (!HasNoSelfWrap)

// Type mismatch here means that MaxIter is potentially larger than max
// unsigned value in start type, which mean we cannot prove no wrap for the
// indvar.
if (AR->getType() != MaxIter->getType())
return None;

// Value of IV on suggested last iteration.
const SCEV *Last = AR->evaluateAtIteration(MaxIter, *this);
// Does it still meet the requirement?
if (!isKnownPredicateAt(Pred, Last, RHS, Context))
return None;
// We know that the addrec does not have a self-wrap. To prove that there is
// no signed/unsigned wrap, we need to check that
// Start <= Last for positive step or Start >= Last for negative step. Either
// works for zero step.
// Because step is +/- 1 and MaxIter has same type as Start (i.e. it does
// not exceed max unsigned value of this type), this effectively proves
// that there is no wrap during the iteration. To prove that there is no
// signed/unsigned wrap, we need to check that
// Start <= Last for step = 1 or Start >= Last for step = -1.
ICmpInst::Predicate NoOverflowPred =
CmpInst::isSigned(Pred) ? ICmpInst::ICMP_SLE : ICmpInst::ICMP_ULE;
if (IsStepNonPositive)
if (Step == MinusOne)
NoOverflowPred = CmpInst::getSwappedPredicate(NoOverflowPred);
const SCEV *Start = AR->getStart();
if (!isKnownPredicateAt(NoOverflowPred, Start, Last, Context))
Expand Down
41 changes: 23 additions & 18 deletions llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22056,26 +22056,31 @@ SDValue DAGCombiner::buildSqrtEstimateImpl(SDValue Op, SDNodeFlags Flags,
// possibly a denormal. Force the answer to 0.0 for those cases.
SDLoc DL(Op);
EVT CCVT = getSetCCResultType(VT);
ISD::NodeType SelOpcode = VT.isVector() ? ISD::VSELECT : ISD::SELECT;
SDValue FPZero = DAG.getConstantFP(0.0, DL, VT);
DenormalMode DenormMode = DAG.getDenormalMode(VT);
if (DenormMode.Input == DenormalMode::IEEE) {
// This is specifically a check for the handling of denormal inputs,
// not the result.

// fabs(X) < SmallestNormal ? 0.0 : Est
const fltSemantics &FltSem = DAG.EVTToAPFloatSemantics(VT);
APFloat SmallestNorm = APFloat::getSmallestNormalized(FltSem);
SDValue NormC = DAG.getConstantFP(SmallestNorm, DL, VT);
SDValue FPZero = DAG.getConstantFP(0.0, DL, VT);
SDValue Fabs = DAG.getNode(ISD::FABS, DL, VT, Op);
SDValue IsDenorm = DAG.getSetCC(DL, CCVT, Fabs, NormC, ISD::SETLT);
Est = DAG.getNode(SelOpcode, DL, VT, IsDenorm, FPZero, Est);
} else {
// X == 0.0 ? 0.0 : Est
SDValue FPZero = DAG.getConstantFP(0.0, DL, VT);
SDValue IsZero = DAG.getSetCC(DL, CCVT, Op, FPZero, ISD::SETEQ);
Est = DAG.getNode(SelOpcode, DL, VT, IsZero, FPZero, Est);
// Try the target specific test first.
SDValue Test = TLI.getSqrtInputTest(Op, DAG, DenormMode);
if (!Test) {
// If no test provided by target, testing it with denormal inputs to
// avoid wrong estimate.
if (DenormMode.Input == DenormalMode::IEEE) {
// This is specifically a check for the handling of denormal inputs,
// not the result.

// Test = fabs(X) < SmallestNormal
const fltSemantics &FltSem = DAG.EVTToAPFloatSemantics(VT);
APFloat SmallestNorm = APFloat::getSmallestNormalized(FltSem);
SDValue NormC = DAG.getConstantFP(SmallestNorm, DL, VT);
SDValue Fabs = DAG.getNode(ISD::FABS, DL, VT, Op);
Test = DAG.getSetCC(DL, CCVT, Fabs, NormC, ISD::SETLT);
} else
// Test = X == 0.0
Test = DAG.getSetCC(DL, CCVT, Op, FPZero, ISD::SETEQ);
}
// Test ? 0.0 : Est
Est = DAG.getNode(Test.getValueType().isVector() ? ISD::VSELECT
: ISD::SELECT,
DL, VT, Test, FPZero, Est);
}
}
return Est;
Expand Down
5 changes: 5 additions & 0 deletions llvm/lib/Passes/PassBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1032,6 +1032,9 @@ PassBuilder::buildModuleSimplificationPipeline(OptimizationLevel Level,
if (Phase == ThinLTOPhase::PostLink)
MPM.addPass(LowerTypeTestsPass(nullptr, nullptr, true));

for (auto &C : PipelineEarlySimplificationEPCallbacks)
C(MPM, Level);

// Interprocedural constant propagation now that basic cleanup has occurred
// and prior to optimizing globals.
// FIXME: This position in the pipeline hasn't been carefully considered in
Expand Down Expand Up @@ -1703,6 +1706,8 @@ ModulePassManager PassBuilder::buildO0DefaultPipeline(OptimizationLevel Level,

for (auto &C : PipelineStartEPCallbacks)
C(MPM, Level);
for (auto &C : PipelineEarlySimplificationEPCallbacks)
C(MPM, Level);

// Build a minimal pipeline based on the semantics required by LLVM,
// which is just that always inlining occurs. Further, disable generating
Expand Down
29 changes: 29 additions & 0 deletions llvm/lib/Target/PowerPC/PPCISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1447,6 +1447,8 @@ const char *PPCTargetLowering::getTargetNodeName(unsigned Opcode) const {
return "PPCISD::FP_TO_SINT_IN_VSR";
case PPCISD::FRE: return "PPCISD::FRE";
case PPCISD::FRSQRTE: return "PPCISD::FRSQRTE";
case PPCISD::FTSQRT:
return "PPCISD::FTSQRT";
case PPCISD::STFIWX: return "PPCISD::STFIWX";
case PPCISD::VPERM: return "PPCISD::VPERM";
case PPCISD::XXSPLT: return "PPCISD::XXSPLT";
Expand Down Expand Up @@ -12758,6 +12760,33 @@ static int getEstimateRefinementSteps(EVT VT, const PPCSubtarget &Subtarget) {
return RefinementSteps;
}

SDValue PPCTargetLowering::getSqrtInputTest(SDValue Op, SelectionDAG &DAG,
const DenormalMode &Mode) const {
// TODO - add support for v2f64/v4f32
EVT VT = Op.getValueType();
if (VT != MVT::f64)
return SDValue();

SDLoc DL(Op);
// The output register of FTSQRT is CR field.
SDValue FTSQRT = DAG.getNode(PPCISD::FTSQRT, DL, MVT::i32, Op);
// ftsqrt BF,FRB
// Let e_b be the unbiased exponent of the double-precision
// floating-point operand in register FRB.
// fe_flag is set to 1 if either of the following conditions occurs.
// - The double-precision floating-point operand in register FRB is a zero,
// a NaN, or an infinity, or a negative value.
// - e_b is less than or equal to -970.
// Otherwise fe_flag is set to 0.
// Both VSX and non-VSX versions would set EQ bit in the CR if the number is
// not eligible for iteration. (zero/negative/infinity/nan or unbiased
// exponent is less than -970)
SDValue SRIdxVal = DAG.getTargetConstant(PPC::sub_eq, DL, MVT::i32);
return SDValue(DAG.getMachineNode(TargetOpcode::EXTRACT_SUBREG, DL, MVT::i1,
FTSQRT, SRIdxVal),
0);
}

SDValue PPCTargetLowering::getSqrtEstimate(SDValue Operand, SelectionDAG &DAG,
int Enabled, int &RefinementSteps,
bool &UseOneConstNR,
Expand Down
5 changes: 5 additions & 0 deletions llvm/lib/Target/PowerPC/PPCISelLowering.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,9 @@ namespace llvm {
FRE,
FRSQRTE,

/// Test instruction for software square root.
FTSQRT,

/// VPERM - The PPC VPERM Instruction.
///
VPERM,
Expand Down Expand Up @@ -1283,6 +1286,8 @@ namespace llvm {
bool Reciprocal) const override;
SDValue getRecipEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled,
int &RefinementSteps) const override;
SDValue getSqrtInputTest(SDValue Operand, SelectionDAG &DAG,
const DenormalMode &Mode) const override;
unsigned combineRepeatedFPDivisors() const override;

SDValue
Expand Down
3 changes: 2 additions & 1 deletion llvm/lib/Target/PowerPC/PPCInstrFormats.td
Original file line number Diff line number Diff line change
Expand Up @@ -637,9 +637,10 @@ class XForm_17<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
}

class XForm_17a<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
InstrItinClass itin>
InstrItinClass itin, list<dag> pattern>
: XForm_17<opcode, xo, OOL, IOL, asmstr, itin > {
let FRA = 0;
let Pattern = pattern;
}

class XForm_18<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Expand Down
7 changes: 6 additions & 1 deletion llvm/lib/Target/PowerPC/PPCInstrInfo.td
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,9 @@ def SDT_PPCcondbr : SDTypeProfile<0, 3, [
SDTCisVT<0, i32>, SDTCisVT<2, OtherVT>
]>;

def SDT_PPCFtsqrt : SDTypeProfile<1, 1, [
SDTCisVT<0, i32>]>;

def SDT_PPClbrx : SDTypeProfile<1, 2, [
SDTCisInt<0>, SDTCisPtrTy<1>, SDTCisVT<2, OtherVT>
]>;
Expand Down Expand Up @@ -124,6 +127,7 @@ def SDT_PPCFPMinMax : SDTypeProfile<1, 2, [

def PPCfre : SDNode<"PPCISD::FRE", SDTFPUnaryOp, []>;
def PPCfrsqrte: SDNode<"PPCISD::FRSQRTE", SDTFPUnaryOp, []>;
def PPCftsqrt : SDNode<"PPCISD::FTSQRT", SDT_PPCFtsqrt,[]>;

def PPCfcfid : SDNode<"PPCISD::FCFID", SDTFPUnaryOp, []>;
def PPCfcfidu : SDNode<"PPCISD::FCFIDU", SDTFPUnaryOp, []>;
Expand Down Expand Up @@ -2643,7 +2647,8 @@ let isCompare = 1, mayRaiseFPException = 1, hasSideEffects = 0 in {
def FTDIV: XForm_17<63, 128, (outs crrc:$crD), (ins f8rc:$fA, f8rc:$fB),
"ftdiv $crD, $fA, $fB", IIC_FPCompare>;
def FTSQRT: XForm_17a<63, 160, (outs crrc:$crD), (ins f8rc:$fB),
"ftsqrt $crD, $fB", IIC_FPCompare>;
"ftsqrt $crD, $fB", IIC_FPCompare,
[(set i32:$crD, (PPCftsqrt f64:$fB))]>;

let mayRaiseFPException = 1, hasSideEffects = 0 in {
let Interpretation64Bit = 1, isCodeGenOnly = 1 in
Expand Down
3 changes: 2 additions & 1 deletion llvm/lib/Target/PowerPC/PPCInstrVSX.td
Original file line number Diff line number Diff line change
Expand Up @@ -629,7 +629,8 @@ let hasSideEffects = 0 in {
"xstdivdp $crD, $XA, $XB", IIC_FPCompare, []>;
def XSTSQRTDP : XX2Form_1<60, 106,
(outs crrc:$crD), (ins vsfrc:$XB),
"xstsqrtdp $crD, $XB", IIC_FPCompare, []>;
"xstsqrtdp $crD, $XB", IIC_FPCompare,
[(set i32:$crD, (PPCftsqrt f64:$XB))]>;
def XVTDIVDP : XX3Form_1<60, 125,
(outs crrc:$crD), (ins vsrc:$XA, vsrc:$XB),
"xvtdivdp $crD, $XA, $XB", IIC_FPCompare, []>;
Expand Down
7 changes: 2 additions & 5 deletions llvm/test/CodeGen/PowerPC/fma-mutate.ll
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,9 @@ declare double @llvm.sqrt.f64(double)
define double @foo3_fmf(double %a) nounwind {
; CHECK-LABEL: foo3_fmf:
; CHECK: # %bb.0:
; CHECK-NEXT: xsabsdp 0, 1
; CHECK-NEXT: addis 3, 2, .LCPI0_2@toc@ha
; CHECK-NEXT: lfd 2, .LCPI0_2@toc@l(3)
; CHECK-NEXT: xscmpudp 0, 0, 2
; CHECK-NEXT: xstsqrtdp 0, 1
; CHECK-NEXT: xxlxor 0, 0, 0
; CHECK-NEXT: blt 0, .LBB0_2
; CHECK-NEXT: bc 12, 2, .LBB0_2
; CHECK-NEXT: # %bb.1:
; CHECK-NEXT: xsrsqrtedp 0, 1
; CHECK-NEXT: addis 3, 2, .LCPI0_0@toc@ha
Expand Down
45 changes: 18 additions & 27 deletions llvm/test/CodeGen/PowerPC/recipest.ll
Original file line number Diff line number Diff line change
Expand Up @@ -749,11 +749,8 @@ define <4 x float> @hoo2_safe(<4 x float> %a, <4 x float> %b) nounwind {
define double @foo3_fmf(double %a) nounwind {
; CHECK-P7-LABEL: foo3_fmf:
; CHECK-P7: # %bb.0:
; CHECK-P7-NEXT: fabs 0, 1
; CHECK-P7-NEXT: addis 3, 2, .LCPI20_2@toc@ha
; CHECK-P7-NEXT: lfd 2, .LCPI20_2@toc@l(3)
; CHECK-P7-NEXT: fcmpu 0, 0, 2
; CHECK-P7-NEXT: blt 0, .LBB20_2
; CHECK-P7-NEXT: ftsqrt 0, 1
; CHECK-P7-NEXT: bc 12, 2, .LBB20_2
; CHECK-P7-NEXT: # %bb.1:
; CHECK-P7-NEXT: frsqrte 0, 1
; CHECK-P7-NEXT: addis 3, 2, .LCPI20_0@toc@ha
Expand All @@ -770,18 +767,15 @@ define double @foo3_fmf(double %a) nounwind {
; CHECK-P7-NEXT: fmul 1, 1, 0
; CHECK-P7-NEXT: blr
; CHECK-P7-NEXT: .LBB20_2:
; CHECK-P7-NEXT: addis 3, 2, .LCPI20_3@toc@ha
; CHECK-P7-NEXT: lfs 1, .LCPI20_3@toc@l(3)
; CHECK-P7-NEXT: addis 3, 2, .LCPI20_2@toc@ha
; CHECK-P7-NEXT: lfs 1, .LCPI20_2@toc@l(3)
; CHECK-P7-NEXT: blr
;
; CHECK-P8-LABEL: foo3_fmf:
; CHECK-P8: # %bb.0:
; CHECK-P8-NEXT: xsabsdp 0, 1
; CHECK-P8-NEXT: addis 3, 2, .LCPI20_2@toc@ha
; CHECK-P8-NEXT: lfd 2, .LCPI20_2@toc@l(3)
; CHECK-P8-NEXT: xscmpudp 0, 0, 2
; CHECK-P8-NEXT: xstsqrtdp 0, 1
; CHECK-P8-NEXT: xxlxor 0, 0, 0
; CHECK-P8-NEXT: blt 0, .LBB20_2
; CHECK-P8-NEXT: bc 12, 2, .LBB20_2
; CHECK-P8-NEXT: # %bb.1:
; CHECK-P8-NEXT: xsrsqrtedp 0, 1
; CHECK-P8-NEXT: addis 3, 2, .LCPI20_0@toc@ha
Expand All @@ -803,12 +797,9 @@ define double @foo3_fmf(double %a) nounwind {
;
; CHECK-P9-LABEL: foo3_fmf:
; CHECK-P9: # %bb.0:
; CHECK-P9-NEXT: addis 3, 2, .LCPI20_2@toc@ha
; CHECK-P9-NEXT: xsabsdp 0, 1
; CHECK-P9-NEXT: lfd 2, .LCPI20_2@toc@l(3)
; CHECK-P9-NEXT: xscmpudp 0, 0, 2
; CHECK-P9-NEXT: xstsqrtdp 0, 1
; CHECK-P9-NEXT: xxlxor 0, 0, 0
; CHECK-P9-NEXT: blt 0, .LBB20_2
; CHECK-P9-NEXT: bc 12, 2, .LBB20_2
; CHECK-P9-NEXT: # %bb.1:
; CHECK-P9-NEXT: xsrsqrtedp 0, 1
; CHECK-P9-NEXT: addis 3, 2, .LCPI20_0@toc@ha
Expand Down Expand Up @@ -1038,18 +1029,18 @@ define <2 x double> @hoo4_fmf(<2 x double> %a) #1 {
; CHECK-P7-LABEL: hoo4_fmf:
; CHECK-P7: # %bb.0:
; CHECK-P7-NEXT: addis 3, 2, .LCPI26_2@toc@ha
; CHECK-P7-NEXT: ftsqrt 0, 1
; CHECK-P7-NEXT: fmr 3, 1
; CHECK-P7-NEXT: addis 4, 2, .LCPI26_1@toc@ha
; CHECK-P7-NEXT: addis 4, 2, .LCPI26_0@toc@ha
; CHECK-P7-NEXT: lfs 0, .LCPI26_2@toc@l(3)
; CHECK-P7-NEXT: addis 3, 2, .LCPI26_0@toc@ha
; CHECK-P7-NEXT: lfs 4, .LCPI26_1@toc@l(4)
; CHECK-P7-NEXT: lfs 5, .LCPI26_0@toc@l(3)
; CHECK-P7-NEXT: fcmpu 0, 1, 0
; CHECK-P7-NEXT: addis 3, 2, .LCPI26_1@toc@ha
; CHECK-P7-NEXT: lfs 5, .LCPI26_0@toc@l(4)
; CHECK-P7-NEXT: lfs 4, .LCPI26_1@toc@l(3)
; CHECK-P7-NEXT: fmr 1, 0
; CHECK-P7-NEXT: bne 0, .LBB26_3
; CHECK-P7-NEXT: bc 4, 2, .LBB26_3
; CHECK-P7-NEXT: # %bb.1:
; CHECK-P7-NEXT: fcmpu 0, 2, 0
; CHECK-P7-NEXT: bne 0, .LBB26_4
; CHECK-P7-NEXT: ftsqrt 0, 2
; CHECK-P7-NEXT: bc 4, 2, .LBB26_4
; CHECK-P7-NEXT: .LBB26_2:
; CHECK-P7-NEXT: fmr 2, 0
; CHECK-P7-NEXT: blr
Expand All @@ -1063,8 +1054,8 @@ define <2 x double> @hoo4_fmf(<2 x double> %a) #1 {
; CHECK-P7-NEXT: fmadd 1, 3, 1, 5
; CHECK-P7-NEXT: fmul 3, 3, 4
; CHECK-P7-NEXT: fmul 1, 3, 1
; CHECK-P7-NEXT: fcmpu 0, 2, 0
; CHECK-P7-NEXT: beq 0, .LBB26_2
; CHECK-P7-NEXT: ftsqrt 0, 2
; CHECK-P7-NEXT: bc 12, 2, .LBB26_2
; CHECK-P7-NEXT: .LBB26_4:
; CHECK-P7-NEXT: frsqrte 0, 2
; CHECK-P7-NEXT: fmul 3, 2, 0
Expand Down
1 change: 1 addition & 0 deletions llvm/test/Other/new-pm-O0-ep-callbacks.ll
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
; RUN: opt -disable-output -debug-pass-manager -passes-ep-cgscc-optimizer-late=no-op-cgscc -passes='default<O0>' 2>&1 < %s | FileCheck %s
; RUN: opt -disable-output -debug-pass-manager -passes-ep-vectorizer-start=no-op-function -passes='default<O0>' 2>&1 < %s | FileCheck %s
; RUN: opt -disable-output -debug-pass-manager -passes-ep-pipeline-start=no-op-module -passes='default<O0>' 2>&1 < %s | FileCheck %s
; RUN: opt -disable-output -debug-pass-manager -passes-ep-pipeline-early-simplification=no-op-module -passes='default<O0>' 2>&1 < %s | FileCheck %s
; RUN: opt -disable-output -debug-pass-manager -passes-ep-optimizer-last=no-op-function -passes='default<O0>' 2>&1 < %s | FileCheck %s

; CHECK: Running pass: NoOp
Expand Down
Loading

0 comments on commit 3f56339

Please sign in to comment.