92 changes: 89 additions & 3 deletions llvm/lib/Analysis/CtxProfAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include "llvm/Analysis/CtxProfAnalysis.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/IR/Analysis.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/PassManager.h"
#include "llvm/ProfileData/PGOCtxProfReader.h"
Expand Down Expand Up @@ -64,10 +65,39 @@ Value toJSON(const PGOCtxProfContext::CallTargetMapTy &P) {
} // namespace json
} // namespace llvm

const char *AssignGUIDPass::GUIDMetadataName = "guid";

PreservedAnalyses AssignGUIDPass::run(Module &M, ModuleAnalysisManager &MAM) {
for (auto &F : M.functions()) {
if (F.isDeclaration())
continue;
if (F.getMetadata(GUIDMetadataName))
continue;
const GlobalValue::GUID GUID = F.getGUID();
F.setMetadata(GUIDMetadataName,
MDNode::get(M.getContext(),
{ConstantAsMetadata::get(ConstantInt::get(
Type::getInt64Ty(M.getContext()), GUID))}));
}
return PreservedAnalyses::none();
}

GlobalValue::GUID AssignGUIDPass::getGUID(const Function &F) {
if (F.isDeclaration()) {
assert(GlobalValue::isExternalLinkage(F.getLinkage()));
return GlobalValue::getGUID(F.getGlobalIdentifier());
}
auto *MD = F.getMetadata(GUIDMetadataName);
assert(MD && "guid not found for defined function");
return cast<ConstantInt>(cast<ConstantAsMetadata>(MD->getOperand(0))
->getValue()
->stripPointerCasts())
->getZExtValue();
}
AnalysisKey CtxProfAnalysis::Key;

CtxProfAnalysis::Result CtxProfAnalysis::run(Module &M,
ModuleAnalysisManager &MAM) {
PGOContextualProfile CtxProfAnalysis::run(Module &M,
ModuleAnalysisManager &MAM) {
ErrorOr<std::unique_ptr<MemoryBuffer>> MB = MemoryBuffer::getFile(Profile);
if (auto EC = MB.getError()) {
M.getContext().emitError("could not open contextual profile file: " +
Expand All @@ -81,7 +111,55 @@ CtxProfAnalysis::Result CtxProfAnalysis::run(Module &M,
toString(MaybeCtx.takeError()));
return {};
}
return Result(std::move(*MaybeCtx));

PGOContextualProfile Result;

for (const auto &F : M) {
if (F.isDeclaration())
continue;
auto GUID = AssignGUIDPass::getGUID(F);
assert(GUID && "guid not found for defined function");
const auto &Entry = F.begin();
uint32_t MaxCounters = 0; // we expect at least a counter.
for (const auto &I : *Entry)
if (auto *C = dyn_cast<InstrProfIncrementInst>(&I)) {
MaxCounters =
static_cast<uint32_t>(C->getNumCounters()->getZExtValue());
break;
}
if (!MaxCounters)
continue;
uint32_t MaxCallsites = 0;
for (const auto &BB : F)
for (const auto &I : BB)
if (auto *C = dyn_cast<InstrProfCallsite>(&I)) {
MaxCallsites =
static_cast<uint32_t>(C->getNumCounters()->getZExtValue());
break;
}
auto [It, Ins] = Result.FuncInfo.insert(
{GUID, PGOContextualProfile::FunctionInfo(F.getName())});
(void)Ins;
assert(Ins);
It->second.NextCallsiteIndex = MaxCallsites;
It->second.NextCounterIndex = MaxCounters;
}
// If we made it this far, the Result is valid - which we mark by setting
// .Profiles.
// Trim first the roots that aren't in this module.
DenseSet<GlobalValue::GUID> ProfiledGUIDs;
for (auto &[RootGuid, _] : llvm::make_early_inc_range(*MaybeCtx))
if (!Result.FuncInfo.contains(RootGuid))
MaybeCtx->erase(RootGuid);
Result.Profiles = std::move(*MaybeCtx);
return Result;
}

GlobalValue::GUID
PGOContextualProfile::getDefinedFunctionGUID(const Function &F) const {
if (auto It = FuncInfo.find(AssignGUIDPass::getGUID(F)); It != FuncInfo.end())
return It->first;
return 0;
}

PreservedAnalyses CtxProfAnalysisPrinterPass::run(Module &M,
Expand All @@ -91,8 +169,16 @@ PreservedAnalyses CtxProfAnalysisPrinterPass::run(Module &M,
M.getContext().emitError("Invalid CtxProfAnalysis");
return PreservedAnalyses::all();
}

OS << "Function Info:\n";
for (const auto &[Guid, FuncInfo] : C.FuncInfo)
OS << Guid << " : " << FuncInfo.Name
<< ". MaxCounterID: " << FuncInfo.NextCounterIndex
<< ". MaxCallsiteID: " << FuncInfo.NextCallsiteIndex << "\n";

const auto JSONed = ::llvm::json::toJSON(C.profiles());

OS << "\nCurrent Profile:\n";
OS << formatv("{0:2}", JSONed);
OS << "\n";
return PreservedAnalyses::all();
Expand Down
5 changes: 4 additions & 1 deletion llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1939,7 +1939,9 @@ SDValue DAGCombiner::visit(SDNode *N) {
case ISD::FMINNUM:
case ISD::FMAXNUM:
case ISD::FMINIMUM:
case ISD::FMAXIMUM: return visitFMinMax(N);
case ISD::FMAXIMUM:
case ISD::FMINIMUMNUM:
case ISD::FMAXIMUMNUM: return visitFMinMax(N);
case ISD::FCEIL: return visitFCEIL(N);
case ISD::FTRUNC: return visitFTRUNC(N);
case ISD::FFREXP: return visitFFREXP(N);
Expand Down Expand Up @@ -6068,6 +6070,7 @@ static bool arebothOperandsNotNan(SDValue Operand1, SDValue Operand2,
return DAG.isKnownNeverNaN(Operand2) && DAG.isKnownNeverNaN(Operand1);
}

// FIXME: use FMINIMUMNUM if possible, such as for RISC-V.
static unsigned getMinMaxOpcodeForFP(SDValue Operand1, SDValue Operand2,
ISD::CondCode CC, unsigned OrAndOpcode,
SelectionDAG &DAG,
Expand Down
17 changes: 17 additions & 0 deletions llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3660,6 +3660,11 @@ bool SelectionDAGLegalize::ExpandNode(SDNode *Node) {
Results.push_back(Expanded);
break;
}
case ISD::FMINIMUMNUM:
case ISD::FMAXIMUMNUM: {
Results.push_back(TLI.expandFMINIMUMNUM_FMAXIMUMNUM(Node, DAG));
break;
}
case ISD::FSIN:
case ISD::FCOS: {
EVT VT = Node->getValueType(0);
Expand Down Expand Up @@ -4539,6 +4544,16 @@ void SelectionDAGLegalize::ConvertNodeToLibcall(SDNode *Node) {
RTLIB::FMAX_F80, RTLIB::FMAX_F128,
RTLIB::FMAX_PPCF128, Results);
break;
case ISD::FMINIMUMNUM:
ExpandFPLibCall(Node, RTLIB::FMINIMUMNUM_F32, RTLIB::FMINIMUMNUM_F64,
RTLIB::FMINIMUMNUM_F80, RTLIB::FMINIMUMNUM_F128,
RTLIB::FMINIMUMNUM_PPCF128, Results);
break;
case ISD::FMAXIMUMNUM:
ExpandFPLibCall(Node, RTLIB::FMAXIMUMNUM_F32, RTLIB::FMAXIMUMNUM_F64,
RTLIB::FMAXIMUMNUM_F80, RTLIB::FMAXIMUMNUM_F128,
RTLIB::FMAXIMUMNUM_PPCF128, Results);
break;
case ISD::FSQRT:
case ISD::STRICT_FSQRT:
ExpandFPLibCall(Node, RTLIB::SQRT_F32, RTLIB::SQRT_F64,
Expand Down Expand Up @@ -5464,6 +5479,8 @@ void SelectionDAGLegalize::PromoteNode(SDNode *Node) {
case ISD::FMAXNUM:
case ISD::FMINIMUM:
case ISD::FMAXIMUM:
case ISD::FMINIMUMNUM:
case ISD::FMAXIMUMNUM:
case ISD::FPOW:
Tmp1 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(0));
Tmp2 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(1));
Expand Down
42 changes: 42 additions & 0 deletions llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ void DAGTypeLegalizer::SoftenFloatResult(SDNode *N, unsigned ResNo) {
case ISD::FMINNUM: R = SoftenFloatRes_FMINNUM(N); break;
case ISD::STRICT_FMAXNUM:
case ISD::FMAXNUM: R = SoftenFloatRes_FMAXNUM(N); break;
case ISD::FMINIMUMNUM: R = SoftenFloatRes_FMINIMUMNUM(N); break;
case ISD::FMAXIMUMNUM: R = SoftenFloatRes_FMAXIMUMNUM(N); break;
case ISD::STRICT_FADD:
case ISD::FADD: R = SoftenFloatRes_FADD(N); break;
case ISD::STRICT_FACOS:
Expand Down Expand Up @@ -323,6 +325,20 @@ SDValue DAGTypeLegalizer::SoftenFloatRes_FMAXNUM(SDNode *N) {
RTLIB::FMAX_PPCF128));
}

SDValue DAGTypeLegalizer::SoftenFloatRes_FMINIMUMNUM(SDNode *N) {
return SoftenFloatRes_Binary(
N, GetFPLibCall(N->getValueType(0), RTLIB::FMINIMUMNUM_F32,
RTLIB::FMINIMUMNUM_F64, RTLIB::FMINIMUMNUM_F80,
RTLIB::FMINIMUMNUM_F128, RTLIB::FMINIMUMNUM_PPCF128));
}

SDValue DAGTypeLegalizer::SoftenFloatRes_FMAXIMUMNUM(SDNode *N) {
return SoftenFloatRes_Binary(
N, GetFPLibCall(N->getValueType(0), RTLIB::FMAXIMUMNUM_F32,
RTLIB::FMAXIMUMNUM_F64, RTLIB::FMAXIMUMNUM_F80,
RTLIB::FMAXIMUMNUM_F128, RTLIB::FMAXIMUMNUM_PPCF128));
}

SDValue DAGTypeLegalizer::SoftenFloatRes_FADD(SDNode *N) {
return SoftenFloatRes_Binary(N, GetFPLibCall(N->getValueType(0),
RTLIB::ADD_F32,
Expand Down Expand Up @@ -1404,6 +1420,8 @@ void DAGTypeLegalizer::ExpandFloatResult(SDNode *N, unsigned ResNo) {
case ISD::FMINNUM: ExpandFloatRes_FMINNUM(N, Lo, Hi); break;
case ISD::STRICT_FMAXNUM:
case ISD::FMAXNUM: ExpandFloatRes_FMAXNUM(N, Lo, Hi); break;
case ISD::FMINIMUMNUM: ExpandFloatRes_FMINIMUMNUM(N, Lo, Hi); break;
case ISD::FMAXIMUMNUM: ExpandFloatRes_FMAXIMUMNUM(N, Lo, Hi); break;
case ISD::STRICT_FADD:
case ISD::FADD: ExpandFloatRes_FADD(N, Lo, Hi); break;
case ISD::STRICT_FACOS:
Expand Down Expand Up @@ -1558,6 +1576,26 @@ void DAGTypeLegalizer::ExpandFloatRes_FMAXNUM(SDNode *N, SDValue &Lo,
RTLIB::FMAX_PPCF128), Lo, Hi);
}

void DAGTypeLegalizer::ExpandFloatRes_FMINIMUMNUM(SDNode *N, SDValue &Lo,
SDValue &Hi) {
ExpandFloatRes_Binary(
N,
GetFPLibCall(N->getValueType(0), RTLIB::FMINIMUMNUM_F32,
RTLIB::FMINIMUMNUM_F64, RTLIB::FMINIMUMNUM_F80,
RTLIB::FMINIMUMNUM_F128, RTLIB::FMINIMUMNUM_PPCF128),
Lo, Hi);
}

void DAGTypeLegalizer::ExpandFloatRes_FMAXIMUMNUM(SDNode *N, SDValue &Lo,
SDValue &Hi) {
ExpandFloatRes_Binary(
N,
GetFPLibCall(N->getValueType(0), RTLIB::FMAXIMUMNUM_F32,
RTLIB::FMAXIMUMNUM_F64, RTLIB::FMAXIMUMNUM_F80,
RTLIB::FMAXIMUMNUM_F128, RTLIB::FMAXIMUMNUM_PPCF128),
Lo, Hi);
}

void DAGTypeLegalizer::ExpandFloatRes_FADD(SDNode *N, SDValue &Lo,
SDValue &Hi) {
ExpandFloatRes_Binary(N, GetFPLibCall(N->getValueType(0),
Expand Down Expand Up @@ -2621,6 +2659,8 @@ void DAGTypeLegalizer::PromoteFloatResult(SDNode *N, unsigned ResNo) {
case ISD::FDIV:
case ISD::FMAXIMUM:
case ISD::FMINIMUM:
case ISD::FMAXIMUMNUM:
case ISD::FMINIMUMNUM:
case ISD::FMAXNUM:
case ISD::FMINNUM:
case ISD::FMAXNUM_IEEE:
Expand Down Expand Up @@ -3063,6 +3103,8 @@ void DAGTypeLegalizer::SoftPromoteHalfResult(SDNode *N, unsigned ResNo) {
case ISD::FDIV:
case ISD::FMAXIMUM:
case ISD::FMINIMUM:
case ISD::FMAXIMUMNUM:
case ISD::FMINIMUMNUM:
case ISD::FMAXNUM:
case ISD::FMINNUM:
case ISD::FMUL:
Expand Down
4 changes: 4 additions & 0 deletions llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -567,6 +567,8 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
SDValue SoftenFloatRes_FATAN(SDNode *N);
SDValue SoftenFloatRes_FMINNUM(SDNode *N);
SDValue SoftenFloatRes_FMAXNUM(SDNode *N);
SDValue SoftenFloatRes_FMINIMUMNUM(SDNode *N);
SDValue SoftenFloatRes_FMAXIMUMNUM(SDNode *N);
SDValue SoftenFloatRes_FADD(SDNode *N);
SDValue SoftenFloatRes_FCBRT(SDNode *N);
SDValue SoftenFloatRes_FCEIL(SDNode *N);
Expand Down Expand Up @@ -659,6 +661,8 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
void ExpandFloatRes_FATAN (SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandFloatRes_FMINNUM (SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandFloatRes_FMAXNUM (SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandFloatRes_FMINIMUMNUM(SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandFloatRes_FMAXIMUMNUM(SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandFloatRes_FADD (SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandFloatRes_FCBRT (SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandFloatRes_FCEIL (SDNode *N, SDValue &Lo, SDValue &Hi);
Expand Down
8 changes: 7 additions & 1 deletion llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5465,7 +5465,9 @@ bool SelectionDAG::isKnownNeverNaN(SDValue Op, bool SNaN, unsigned Depth) const
return false;
}
case ISD::FMINNUM:
case ISD::FMAXNUM: {
case ISD::FMAXNUM:
case ISD::FMINIMUMNUM:
case ISD::FMAXIMUMNUM: {
// Only one needs to be known not-nan, since it will be returned if the
// other ends up being one.
return isKnownNeverNaN(Op.getOperand(0), SNaN, Depth + 1) ||
Expand Down Expand Up @@ -6804,6 +6806,10 @@ SDValue SelectionDAG::foldConstantFPMath(unsigned Opcode, const SDLoc &DL,
return getConstantFP(minimum(C1, C2), DL, VT);
case ISD::FMAXIMUM:
return getConstantFP(maximum(C1, C2), DL, VT);
case ISD::FMINIMUMNUM:
return getConstantFP(minimumnum(C1, C2), DL, VT);
case ISD::FMAXIMUMNUM:
return getConstantFP(maximumnum(C1, C2), DL, VT);
default: break;
}
}
Expand Down
24 changes: 24 additions & 0 deletions llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6882,6 +6882,18 @@ void SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I,
getValue(I.getArgOperand(0)),
getValue(I.getArgOperand(1)), Flags));
return;
case Intrinsic::minimumnum:
setValue(&I, DAG.getNode(ISD::FMINIMUMNUM, sdl,
getValue(I.getArgOperand(0)).getValueType(),
getValue(I.getArgOperand(0)),
getValue(I.getArgOperand(1)), Flags));
return;
case Intrinsic::maximumnum:
setValue(&I, DAG.getNode(ISD::FMAXIMUMNUM, sdl,
getValue(I.getArgOperand(0)).getValueType(),
getValue(I.getArgOperand(0)),
getValue(I.getArgOperand(1)), Flags));
return;
case Intrinsic::copysign:
setValue(&I, DAG.getNode(ISD::FCOPYSIGN, sdl,
getValue(I.getArgOperand(0)).getValueType(),
Expand Down Expand Up @@ -9257,6 +9269,18 @@ void SelectionDAGBuilder::visitCall(const CallInst &I) {
if (visitBinaryFloatCall(I, ISD::FMAXNUM))
return;
break;
case LibFunc_fminimum_num:
case LibFunc_fminimum_numf:
case LibFunc_fminimum_numl:
if (visitBinaryFloatCall(I, ISD::FMINIMUMNUM))
return;
break;
case LibFunc_fmaximum_num:
case LibFunc_fmaximum_numf:
case LibFunc_fmaximum_numl:
if (visitBinaryFloatCall(I, ISD::FMAXIMUMNUM))
return;
break;
case LibFunc_sin:
case LibFunc_sinf:
case LibFunc_sinl:
Expand Down
2 changes: 2 additions & 0 deletions llvm/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,8 @@ std::string SDNode::getOperationName(const SelectionDAG *G) const {
case ISD::STRICT_FMINIMUM: return "strict_fminimum";
case ISD::FMAXIMUM: return "fmaximum";
case ISD::STRICT_FMAXIMUM: return "strict_fmaximum";
case ISD::FMINIMUMNUM: return "fminimumnum";
case ISD::FMAXIMUMNUM: return "fmaximumnum";
case ISD::FNEG: return "fneg";
case ISD::FSQRT: return "fsqrt";
case ISD::STRICT_FSQRT: return "strict_fsqrt";
Expand Down
88 changes: 88 additions & 0 deletions llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8558,6 +8558,94 @@ SDValue TargetLowering::expandFMINIMUM_FMAXIMUM(SDNode *N,
return MinMax;
}

SDValue TargetLowering::expandFMINIMUMNUM_FMAXIMUMNUM(SDNode *Node,
SelectionDAG &DAG) const {
SDLoc DL(Node);
SDValue LHS = Node->getOperand(0);
SDValue RHS = Node->getOperand(1);
unsigned Opc = Node->getOpcode();
EVT VT = Node->getValueType(0);
EVT CCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
bool IsMax = Opc == ISD::FMAXIMUMNUM;
const TargetOptions &Options = DAG.getTarget().Options;
SDNodeFlags Flags = Node->getFlags();

unsigned NewOp =
Opc == ISD::FMINIMUMNUM ? ISD::FMINNUM_IEEE : ISD::FMAXNUM_IEEE;

if (isOperationLegalOrCustom(NewOp, VT)) {
if (!Flags.hasNoNaNs()) {
// Insert canonicalizes if it's possible we need to quiet to get correct
// sNaN behavior.
if (!DAG.isKnownNeverSNaN(LHS)) {
LHS = DAG.getNode(ISD::FCANONICALIZE, DL, VT, LHS, Flags);
}
if (!DAG.isKnownNeverSNaN(RHS)) {
RHS = DAG.getNode(ISD::FCANONICALIZE, DL, VT, RHS, Flags);
}
}

return DAG.getNode(NewOp, DL, VT, LHS, RHS, Flags);
}

// We can use FMINIMUM/FMAXIMUM if there is no NaN, since it has
// same behaviors for all of other cases: +0.0 vs -0.0 included.
if (Flags.hasNoNaNs() ||
(DAG.isKnownNeverNaN(LHS) && DAG.isKnownNeverNaN(RHS))) {
unsigned IEEE2019Op =
Opc == ISD::FMINIMUMNUM ? ISD::FMINIMUM : ISD::FMAXIMUM;
if (isOperationLegalOrCustom(IEEE2019Op, VT))
return DAG.getNode(IEEE2019Op, DL, VT, LHS, RHS, Flags);
}

// FMINNUM/FMAXMUM returns qNaN if either operand is sNaN, and it may return
// either one for +0.0 vs -0.0.
if ((Flags.hasNoNaNs() ||
(DAG.isKnownNeverSNaN(LHS) && DAG.isKnownNeverSNaN(RHS))) &&
(Flags.hasNoSignedZeros() || DAG.isKnownNeverZeroFloat(LHS) ||
DAG.isKnownNeverZeroFloat(RHS))) {
unsigned IEEE2008Op = Opc == ISD::FMINIMUMNUM ? ISD::FMINNUM : ISD::FMAXNUM;
if (isOperationLegalOrCustom(IEEE2008Op, VT))
return DAG.getNode(IEEE2008Op, DL, VT, LHS, RHS, Flags);
}

// If only one operand is NaN, override it with another operand.
if (!Flags.hasNoNaNs() && !DAG.isKnownNeverNaN(LHS)) {
LHS = DAG.getSelectCC(DL, LHS, LHS, RHS, LHS, ISD::SETUO);
}
if (!Flags.hasNoNaNs() && !DAG.isKnownNeverNaN(RHS)) {
RHS = DAG.getSelectCC(DL, RHS, RHS, LHS, RHS, ISD::SETUO);
}

SDValue MinMax =
DAG.getSelectCC(DL, LHS, RHS, LHS, RHS, IsMax ? ISD::SETGT : ISD::SETLT);
// If MinMax is NaN, let's quiet it.
if (!Flags.hasNoNaNs() && !DAG.isKnownNeverNaN(LHS) &&
!DAG.isKnownNeverNaN(RHS)) {
SDValue MinMaxQuiet =
DAG.getNode(ISD::FCANONICALIZE, DL, VT, MinMax, Flags);
MinMax =
DAG.getSelectCC(DL, MinMax, MinMax, MinMaxQuiet, MinMax, ISD::SETUO);
}

// Fixup signed zero behavior.
if (Options.NoSignedZerosFPMath || Flags.hasNoSignedZeros() ||
DAG.isKnownNeverZeroFloat(LHS) || DAG.isKnownNeverZeroFloat(RHS)) {
return MinMax;
}
SDValue TestZero =
DAG.getTargetConstant(IsMax ? fcPosZero : fcNegZero, DL, MVT::i32);
SDValue IsZero = DAG.getSetCC(DL, CCVT, MinMax,
DAG.getConstantFP(0.0, DL, VT), ISD::SETEQ);
SDValue LCmp = DAG.getSelect(
DL, VT, DAG.getNode(ISD::IS_FPCLASS, DL, CCVT, LHS, TestZero), LHS,
MinMax, Flags);
SDValue RCmp = DAG.getSelect(
DL, VT, DAG.getNode(ISD::IS_FPCLASS, DL, CCVT, RHS, TestZero), RHS, LCmp,
Flags);
return DAG.getSelect(DL, VT, IsZero, RCmp, MinMax, Flags);
}

/// Returns a true value if if this FPClassTest can be performed with an ordered
/// fcmp to 0, and a false value if it's an unordered fcmp to 0. Returns
/// std::nullopt if it cannot be performed as a compare with 0.
Expand Down
1 change: 1 addition & 0 deletions llvm/lib/CodeGen/TargetLoweringBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -713,6 +713,7 @@ void TargetLoweringBase::initActions() {
ISD::FMINNUM, ISD::FMAXNUM,
ISD::FMINNUM_IEEE, ISD::FMAXNUM_IEEE,
ISD::FMINIMUM, ISD::FMAXIMUM,
ISD::FMINIMUMNUM, ISD::FMAXIMUMNUM,
ISD::FMAD, ISD::SMIN,
ISD::SMAX, ISD::UMIN,
ISD::UMAX, ISD::ABS,
Expand Down
13 changes: 6 additions & 7 deletions llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2022,8 +2022,8 @@ OpenMPIRBuilder::createTask(const LocationDescription &Loc,
Shareds, [Shareds](Use &U) { return U.getUser() != Shareds; });
}

llvm::for_each(llvm::reverse(ToBeDeleted),
[](Instruction *I) { I->eraseFromParent(); });
for (Instruction *I : llvm::reverse(ToBeDeleted))
I->eraseFromParent();
};

addOutlineInfo(std::move(OI));
Expand Down Expand Up @@ -7049,8 +7049,8 @@ OpenMPIRBuilder::InsertPointTy OpenMPIRBuilder::emitTargetTask(
}

StaleCI->eraseFromParent();
llvm::for_each(llvm::reverse(ToBeDeleted),
[](Instruction *I) { I->eraseFromParent(); });
for (Instruction *I : llvm::reverse(ToBeDeleted))
I->eraseFromParent();
};
addOutlineInfo(std::move(OI));

Expand Down Expand Up @@ -8345,9 +8345,8 @@ OpenMPIRBuilder::createTeams(const LocationDescription &Loc,
omp::RuntimeFunction::OMPRTL___kmpc_fork_teams),
Args);

llvm::for_each(llvm::reverse(ToBeDeleted),
[](Instruction *I) { I->eraseFromParent(); });

for (Instruction *I : llvm::reverse(ToBeDeleted))
I->eraseFromParent();
};

if (!Config.isTargetDevice())
Expand Down
235 changes: 104 additions & 131 deletions llvm/lib/IR/DataLayout.cpp

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions llvm/lib/Passes/PassBuilderPipelines.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/Analysis/BasicAliasAnalysis.h"
#include "llvm/Analysis/CGSCCPassManager.h"
#include "llvm/Analysis/CtxProfAnalysis.h"
#include "llvm/Analysis/GlobalsModRef.h"
#include "llvm/Analysis/InlineAdvisor.h"
#include "llvm/Analysis/ProfileSummaryInfo.h"
Expand Down Expand Up @@ -1196,6 +1197,9 @@ PassBuilder::buildModuleSimplificationPipeline(OptimizationLevel Level,
// In pre-link, we just want the instrumented IR. We use the contextual
// profile in the post-thinlink phase.
// The instrumentation will be removed in post-thinlink after IPO.
// FIXME(mtrofin): move AssignGUIDPass if there is agreement to use this
// mechanism for GUIDs.
MPM.addPass(AssignGUIDPass());
if (IsCtxProfUse)
return MPM;
addPostPGOLoopRotation(MPM, Level);
Expand Down
1 change: 1 addition & 0 deletions llvm/lib/Passes/PassRegistry.def
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ MODULE_ALIAS_ANALYSIS("globals-aa", GlobalsAA())
#endif
MODULE_PASS("always-inline", AlwaysInlinerPass())
MODULE_PASS("annotation2metadata", Annotation2MetadataPass())
MODULE_PASS("assign-guid", AssignGUIDPass())
MODULE_PASS("attributor", AttributorPass())
MODULE_PASS("attributor-light", AttributorLightPass())
MODULE_PASS("called-value-propagation", CalledValuePropagationPass())
Expand Down
1 change: 0 additions & 1 deletion llvm/lib/Target/DirectX/DXILIntrinsicExpansion.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,6 @@ static bool expandNormalizeIntrinsic(CallInst *Orig) {
return true;
}

Value *Elt = Builder.CreateExtractElement(X, (uint64_t)0);
unsigned XVecSize = XVec->getNumElements();
Value *DotProduct = nullptr;
// use the dot intrinsic corresponding to the vector size
Expand Down
4 changes: 2 additions & 2 deletions llvm/lib/Target/DirectX/DXILOpBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -163,8 +163,8 @@ struct OpCodeProperty {
llvm::SmallVector<OpOverload> Overloads;
llvm::SmallVector<OpStage> Stages;
llvm::SmallVector<OpAttribute> Attributes;
int OverloadParamIndex; // parameter index which control the overload.
// When < 0, should be only 1 overload type.
int OverloadParamIndex; // parameter index which control the overload.
// When < 0, should be only 1 overload type.
};

// Include getOpCodeClassName getOpCodeProperty, getOpCodeName and
Expand Down
11 changes: 0 additions & 11 deletions llvm/lib/Target/DirectX/DXILResourceAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,6 @@ dxil::Resources DXILResourceMDAnalysis::run(Module &M,

AnalysisKey DXILResourceMDAnalysis::Key;

PreservedAnalyses DXILResourceMDPrinterPass::run(Module &M,
ModuleAnalysisManager &AM) {
dxil::Resources Res = AM.getResult<DXILResourceMDAnalysis>(M);
Res.print(OS);
return PreservedAnalyses::all();
}

char DXILResourceMDWrapper::ID = 0;
INITIALIZE_PASS_BEGIN(DXILResourceMDWrapper, DEBUG_TYPE,
"DXIL resource Information", true, true)
Expand All @@ -46,7 +39,3 @@ bool DXILResourceMDWrapper::runOnModule(Module &M) {
}

DXILResourceMDWrapper::DXILResourceMDWrapper() : ModulePass(ID) {}

void DXILResourceMDWrapper::print(raw_ostream &OS, const Module *) const {
Resources.print(OS);
}
13 changes: 0 additions & 13 deletions llvm/lib/Target/DirectX/DXILResourceAnalysis.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,17 +30,6 @@ class DXILResourceMDAnalysis
dxil::Resources run(Module &M, ModuleAnalysisManager &AM);
};

/// Printer pass for the \c DXILResourceMDAnalysis results.
class DXILResourceMDPrinterPass
: public PassInfoMixin<DXILResourceMDPrinterPass> {
raw_ostream &OS;

public:
explicit DXILResourceMDPrinterPass(raw_ostream &OS) : OS(OS) {}
PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
static bool isRequired() { return true; }
};

/// The legacy pass manager's analysis pass to compute DXIL resource
/// information.
class DXILResourceMDWrapper : public ModulePass {
Expand All @@ -60,8 +49,6 @@ class DXILResourceMDWrapper : public ModulePass {
void getAnalysisUsage(AnalysisUsage &AU) const override {
AU.setPreservesAll();
}

void print(raw_ostream &O, const Module *M = nullptr) const override;
};
} // namespace llvm

Expand Down
5 changes: 4 additions & 1 deletion llvm/lib/Target/RISCV/RISCVISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1428,6 +1428,7 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,

// Disable strict node mutation.
IsStrictFPEnabled = true;
EnableExtLdPromotion = true;

// Let the subtarget decide if a predictable select is more expensive than the
// corresponding branch. This information is used in CGP/SelectOpt to decide
Expand Down Expand Up @@ -13843,8 +13844,10 @@ performSIGN_EXTEND_INREGCombine(SDNode *N, SelectionDAG &DAG,
EVT VT = N->getValueType(0);

// Fold (sext_inreg (fmv_x_anyexth X), i16) -> (fmv_x_signexth X)
// Don't do this with Zhinx. We need to explicitly sign extend the GPR.
if (Src.getOpcode() == RISCVISD::FMV_X_ANYEXTH &&
cast<VTSDNode>(N->getOperand(1))->getVT().bitsGE(MVT::i16))
cast<VTSDNode>(N->getOperand(1))->getVT().bitsGE(MVT::i16) &&
Subtarget.hasStdExtZfhmin())
return DAG.getNode(RISCVISD::FMV_X_SIGNEXTH, SDLoc(N), VT,
Src.getOperand(0));

Expand Down
1 change: 0 additions & 1 deletion llvm/lib/Target/RISCV/RISCVInstrInfoZfh.td
Original file line number Diff line number Diff line change
Expand Up @@ -458,7 +458,6 @@ def : Pat<(any_fpextend FPR16INX:$rs1), (FCVT_S_H_INX FPR16INX:$rs1, FRM_RNE)>;
// Moves (no conversion)
def : Pat<(f16 (riscv_fmv_h_x GPR:$src)), (COPY_TO_REGCLASS GPR:$src, GPR)>;
def : Pat<(riscv_fmv_x_anyexth FPR16INX:$src), (COPY_TO_REGCLASS FPR16INX:$src, GPR)>;
def : Pat<(riscv_fmv_x_signexth FPR16INX:$src), (COPY_TO_REGCLASS FPR16INX:$src, GPR)>;

def : Pat<(fcopysign FPR32INX:$rs1, FPR16INX:$rs2), (FSGNJ_S_INX $rs1, (FCVT_S_H_INX $rs2, FRM_RNE))>;
} // Predicates = [HasStdExtZhinxmin]
Expand Down
32 changes: 32 additions & 0 deletions llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2000,3 +2000,35 @@ bool RISCVTTIImpl::areInlineCompatible(const Function *Caller,
// target-features.
return (CallerBits & CalleeBits) == CalleeBits;
}

/// See if \p I should be considered for address type promotion. We check if \p
/// I is a sext with right type and used in memory accesses. If it used in a
/// "complex" getelementptr, we allow it to be promoted without finding other
/// sext instructions that sign extended the same initial value. A getelementptr
/// is considered as "complex" if it has more than 2 operands.
bool RISCVTTIImpl::shouldConsiderAddressTypePromotion(
const Instruction &I, bool &AllowPromotionWithoutCommonHeader) {
bool Considerable = false;
AllowPromotionWithoutCommonHeader = false;
if (!isa<SExtInst>(&I))
return false;
Type *ConsideredSExtType =
Type::getInt64Ty(I.getParent()->getParent()->getContext());
if (I.getType() != ConsideredSExtType)
return false;
// See if the sext is the one with the right type and used in at least one
// GetElementPtrInst.
for (const User *U : I.users()) {
if (const GetElementPtrInst *GEPInst = dyn_cast<GetElementPtrInst>(U)) {
Considerable = true;
// A getelementptr is considered as "complex" if it has more than 2
// operands. We will promote a SExt used in such complex GEP as we
// expect some computation to be merged if they are done on 64 bits.
if (GEPInst->getNumOperands() > 2) {
AllowPromotionWithoutCommonHeader = true;
break;
}
}
}
return Considerable;
}
4 changes: 3 additions & 1 deletion llvm/lib/Target/RISCV/RISCVTargetTransformInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -397,7 +397,9 @@ class RISCVTTIImpl : public BasicTTIImplBase<RISCVTTIImpl> {
bool shouldFoldTerminatingConditionAfterLSR() const {
return true;
}

bool
shouldConsiderAddressTypePromotion(const Instruction &I,
bool &AllowPromotionWithoutCommonHeader);
std::optional<unsigned> getMinPageSize() const { return 4096; }
};

Expand Down
13 changes: 6 additions & 7 deletions llvm/lib/Target/X86/MCTargetDesc/X86InstPrinterCommon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ void X86InstPrinterCommon::printCondCode(const MCInst *MI, unsigned Op,
raw_ostream &O) {
int64_t Imm = MI->getOperand(Op).getImm();
unsigned Opc = MI->getOpcode();
bool IsCMPCCXADD = X86::isCMPCCXADD(Opc);
bool IsCCMPOrCTEST = X86::isCCMPCC(Opc) || X86::isCTESTCC(Opc);

// clang-format off
Expand All @@ -39,19 +38,19 @@ void X86InstPrinterCommon::printCondCode(const MCInst *MI, unsigned Op,
case 0: O << "o"; break;
case 1: O << "no"; break;
case 2: O << "b"; break;
case 3: O << (IsCMPCCXADD ? "nb" : "ae"); break;
case 4: O << (IsCMPCCXADD ? "z" : "e"); break;
case 5: O << (IsCMPCCXADD ? "nz" : "ne"); break;
case 3: O << "ae"; break;
case 4: O << "e"; break;
case 5: O << "ne"; break;
case 6: O << "be"; break;
case 7: O << (IsCMPCCXADD ? "nbe" : "a"); break;
case 7: O << "a"; break;
case 8: O << "s"; break;
case 9: O << "ns"; break;
case 0xa: O << (IsCCMPOrCTEST ? "t" : "p"); break;
case 0xb: O << (IsCCMPOrCTEST ? "f" : "np"); break;
case 0xc: O << "l"; break;
case 0xd: O << (IsCMPCCXADD ? "nl" : "ge"); break;
case 0xd: O << "ge"; break;
case 0xe: O << "le"; break;
case 0xf: O << (IsCMPCCXADD ? "nle" : "g"); break;
case 0xf: O << "g"; break;
}
// clang-format on
}
Expand Down
6 changes: 4 additions & 2 deletions llvm/lib/Transforms/Instrumentation/PGOCtxProfLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
//

#include "llvm/Transforms/Instrumentation/PGOCtxProfLowering.h"
#include "llvm/Analysis/CtxProfAnalysis.h"
#include "llvm/Analysis/OptimizationRemarkEmitter.h"
#include "llvm/IR/Analysis.h"
#include "llvm/IR/DiagnosticInfo.h"
Expand All @@ -16,6 +17,7 @@
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/PassManager.h"
#include "llvm/ProfileData/InstrProf.h"
#include "llvm/Support/CommandLine.h"
#include <utility>

Expand Down Expand Up @@ -223,8 +225,8 @@ bool CtxInstrumentationLowerer::lowerFunction(Function &F) {
assert(Mark->getIndex()->isZero());

IRBuilder<> Builder(Mark);
// FIXME(mtrofin): use InstrProfSymtab::getCanonicalName
Guid = Builder.getInt64(F.getGUID());

Guid = Builder.getInt64(AssignGUIDPass::getGUID(F));
// The type of the context of this function is now knowable since we have
// NrCallsites and NrCounters. We delcare it here because it's more
// convenient - we have the Builder.
Expand Down
40 changes: 0 additions & 40 deletions llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9363,46 +9363,6 @@ void VPWidenLoadEVLRecipe::execute(VPTransformState &State) {
State.set(this, Res, 0);
}

void VPWidenStoreRecipe::execute(VPTransformState &State) {
auto *SI = cast<StoreInst>(&Ingredient);

VPValue *StoredVPValue = getStoredValue();
bool CreateScatter = !isConsecutive();
const Align Alignment = getLoadStoreAlignment(&Ingredient);

auto &Builder = State.Builder;
State.setDebugLocFrom(getDebugLoc());

for (unsigned Part = 0; Part < State.UF; ++Part) {
Instruction *NewSI = nullptr;
Value *Mask = nullptr;
if (auto *VPMask = getMask()) {
// Mask reversal is only needed for non-all-one (null) masks, as reverse
// of a null all-one mask is a null mask.
Mask = State.get(VPMask, Part);
if (isReverse())
Mask = Builder.CreateVectorReverse(Mask, "reverse");
}

Value *StoredVal = State.get(StoredVPValue, Part);
if (isReverse()) {
// If we store to reverse consecutive memory locations, then we need
// to reverse the order of elements in the stored value.
StoredVal = Builder.CreateVectorReverse(StoredVal, "reverse");
// We don't want to update the value in the map as it might be used in
// another expression. So don't call resetVectorValue(StoredVal).
}
Value *Addr = State.get(getAddr(), Part, /*IsScalar*/ !CreateScatter);
if (CreateScatter)
NewSI = Builder.CreateMaskedScatter(StoredVal, Addr, Alignment, Mask);
else if (Mask)
NewSI = Builder.CreateMaskedStore(StoredVal, Addr, Alignment, Mask);
else
NewSI = Builder.CreateAlignedStore(StoredVal, Addr, Alignment);
State.addMetadata(NewSI, SI);
}
}

void VPWidenStoreEVLRecipe::execute(VPTransformState &State) {
assert(State.UF == 1 && "Expected only UF == 1 when vectorizing with "
"explicit vector length.");
Expand Down
42 changes: 42 additions & 0 deletions llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2066,7 +2066,49 @@ void VPWidenLoadEVLRecipe::print(raw_ostream &O, const Twine &Indent,
O << " = vp.load ";
printOperands(O, SlotTracker);
}
#endif

void VPWidenStoreRecipe::execute(VPTransformState &State) {
auto *SI = cast<StoreInst>(&Ingredient);

VPValue *StoredVPValue = getStoredValue();
bool CreateScatter = !isConsecutive();
const Align Alignment = getLoadStoreAlignment(&Ingredient);

auto &Builder = State.Builder;
State.setDebugLocFrom(getDebugLoc());

for (unsigned Part = 0; Part < State.UF; ++Part) {
Instruction *NewSI = nullptr;
Value *Mask = nullptr;
if (auto *VPMask = getMask()) {
// Mask reversal is only needed for non-all-one (null) masks, as reverse
// of a null all-one mask is a null mask.
Mask = State.get(VPMask, Part);
if (isReverse())
Mask = Builder.CreateVectorReverse(Mask, "reverse");
}

Value *StoredVal = State.get(StoredVPValue, Part);
if (isReverse()) {
// If we store to reverse consecutive memory locations, then we need
// to reverse the order of elements in the stored value.
StoredVal = Builder.CreateVectorReverse(StoredVal, "reverse");
// We don't want to update the value in the map as it might be used in
// another expression. So don't call resetVectorValue(StoredVal).
}
Value *Addr = State.get(getAddr(), Part, /*IsScalar*/ !CreateScatter);
if (CreateScatter)
NewSI = Builder.CreateMaskedScatter(StoredVal, Addr, Alignment, Mask);
else if (Mask)
NewSI = Builder.CreateMaskedStore(StoredVal, Addr, Alignment, Mask);
else
NewSI = Builder.CreateAlignedStore(StoredVal, Addr, Alignment);
State.addMetadata(NewSI, SI);
}
}

#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
void VPWidenStoreRecipe::print(raw_ostream &O, const Twine &Indent,
VPSlotTracker &SlotTracker) const {
O << Indent << "WIDEN store ";
Expand Down
119 changes: 119 additions & 0 deletions llvm/test/Analysis/CtxProfAnalysis/full-cycle.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
; REQUIRES: x86_64-linux
;
; RUN: rm -rf %t
; RUN: split-file %s %t
;
; Test that the GUID metadata survives through thinlink.
;
; RUN: llvm-ctxprof-util fromJSON --input=%t/profile.json --output=%t/profile.ctxprofdata
;
; RUN: opt -module-summary -passes='thinlto-pre-link<O2>' -use-ctx-profile=%t/profile.ctxprofdata -o %t/m1.bc %t/m1.ll
; RUN: opt -module-summary -passes='thinlto-pre-link<O2>' -use-ctx-profile=%t/profile.ctxprofdata -o %t/m2.bc %t/m2.ll
;
; RUN: rm -rf %t/postlink
; RUN: mkdir %t/postlink
;
;
; RUN: llvm-lto2 run %t/m1.bc %t/m2.bc -o %t/ -thinlto-distributed-indexes \
; RUN: -use-ctx-profile=%t/profile.ctxprofdata \
; RUN: -r %t/m1.bc,f1,plx \
; RUN: -r %t/m2.bc,f1 \
; RUN: -r %t/m2.bc,entrypoint,plx
; RUN: opt --passes='function-import,require<ctx-prof-analysis>,print<ctx-prof-analysis>' \
; RUN: -summary-file=%t/m2.bc.thinlto.bc -use-ctx-profile=%t/profile.ctxprofdata %t/m2.bc \
; RUN: -S -o %t/m2.post.ll 2> %t/profile.txt
; RUN: diff %t/expected.txt %t/profile.txt
;--- m1.ll
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"

source_filename = "random_path/m1.cc"

define private void @f2() #0 !guid !0 {
ret void
}

define void @f1() #0 {
call void @f2()
ret void
}

attributes #0 = { noinline }
!0 = !{ i64 3087265239403591524 }

;--- m2.ll
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"

source_filename = "random_path/m2.cc"

declare void @f1()

define void @entrypoint() {
call void @f1()
ret void
}
;--- profile.json
[
{
"Callsites": [
[
{
"Callsites": [
[
{
"Counters": [
10
],
"Guid": 3087265239403591524
}
]
],
"Counters": [
7
],
"Guid": 2072045998141807037
}
]
],
"Counters": [
1
],
"Guid": 10507721908651011566
}
]
;--- expected.txt
Function Info:
10507721908651011566 : entrypoint. MaxCounterID: 1. MaxCallsiteID: 1
3087265239403591524 : f2.llvm.0. MaxCounterID: 1. MaxCallsiteID: 0
2072045998141807037 : f1. MaxCounterID: 1. MaxCallsiteID: 1

Current Profile:
[
{
"Callsites": [
[
{
"Callsites": [
[
{
"Counters": [
10
],
"Guid": 3087265239403591524
}
]
],
"Counters": [
7
],
"Guid": 2072045998141807037
}
]
],
"Counters": [
1
],
"Guid": 10507721908651011566
}
]
113 changes: 91 additions & 22 deletions llvm/test/Analysis/CtxProfAnalysis/load.ll
Original file line number Diff line number Diff line change
@@ -1,58 +1,127 @@
; REQUIRES: x86_64-linux

;
; RUN: rm -rf %t
; RUN: split-file %s %t
; RUN: llvm-ctxprof-util fromJSON --input=%t/profile.json --output=%t/profile.ctxprofdata
; RUN: not opt -passes='require<ctx-prof-analysis>,print<ctx-prof-analysis>' \
; RUN: %t/empty.ll -S 2>&1 | FileCheck %s --check-prefix=NO-FILE
; RUN: %t/example.ll -S 2>&1 | FileCheck %s --check-prefix=NO-FILE

; RUN: not opt -passes='require<ctx-prof-analysis>,print<ctx-prof-analysis>' \
; RUN: -use-ctx-profile=does_not_exist.ctxprofdata %t/empty.ll -S 2>&1 | FileCheck %s --check-prefix=NO-FILE
; RUN: -use-ctx-profile=does_not_exist.ctxprofdata %t/example.ll -S 2>&1 | FileCheck %s --check-prefix=NO-FILE

; RUN: opt -module-summary -passes='thinlto-pre-link<O2>' \
; RUN: -use-ctx-profile=%t/profile.ctxprofdata %t/example.ll -S -o %t/prelink.ll

; RUN: opt -module-summary -passes='thinlto-pre-link<O2>' -use-ctx-profile=%t/profile.ctxprofdata \
; RUN: %t/example.ll -S -o %t/prelink.ll
; RUN: opt -passes='require<ctx-prof-analysis>,print<ctx-prof-analysis>' \
; RUN: -use-ctx-profile=%t/profile.ctxprofdata %t/empty.ll -S 2> %t/output.json
; RUN: diff %t/profile.json %t/output.json
; RUN: -use-ctx-profile=%t/profile.ctxprofdata %t/prelink.ll -S 2> %t/output.txt
; RUN: diff %t/expected-profile-output.txt %t/output.txt

; NO-FILE: error: could not open contextual profile file
;
; This is the reference profile, laid out in the format the json formatter will
; output it from opt.
;--- profile.json
[
{
"Counters": [
9
],
"Guid": 12341
},
{
"Counters": [
5
],
"Guid": 12074870348631550642
},
{
"Callsites": [
[],
[
{
"Counters": [
4,
5
6,
7
],
"Guid": 2000
},
"Guid": 728453322856651412
}
]
],
"Counters": [
1
],
"Guid": 11872291593386833696
}
]
;--- expected-profile-output.txt
Function Info:
4909520559318251808 : an_entrypoint. MaxCounterID: 2. MaxCallsiteID: 1
12074870348631550642 : another_entrypoint_no_callees. MaxCounterID: 1. MaxCallsiteID: 0
11872291593386833696 : foo. MaxCounterID: 1. MaxCallsiteID: 1

Current Profile:
[
{
"Callsites": [
[
{
"Counters": [
6,
7,
8
7
],
"Guid": 18446744073709551613
"Guid": 728453322856651412
}
]
],
"Counters": [
1,
2,
3
1
],
"Guid": 1000
"Guid": 11872291593386833696
},
{
"Counters": [
5,
9,
10
5
],
"Guid": 18446744073709551612
"Guid": 12074870348631550642
}
]
;--- empty.ll
;--- example.ll
declare void @bar()

define private void @foo(i32 %a, ptr %fct) #0 !guid !0 {
%t = icmp eq i32 %a, 0
br i1 %t, label %yes, label %no
yes:
call void %fct(i32 %a)
br label %exit
no:
call void @bar()
br label %exit
exit:
ret void
}

define void @an_entrypoint(i32 %a) {
%t = icmp eq i32 %a, 0
br i1 %t, label %yes, label %no

yes:
call void @foo(i32 1, ptr null)
ret void
no:
ret void
}

define void @another_entrypoint_no_callees(i32 %a) {
%t = icmp eq i32 %a, 0
br i1 %t, label %yes, label %no

yes:
ret void
no:
ret void
}

attributes #0 = { noinline }
!0 = !{ i64 11872291593386833696 }

This file was deleted.

5 changes: 0 additions & 5 deletions llvm/test/Assembler/datalayout-invalid-i8-alignment.ll

This file was deleted.

This file was deleted.

4 changes: 0 additions & 4 deletions llvm/test/Assembler/invalid-datalayout-alloca-addrspace.ll

This file was deleted.

4 changes: 0 additions & 4 deletions llvm/test/Assembler/invalid-datalayout-globals-addrspace.ll

This file was deleted.

3 changes: 0 additions & 3 deletions llvm/test/Assembler/invalid-datalayout-index-size.ll

This file was deleted.

4 changes: 0 additions & 4 deletions llvm/test/Assembler/invalid-datalayout-program-addrspace.ll

This file was deleted.

3 changes: 0 additions & 3 deletions llvm/test/Assembler/invalid-datalayout1.ll

This file was deleted.

3 changes: 0 additions & 3 deletions llvm/test/Assembler/invalid-datalayout10.ll

This file was deleted.

3 changes: 0 additions & 3 deletions llvm/test/Assembler/invalid-datalayout11.ll

This file was deleted.

3 changes: 0 additions & 3 deletions llvm/test/Assembler/invalid-datalayout12.ll

This file was deleted.

3 changes: 0 additions & 3 deletions llvm/test/Assembler/invalid-datalayout13.ll

This file was deleted.

3 changes: 0 additions & 3 deletions llvm/test/Assembler/invalid-datalayout14.ll

This file was deleted.

3 changes: 0 additions & 3 deletions llvm/test/Assembler/invalid-datalayout15.ll

This file was deleted.

3 changes: 0 additions & 3 deletions llvm/test/Assembler/invalid-datalayout16.ll

This file was deleted.

3 changes: 0 additions & 3 deletions llvm/test/Assembler/invalid-datalayout17.ll

This file was deleted.

3 changes: 0 additions & 3 deletions llvm/test/Assembler/invalid-datalayout18.ll

This file was deleted.

6 changes: 0 additions & 6 deletions llvm/test/Assembler/invalid-datalayout19.ll

This file was deleted.

3 changes: 0 additions & 3 deletions llvm/test/Assembler/invalid-datalayout2.ll

This file was deleted.

6 changes: 0 additions & 6 deletions llvm/test/Assembler/invalid-datalayout20.ll

This file was deleted.

6 changes: 0 additions & 6 deletions llvm/test/Assembler/invalid-datalayout21.ll

This file was deleted.

6 changes: 0 additions & 6 deletions llvm/test/Assembler/invalid-datalayout22.ll

This file was deleted.

6 changes: 0 additions & 6 deletions llvm/test/Assembler/invalid-datalayout23.ll

This file was deleted.

6 changes: 0 additions & 6 deletions llvm/test/Assembler/invalid-datalayout24.ll

This file was deleted.

3 changes: 0 additions & 3 deletions llvm/test/Assembler/invalid-datalayout3.ll

This file was deleted.

3 changes: 0 additions & 3 deletions llvm/test/Assembler/invalid-datalayout4.ll

This file was deleted.

3 changes: 0 additions & 3 deletions llvm/test/Assembler/invalid-datalayout5.ll

This file was deleted.

3 changes: 0 additions & 3 deletions llvm/test/Assembler/invalid-datalayout6.ll

This file was deleted.

3 changes: 0 additions & 3 deletions llvm/test/Assembler/invalid-datalayout7.ll

This file was deleted.

3 changes: 0 additions & 3 deletions llvm/test/Assembler/invalid-datalayout8.ll

This file was deleted.

3 changes: 0 additions & 3 deletions llvm/test/Assembler/invalid-datalayout9.ll

This file was deleted.

6 changes: 4 additions & 2 deletions llvm/test/CodeGen/DirectX/CreateHandle.ll
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,12 @@ define void @test_buffers() {
; CHECK: call %dx.types.Handle @dx.op.createHandle(i32 57, i8 1, i32 1, i32 6, i1 false)

; Buffer<uint4> Buf[24] : register(t3, space5)
; Buffer<uint4> typed2 = Buf[5]
; Note that the index below is 3 + 4 = 7
%typed2 = call target("dx.TypedBuffer", <4 x i32>, 0, 0, 0)
@llvm.dx.handle.fromBinding.tdx.TypedBuffer_i32_0_0_0t(
i32 2, i32 7, i32 24, i32 8, i1 false)
; CHECK: call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 0, i32 8, i1 false)
i32 5, i32 3, i32 24, i32 7, i1 false)
; CHECK: call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 0, i32 7, i1 false)

; struct S { float4 a; uint4 b; };
; StructuredBuffer<S> Buf : register(t2, space4)
Expand Down
6 changes: 4 additions & 2 deletions llvm/test/CodeGen/DirectX/CreateHandleFromBinding.ll
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,12 @@ define void @test_bindings() {
; CHECK: call %dx.types.Handle @dx.op.annotateHandle(i32 217, %dx.types.Handle [[BUF1]], %dx.types.ResourceProperties { i32 4106, i32 260 })

; Buffer<uint4> Buf[24] : register(t3, space5)
; Buffer<uint4> typed2 = Buf[4]
; Note that the index below is 3 + 4 = 7
%typed2 = call target("dx.TypedBuffer", <4 x i32>, 0, 0, 0)
@llvm.dx.handle.fromBinding.tdx.TypedBuffer_i32_0_0_0t(
i32 2, i32 7, i32 24, i32 8, i1 false)
; CHECK: [[BUF2:%[0-9]*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 218, %dx.types.ResBind { i32 7, i32 30, i32 2, i8 0 }, i32 8, i1 false)
i32 5, i32 3, i32 24, i32 7, i1 false)
; CHECK: [[BUF2:%[0-9]*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 218, %dx.types.ResBind { i32 3, i32 26, i32 5, i8 0 }, i32 7, i1 false)
; CHECK: call %dx.types.Handle @dx.op.annotateHandle(i32 217, %dx.types.Handle [[BUF2]], %dx.types.ResourceProperties { i32 10, i32 1029 })

; struct S { float4 a; uint4 b; };
Expand Down
6 changes: 0 additions & 6 deletions llvm/test/CodeGen/DirectX/normalize.ll
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ entry:

define noundef <2 x half> @test_normalize_half2(<2 x half> noundef %p0) {
entry:
; CHECK: extractelement <2 x half> %{{.*}}, i64 0
; EXPCHECK: [[doth2:%.*]] = call half @llvm.dx.dot2.v2f16(<2 x half> %{{.*}}, <2 x half> %{{.*}})
; DOPCHECK: [[doth2:%.*]] = call half @dx.op.dot2.f16(i32 54, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}})
; EXPCHECK: [[rsqrt:%.*]] = call half @llvm.dx.rsqrt.f16(half [[doth2]])
Expand All @@ -37,7 +36,6 @@ entry:

define noundef <3 x half> @test_normalize_half3(<3 x half> noundef %p0) {
entry:
; CHECK: extractelement <3 x half> %{{.*}}, i64 0
; EXPCHECK: [[doth3:%.*]] = call half @llvm.dx.dot3.v3f16(<3 x half> %{{.*}}, <3 x half> %{{.*}})
; DOPCHECK: [[doth3:%.*]] = call half @dx.op.dot3.f16(i32 55, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}})
; EXPCHECK: [[rsqrt:%.*]] = call half @llvm.dx.rsqrt.f16(half [[doth3]])
Expand All @@ -52,7 +50,6 @@ entry:

define noundef <4 x half> @test_normalize_half4(<4 x half> noundef %p0) {
entry:
; CHECK: extractelement <4 x half> %{{.*}}, i64 0
; EXPCHECK: [[doth4:%.*]] = call half @llvm.dx.dot4.v4f16(<4 x half> %{{.*}}, <4 x half> %{{.*}})
; DOPCHECK: [[doth4:%.*]] = call half @dx.op.dot4.f16(i32 56, half %{{.*}}, half %{{.*}}, half %{{.*}}, half %{{.*}})
; EXPCHECK: [[rsqrt:%.*]] = call half @llvm.dx.rsqrt.f16(half [[doth4]])
Expand All @@ -74,7 +71,6 @@ entry:

define noundef <2 x float> @test_normalize_float2(<2 x float> noundef %p0) {
entry:
; CHECK: extractelement <2 x float> %{{.*}}, i64 0
; EXPCHECK: [[dotf2:%.*]] = call float @llvm.dx.dot2.v2f32(<2 x float> %{{.*}}, <2 x float> %{{.*}})
; DOPCHECK: [[dotf2:%.*]] = call float @dx.op.dot2.f32(i32 54, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}})
; EXPCHECK: [[rsqrt:%.*]] = call float @llvm.dx.rsqrt.f32(float [[dotf2]])
Expand All @@ -89,7 +85,6 @@ entry:

define noundef <3 x float> @test_normalize_float3(<3 x float> noundef %p0) {
entry:
; CHECK: extractelement <3 x float> %{{.*}}, i64 0
; EXPCHECK: [[dotf3:%.*]] = call float @llvm.dx.dot3.v3f32(<3 x float> %{{.*}}, <3 x float> %{{.*}})
; DOPCHECK: [[dotf3:%.*]] = call float @dx.op.dot3.f32(i32 55, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}})
; EXPCHECK: [[rsqrt:%.*]] = call float @llvm.dx.rsqrt.f32(float [[dotf3]])
Expand All @@ -104,7 +99,6 @@ entry:

define noundef <4 x float> @test_normalize_float4(<4 x float> noundef %p0) {
entry:
; CHECK: extractelement <4 x float> %{{.*}}, i64 0
; EXPCHECK: [[dotf4:%.*]] = call float @llvm.dx.dot4.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}})
; DOPCHECK: [[dotf4:%.*]] = call float @dx.op.dot4.f32(i32 56, float %{{.*}}, float %{{.*}}, float %{{.*}}, float %{{.*}})
; EXPCHECK: [[rsqrt:%.*]] = call float @llvm.dx.rsqrt.f32(float [[dotf4]])
Expand Down
431 changes: 431 additions & 0 deletions llvm/test/CodeGen/LoongArch/fp-maximumnum-minimumnum.ll

Large diffs are not rendered by default.

132 changes: 132 additions & 0 deletions llvm/test/CodeGen/Mips/fp-maximumnum-minimumnum.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc --mtriple=mipsisa32r6 < %s | FileCheck %s --check-prefix=MIPS32R6

declare float @llvm.maximumnum.f32(float, float)
declare double @llvm.maximumnum.f64(double, double)
declare float @llvm.minimumnum.f32(float, float)
declare double @llvm.minimumnum.f64(double, double)

define float @maximumnum_float(float %x, float %y) {
; MIPS32R6-LABEL: maximumnum_float:
; MIPS32R6: # %bb.0:
; MIPS32R6-NEXT: min.s $f0, $f14, $f14
; MIPS32R6-NEXT: min.s $f1, $f12, $f12
; MIPS32R6-NEXT: jr $ra
; MIPS32R6-NEXT: max.s $f0, $f1, $f0
%z = call float @llvm.maximumnum.f32(float %x, float %y)
ret float %z
}

define float @maximumnum_float_nsz(float %x, float %y) {
; MIPS32R6-LABEL: maximumnum_float_nsz:
; MIPS32R6: # %bb.0:
; MIPS32R6-NEXT: min.s $f0, $f14, $f14
; MIPS32R6-NEXT: min.s $f1, $f12, $f12
; MIPS32R6-NEXT: jr $ra
; MIPS32R6-NEXT: max.s $f0, $f1, $f0
%z = call nsz float @llvm.maximumnum.f32(float %x, float %y)
ret float %z
}

define float @maximumnum_float_nnan(float %x, float %y) {
; MIPS32R6-LABEL: maximumnum_float_nnan:
; MIPS32R6: # %bb.0:
; MIPS32R6-NEXT: jr $ra
; MIPS32R6-NEXT: max.s $f0, $f12, $f14
%z = call nnan float @llvm.maximumnum.f32(float %x, float %y)
ret float %z
}


define double @maximumnum_double(double %x, double %y) {
; MIPS32R6-LABEL: maximumnum_double:
; MIPS32R6: # %bb.0:
; MIPS32R6-NEXT: min.d $f0, $f14, $f14
; MIPS32R6-NEXT: min.d $f1, $f12, $f12
; MIPS32R6-NEXT: jr $ra
; MIPS32R6-NEXT: max.d $f0, $f1, $f0
%z = call double @llvm.maximumnum.f64(double %x, double %y)
ret double %z
}

define double @maximumnum_double_nsz(double %x, double %y) {
; MIPS32R6-LABEL: maximumnum_double_nsz:
; MIPS32R6: # %bb.0:
; MIPS32R6-NEXT: min.d $f0, $f14, $f14
; MIPS32R6-NEXT: min.d $f1, $f12, $f12
; MIPS32R6-NEXT: jr $ra
; MIPS32R6-NEXT: max.d $f0, $f1, $f0
%z = call nsz double @llvm.maximumnum.f64(double %x, double %y)
ret double %z
}

define double @maximumnum_double_nnan(double %x, double %y) {
; MIPS32R6-LABEL: maximumnum_double_nnan:
; MIPS32R6: # %bb.0:
; MIPS32R6-NEXT: jr $ra
; MIPS32R6-NEXT: max.d $f0, $f12, $f14
%z = call nnan double @llvm.maximumnum.f64(double %x, double %y)
ret double %z
}

define float @minimumnum_float(float %x, float %y) {
; MIPS32R6-LABEL: minimumnum_float:
; MIPS32R6: # %bb.0:
; MIPS32R6-NEXT: min.s $f0, $f14, $f14
; MIPS32R6-NEXT: min.s $f1, $f12, $f12
; MIPS32R6-NEXT: jr $ra
; MIPS32R6-NEXT: min.s $f0, $f1, $f0
%z = call float @llvm.minimumnum.f32(float %x, float %y)
ret float %z
}

define float @minimumnum_float_nsz(float %x, float %y) {
; MIPS32R6-LABEL: minimumnum_float_nsz:
; MIPS32R6: # %bb.0:
; MIPS32R6-NEXT: min.s $f0, $f14, $f14
; MIPS32R6-NEXT: min.s $f1, $f12, $f12
; MIPS32R6-NEXT: jr $ra
; MIPS32R6-NEXT: min.s $f0, $f1, $f0
%z = call nsz float @llvm.minimumnum.f32(float %x, float %y)
ret float %z
}

define float @minimumnum_float_nnan(float %x, float %y) {
; MIPS32R6-LABEL: minimumnum_float_nnan:
; MIPS32R6: # %bb.0:
; MIPS32R6-NEXT: jr $ra
; MIPS32R6-NEXT: min.s $f0, $f12, $f14
%z = call nnan float @llvm.minimumnum.f32(float %x, float %y)
ret float %z
}

define double @minimumnum_double(double %x, double %y) {
; MIPS32R6-LABEL: minimumnum_double:
; MIPS32R6: # %bb.0:
; MIPS32R6-NEXT: min.d $f0, $f14, $f14
; MIPS32R6-NEXT: min.d $f1, $f12, $f12
; MIPS32R6-NEXT: jr $ra
; MIPS32R6-NEXT: min.d $f0, $f1, $f0
%z = call double @llvm.minimumnum.f64(double %x, double %y)
ret double %z
}

define double @minimumnum_double_nsz(double %x, double %y) {
; MIPS32R6-LABEL: minimumnum_double_nsz:
; MIPS32R6: # %bb.0:
; MIPS32R6-NEXT: min.d $f0, $f14, $f14
; MIPS32R6-NEXT: min.d $f1, $f12, $f12
; MIPS32R6-NEXT: jr $ra
; MIPS32R6-NEXT: min.d $f0, $f1, $f0
%z = call nsz double @llvm.minimumnum.f64(double %x, double %y)
ret double %z
}

define double @minimumnum_double_nnan(double %x, double %y) {
; MIPS32R6-LABEL: minimumnum_double_nnan:
; MIPS32R6: # %bb.0:
; MIPS32R6-NEXT: jr $ra
; MIPS32R6-NEXT: min.d $f0, $f12, $f14
%z = call nnan double @llvm.minimumnum.f64(double %x, double %y)
ret double %z
}
17 changes: 12 additions & 5 deletions llvm/test/CodeGen/RISCV/float-convert.ll
Original file line number Diff line number Diff line change
Expand Up @@ -336,17 +336,23 @@ start:
}
declare i32 @llvm.fptoui.sat.i32.f32(float)

define i32 @fmv_x_w(float %a, float %b) nounwind {
define signext i32 @fmv_x_w(float %a, float %b) nounwind {
; CHECKIF-LABEL: fmv_x_w:
; CHECKIF: # %bb.0:
; CHECKIF-NEXT: fadd.s fa5, fa0, fa1
; CHECKIF-NEXT: fmv.x.w a0, fa5
; CHECKIF-NEXT: ret
;
; CHECKIZFINX-LABEL: fmv_x_w:
; CHECKIZFINX: # %bb.0:
; CHECKIZFINX-NEXT: fadd.s a0, a0, a1
; CHECKIZFINX-NEXT: ret
; RV32IZFINX-LABEL: fmv_x_w:
; RV32IZFINX: # %bb.0:
; RV32IZFINX-NEXT: fadd.s a0, a0, a1
; RV32IZFINX-NEXT: ret
;
; RV64IZFINX-LABEL: fmv_x_w:
; RV64IZFINX: # %bb.0:
; RV64IZFINX-NEXT: fadd.s a0, a0, a1
; RV64IZFINX-NEXT: sext.w a0, a0
; RV64IZFINX-NEXT: ret
;
; RV32I-LABEL: fmv_x_w:
; RV32I: # %bb.0:
Expand All @@ -362,6 +368,7 @@ define i32 @fmv_x_w(float %a, float %b) nounwind {
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: call __addsf3
; RV64I-NEXT: sext.w a0, a0
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
Expand Down
95 changes: 95 additions & 0 deletions llvm/test/CodeGen/RISCV/riscv-codegen-prepare-atp.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
; RUN: opt -passes='require<profile-summary>,function(codegenprepare)' < %s -S | FileCheck %s

target datalayout = "e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "riscv64"

%struct.match_state = type { i64, i64 }

; %add is also promoted by forking an extra sext.
define void @promoteTwoOne(i32 %i, i32 %j, ptr %P1, ptr %P2 ) {
; CHECK-LABEL: define void @promoteTwoOne(
; CHECK-SAME: i32 [[I:%.*]], i32 [[J:%.*]], ptr [[P1:%.*]], ptr [[P2:%.*]]) {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[S2:%.*]] = sext i32 [[I]] to i64
; CHECK-NEXT: [[PROMOTED2:%.*]] = sext i32 [[J]] to i64
; CHECK-NEXT: [[S:%.*]] = add nsw i64 [[S2]], [[PROMOTED2]]
; CHECK-NEXT: [[ADDR1:%.*]] = getelementptr inbounds i64, ptr [[P1]], i64 [[S]]
; CHECK-NEXT: store i64 [[S]], ptr [[ADDR1]], align 8
; CHECK-NEXT: [[ADDR2:%.*]] = getelementptr inbounds i64, ptr [[P2]], i64 [[S2]]
; CHECK-NEXT: store i64 [[S2]], ptr [[ADDR2]], align 8
; CHECK-NEXT: ret void
;
entry:
%add = add nsw i32 %i, %j
%s = sext i32 %add to i64
%addr1 = getelementptr inbounds i64, ptr %P1, i64 %s
store i64 %s, ptr %addr1
%s2 = sext i32 %i to i64
%addr2 = getelementptr inbounds i64, ptr %P2, i64 %s2
store i64 %s2, ptr %addr2
ret void
}

; Both %add1 and %add2 are promoted by forking extra sexts.
define void @promoteTwoTwo(i32 %i, i32 %j, i32 %k, ptr %P1, ptr %P2) {
; CHECK-LABEL: define void @promoteTwoTwo(
; CHECK-SAME: i32 [[I:%.*]], i32 [[J:%.*]], i32 [[K:%.*]], ptr [[P1:%.*]], ptr [[P2:%.*]]) {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[PROMOTED3:%.*]] = sext i32 [[J]] to i64
; CHECK-NEXT: [[PROMOTED4:%.*]] = sext i32 [[I]] to i64
; CHECK-NEXT: [[S:%.*]] = add nsw i64 [[PROMOTED3]], [[PROMOTED4]]
; CHECK-NEXT: [[ADDR1:%.*]] = getelementptr inbounds i64, ptr [[P1]], i64 [[S]]
; CHECK-NEXT: store i64 [[S]], ptr [[ADDR1]], align 8
; CHECK-NEXT: [[PROMOTED2:%.*]] = sext i32 [[K]] to i64
; CHECK-NEXT: [[S2:%.*]] = add nsw i64 [[PROMOTED3]], [[PROMOTED2]]
; CHECK-NEXT: [[ADDR2:%.*]] = getelementptr inbounds i64, ptr [[P2]], i64 [[S2]]
; CHECK-NEXT: store i64 [[S2]], ptr [[ADDR2]], align 8
; CHECK-NEXT: ret void
;
entry:
%add1 = add nsw i32 %j, %i
%s = sext i32 %add1 to i64
%addr1 = getelementptr inbounds i64, ptr %P1, i64 %s
store i64 %s, ptr %addr1
%add2 = add nsw i32 %j, %k
%s2 = sext i32 %add2 to i64
%addr2 = getelementptr inbounds i64, ptr %P2, i64 %s2
store i64 %s2, ptr %addr2
ret void
}

define i64 @promoteGEPSunk(i1 %cond, ptr %base, i32 %i) {
; CHECK-LABEL: define i64 @promoteGEPSunk(
; CHECK-SAME: i1 [[COND:%.*]], ptr [[BASE:%.*]], i32 [[I:%.*]]) {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[PROMOTED1:%.*]] = sext i32 [[I]] to i64
; CHECK-NEXT: [[S:%.*]] = add nsw i64 [[PROMOTED1]], 1
; CHECK-NEXT: [[ADDR:%.*]] = getelementptr inbounds i64, ptr [[BASE]], i64 [[S]]
; CHECK-NEXT: [[S2:%.*]] = add nsw i64 [[PROMOTED1]], 2
; CHECK-NEXT: [[ADDR2:%.*]] = getelementptr inbounds i64, ptr [[BASE]], i64 [[S2]]
; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_THEN2:%.*]]
; CHECK: if.then:
; CHECK-NEXT: [[V:%.*]] = load i64, ptr [[ADDR]], align 8
; CHECK-NEXT: [[V2:%.*]] = load i64, ptr [[ADDR2]], align 8
; CHECK-NEXT: [[R:%.*]] = add i64 [[V]], [[V2]]
; CHECK-NEXT: ret i64 [[R]]
; CHECK: if.then2:
; CHECK-NEXT: ret i64 0
;
entry:
%add = add nsw i32 %i, 1
%s = sext i32 %add to i64
%addr = getelementptr inbounds i64, ptr %base, i64 %s
%add2 = add nsw i32 %i, 2
%s2 = sext i32 %add2 to i64
%addr2 = getelementptr inbounds i64, ptr %base, i64 %s2
br i1 %cond, label %if.then, label %if.then2
if.then:
%v = load i64, ptr %addr
%v2 = load i64, ptr %addr2
%r = add i64 %v, %v2
ret i64 %r
if.then2:
ret i64 0;
}
2 changes: 2 additions & 0 deletions llvm/test/CodeGen/RISCV/rv64zfh-half-convert.ll
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,8 @@ define signext i16 @bcvt_f16_to_sext_i16(half %a, half %b) nounwind {
; RV64IZHINX-LABEL: bcvt_f16_to_sext_i16:
; RV64IZHINX: # %bb.0:
; RV64IZHINX-NEXT: fadd.h a0, a0, a1
; RV64IZHINX-NEXT: slli a0, a0, 48
; RV64IZHINX-NEXT: srai a0, a0, 48
; RV64IZHINX-NEXT: ret
%1 = fadd half %a, %b
%2 = bitcast half %1 to i16
Expand Down
2 changes: 2 additions & 0 deletions llvm/test/CodeGen/RISCV/rv64zfhmin-half-convert.ll
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,8 @@ define signext i16 @bcvt_f16_to_sext_i16(half %a, half %b) nounwind {
; RV64IZHINXMIN-NEXT: fcvt.s.h a0, a0
; RV64IZHINXMIN-NEXT: fadd.s a0, a0, a1
; RV64IZHINXMIN-NEXT: fcvt.h.s a0, a0
; RV64IZHINXMIN-NEXT: slli a0, a0, 48
; RV64IZHINXMIN-NEXT: srai a0, a0, 48
; RV64IZHINXMIN-NEXT: ret
%1 = fadd half %a, %b
%2 = bitcast half %1 to i16
Expand Down
120 changes: 60 additions & 60 deletions llvm/test/CodeGen/X86/cmpccxadd-intrinsics.ll
Original file line number Diff line number Diff line change
Expand Up @@ -112,13 +112,13 @@ define dso_local i32 @test_cmplxadd32(ptr %__A, i32 %__B, i32 %__C) nounwind {
; CHECK-LABEL: test_cmplxadd32:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movl %esi, %eax # encoding: [0x89,0xf0]
; CHECK-NEXT: cmpnbxadd %edx, %eax, (%rdi) # encoding: [0xc4,0xe2,0x69,0xe3,0x07]
; CHECK-NEXT: cmpaexadd %edx, %eax, (%rdi) # encoding: [0xc4,0xe2,0x69,0xe3,0x07]
; CHECK-NEXT: retq # encoding: [0xc3]
;
; EGPR-LABEL: test_cmplxadd32:
; EGPR: # %bb.0: # %entry
; EGPR-NEXT: movl %esi, %eax # encoding: [0x89,0xf0]
; EGPR-NEXT: cmpnbxadd %edx, %eax, (%rdi) # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x69,0xe3,0x07]
; EGPR-NEXT: cmpaexadd %edx, %eax, (%rdi) # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x69,0xe3,0x07]
; EGPR-NEXT: retq # encoding: [0xc3]
entry:
%0 = tail call i32 @llvm.x86.cmpccxadd32(ptr %__A, i32 %__B, i32 %__C, i32 3)
Expand All @@ -129,95 +129,95 @@ define dso_local i64 @test_cmplxadd64(ptr %__A, i64 %__B, i64 %__C) nounwind {
; CHECK-LABEL: test_cmplxadd64:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movq %rsi, %rax # encoding: [0x48,0x89,0xf0]
; CHECK-NEXT: cmpnbxadd %rdx, %rax, (%rdi) # encoding: [0xc4,0xe2,0xe9,0xe3,0x07]
; CHECK-NEXT: cmpaexadd %rdx, %rax, (%rdi) # encoding: [0xc4,0xe2,0xe9,0xe3,0x07]
; CHECK-NEXT: retq # encoding: [0xc3]
;
; EGPR-LABEL: test_cmplxadd64:
; EGPR: # %bb.0: # %entry
; EGPR-NEXT: movq %rsi, %rax # encoding: [0x48,0x89,0xf0]
; EGPR-NEXT: cmpnbxadd %rdx, %rax, (%rdi) # EVEX TO VEX Compression encoding: [0xc4,0xe2,0xe9,0xe3,0x07]
; EGPR-NEXT: cmpaexadd %rdx, %rax, (%rdi) # EVEX TO VEX Compression encoding: [0xc4,0xe2,0xe9,0xe3,0x07]
; EGPR-NEXT: retq # encoding: [0xc3]
entry:
%0 = tail call i64 @llvm.x86.cmpccxadd64(ptr %__A, i64 %__B, i64 %__C, i32 3)
ret i64 %0
}

define dso_local i32 @test_cmpnbexadd32(ptr %__A, i32 %__B, i32 %__C) nounwind {
; CHECK-LABEL: test_cmpnbexadd32:
define dso_local i32 @test_cmpaxadd32(ptr %__A, i32 %__B, i32 %__C) nounwind {
; CHECK-LABEL: test_cmpaxadd32:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movl %esi, %eax # encoding: [0x89,0xf0]
; CHECK-NEXT: cmpzxadd %edx, %eax, (%rdi) # encoding: [0xc4,0xe2,0x69,0xe4,0x07]
; CHECK-NEXT: cmpexadd %edx, %eax, (%rdi) # encoding: [0xc4,0xe2,0x69,0xe4,0x07]
; CHECK-NEXT: retq # encoding: [0xc3]
;
; EGPR-LABEL: test_cmpnbexadd32:
; EGPR-LABEL: test_cmpaxadd32:
; EGPR: # %bb.0: # %entry
; EGPR-NEXT: movl %esi, %eax # encoding: [0x89,0xf0]
; EGPR-NEXT: cmpzxadd %edx, %eax, (%rdi) # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x69,0xe4,0x07]
; EGPR-NEXT: cmpexadd %edx, %eax, (%rdi) # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x69,0xe4,0x07]
; EGPR-NEXT: retq # encoding: [0xc3]
entry:
%0 = tail call i32 @llvm.x86.cmpccxadd32(ptr %__A, i32 %__B, i32 %__C, i32 4)
ret i32 %0
}

define dso_local i64 @test_cmpnbexadd64(ptr %__A, i64 %__B, i64 %__C) nounwind {
; CHECK-LABEL: test_cmpnbexadd64:
define dso_local i64 @test_cmpaxadd64(ptr %__A, i64 %__B, i64 %__C) nounwind {
; CHECK-LABEL: test_cmpaxadd64:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movq %rsi, %rax # encoding: [0x48,0x89,0xf0]
; CHECK-NEXT: cmpzxadd %rdx, %rax, (%rdi) # encoding: [0xc4,0xe2,0xe9,0xe4,0x07]
; CHECK-NEXT: cmpexadd %rdx, %rax, (%rdi) # encoding: [0xc4,0xe2,0xe9,0xe4,0x07]
; CHECK-NEXT: retq # encoding: [0xc3]
;
; EGPR-LABEL: test_cmpnbexadd64:
; EGPR-LABEL: test_cmpaxadd64:
; EGPR: # %bb.0: # %entry
; EGPR-NEXT: movq %rsi, %rax # encoding: [0x48,0x89,0xf0]
; EGPR-NEXT: cmpzxadd %rdx, %rax, (%rdi) # EVEX TO VEX Compression encoding: [0xc4,0xe2,0xe9,0xe4,0x07]
; EGPR-NEXT: cmpexadd %rdx, %rax, (%rdi) # EVEX TO VEX Compression encoding: [0xc4,0xe2,0xe9,0xe4,0x07]
; EGPR-NEXT: retq # encoding: [0xc3]
entry:
%0 = tail call i64 @llvm.x86.cmpccxadd64(ptr %__A, i64 %__B, i64 %__C, i32 4)
ret i64 %0
}

define dso_local i32 @test_cmpnbxadd32(ptr %__A, i32 %__B, i32 %__C) nounwind {
; CHECK-LABEL: test_cmpnbxadd32:
define dso_local i32 @test_cmpaexadd32(ptr %__A, i32 %__B, i32 %__C) nounwind {
; CHECK-LABEL: test_cmpaexadd32:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movl %esi, %eax # encoding: [0x89,0xf0]
; CHECK-NEXT: cmpnzxadd %edx, %eax, (%rdi) # encoding: [0xc4,0xe2,0x69,0xe5,0x07]
; CHECK-NEXT: cmpnexadd %edx, %eax, (%rdi) # encoding: [0xc4,0xe2,0x69,0xe5,0x07]
; CHECK-NEXT: retq # encoding: [0xc3]
;
; EGPR-LABEL: test_cmpnbxadd32:
; EGPR-LABEL: test_cmpaexadd32:
; EGPR: # %bb.0: # %entry
; EGPR-NEXT: movl %esi, %eax # encoding: [0x89,0xf0]
; EGPR-NEXT: cmpnzxadd %edx, %eax, (%rdi) # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x69,0xe5,0x07]
; EGPR-NEXT: cmpnexadd %edx, %eax, (%rdi) # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x69,0xe5,0x07]
; EGPR-NEXT: retq # encoding: [0xc3]
entry:
%0 = tail call i32 @llvm.x86.cmpccxadd32(ptr %__A, i32 %__B, i32 %__C, i32 5)
ret i32 %0
}

define dso_local i64 @test_cmpnbxadd64(ptr %__A, i64 %__B, i64 %__C) nounwind {
; CHECK-LABEL: test_cmpnbxadd64:
define dso_local i64 @test_cmpaexadd64(ptr %__A, i64 %__B, i64 %__C) nounwind {
; CHECK-LABEL: test_cmpaexadd64:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movq %rsi, %rax # encoding: [0x48,0x89,0xf0]
; CHECK-NEXT: cmpnzxadd %rdx, %rax, (%rdi) # encoding: [0xc4,0xe2,0xe9,0xe5,0x07]
; CHECK-NEXT: cmpnexadd %rdx, %rax, (%rdi) # encoding: [0xc4,0xe2,0xe9,0xe5,0x07]
; CHECK-NEXT: retq # encoding: [0xc3]
;
; EGPR-LABEL: test_cmpnbxadd64:
; EGPR-LABEL: test_cmpaexadd64:
; EGPR: # %bb.0: # %entry
; EGPR-NEXT: movq %rsi, %rax # encoding: [0x48,0x89,0xf0]
; EGPR-NEXT: cmpnzxadd %rdx, %rax, (%rdi) # EVEX TO VEX Compression encoding: [0xc4,0xe2,0xe9,0xe5,0x07]
; EGPR-NEXT: cmpnexadd %rdx, %rax, (%rdi) # EVEX TO VEX Compression encoding: [0xc4,0xe2,0xe9,0xe5,0x07]
; EGPR-NEXT: retq # encoding: [0xc3]
entry:
%0 = tail call i64 @llvm.x86.cmpccxadd64(ptr %__A, i64 %__B, i64 %__C, i32 5)
ret i64 %0
}

define dso_local i32 @test_cmpnlexadd32(ptr %__A, i32 %__B, i32 %__C) nounwind {
; CHECK-LABEL: test_cmpnlexadd32:
define dso_local i32 @test_cmpgxadd32(ptr %__A, i32 %__B, i32 %__C) nounwind {
; CHECK-LABEL: test_cmpgxadd32:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movl %esi, %eax # encoding: [0x89,0xf0]
; CHECK-NEXT: cmpbexadd %edx, %eax, (%rdi) # encoding: [0xc4,0xe2,0x69,0xe6,0x07]
; CHECK-NEXT: retq # encoding: [0xc3]
;
; EGPR-LABEL: test_cmpnlexadd32:
; EGPR-LABEL: test_cmpgxadd32:
; EGPR: # %bb.0: # %entry
; EGPR-NEXT: movl %esi, %eax # encoding: [0x89,0xf0]
; EGPR-NEXT: cmpbexadd %edx, %eax, (%rdi) # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x69,0xe6,0x07]
Expand All @@ -227,14 +227,14 @@ entry:
ret i32 %0
}

define dso_local i64 @test_cmpnlexadd64(ptr %__A, i64 %__B, i64 %__C) nounwind {
; CHECK-LABEL: test_cmpnlexadd64:
define dso_local i64 @test_cmpgxadd64(ptr %__A, i64 %__B, i64 %__C) nounwind {
; CHECK-LABEL: test_cmpgxadd64:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movq %rsi, %rax # encoding: [0x48,0x89,0xf0]
; CHECK-NEXT: cmpbexadd %rdx, %rax, (%rdi) # encoding: [0xc4,0xe2,0xe9,0xe6,0x07]
; CHECK-NEXT: retq # encoding: [0xc3]
;
; EGPR-LABEL: test_cmpnlexadd64:
; EGPR-LABEL: test_cmpgxadd64:
; EGPR: # %bb.0: # %entry
; EGPR-NEXT: movq %rsi, %rax # encoding: [0x48,0x89,0xf0]
; EGPR-NEXT: cmpbexadd %rdx, %rax, (%rdi) # EVEX TO VEX Compression encoding: [0xc4,0xe2,0xe9,0xe6,0x07]
Expand All @@ -244,34 +244,34 @@ entry:
ret i64 %0
}

define dso_local i32 @test_cmpnlxadd32(ptr %__A, i32 %__B, i32 %__C) nounwind {
; CHECK-LABEL: test_cmpnlxadd32:
define dso_local i32 @test_cmpgexadd32(ptr %__A, i32 %__B, i32 %__C) nounwind {
; CHECK-LABEL: test_cmpgexadd32:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movl %esi, %eax # encoding: [0x89,0xf0]
; CHECK-NEXT: cmpnbexadd %edx, %eax, (%rdi) # encoding: [0xc4,0xe2,0x69,0xe7,0x07]
; CHECK-NEXT: cmpaxadd %edx, %eax, (%rdi) # encoding: [0xc4,0xe2,0x69,0xe7,0x07]
; CHECK-NEXT: retq # encoding: [0xc3]
;
; EGPR-LABEL: test_cmpnlxadd32:
; EGPR-LABEL: test_cmpgexadd32:
; EGPR: # %bb.0: # %entry
; EGPR-NEXT: movl %esi, %eax # encoding: [0x89,0xf0]
; EGPR-NEXT: cmpnbexadd %edx, %eax, (%rdi) # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x69,0xe7,0x07]
; EGPR-NEXT: cmpaxadd %edx, %eax, (%rdi) # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x69,0xe7,0x07]
; EGPR-NEXT: retq # encoding: [0xc3]
entry:
%0 = tail call i32 @llvm.x86.cmpccxadd32(ptr %__A, i32 %__B, i32 %__C, i32 7)
ret i32 %0
}

define dso_local i64 @test_cmpnlxadd64(ptr %__A, i64 %__B, i64 %__C) nounwind {
; CHECK-LABEL: test_cmpnlxadd64:
define dso_local i64 @test_cmpgexadd64(ptr %__A, i64 %__B, i64 %__C) nounwind {
; CHECK-LABEL: test_cmpgexadd64:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movq %rsi, %rax # encoding: [0x48,0x89,0xf0]
; CHECK-NEXT: cmpnbexadd %rdx, %rax, (%rdi) # encoding: [0xc4,0xe2,0xe9,0xe7,0x07]
; CHECK-NEXT: cmpaxadd %rdx, %rax, (%rdi) # encoding: [0xc4,0xe2,0xe9,0xe7,0x07]
; CHECK-NEXT: retq # encoding: [0xc3]
;
; EGPR-LABEL: test_cmpnlxadd64:
; EGPR-LABEL: test_cmpgexadd64:
; EGPR: # %bb.0: # %entry
; EGPR-NEXT: movq %rsi, %rax # encoding: [0x48,0x89,0xf0]
; EGPR-NEXT: cmpnbexadd %rdx, %rax, (%rdi) # EVEX TO VEX Compression encoding: [0xc4,0xe2,0xe9,0xe7,0x07]
; EGPR-NEXT: cmpaxadd %rdx, %rax, (%rdi) # EVEX TO VEX Compression encoding: [0xc4,0xe2,0xe9,0xe7,0x07]
; EGPR-NEXT: retq # encoding: [0xc3]
entry:
%0 = tail call i64 @llvm.x86.cmpccxadd64(ptr %__A, i64 %__B, i64 %__C, i32 7)
Expand Down Expand Up @@ -380,14 +380,14 @@ entry:
ret i64 %0
}

define dso_local i32 @test_cmpnzxadd32(ptr %__A, i32 %__B, i32 %__C) nounwind {
; CHECK-LABEL: test_cmpnzxadd32:
define dso_local i32 @test_cmpnexadd32(ptr %__A, i32 %__B, i32 %__C) nounwind {
; CHECK-LABEL: test_cmpnexadd32:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movl %esi, %eax # encoding: [0x89,0xf0]
; CHECK-NEXT: cmpnpxadd %edx, %eax, (%rdi) # encoding: [0xc4,0xe2,0x69,0xeb,0x07]
; CHECK-NEXT: retq # encoding: [0xc3]
;
; EGPR-LABEL: test_cmpnzxadd32:
; EGPR-LABEL: test_cmpnexadd32:
; EGPR: # %bb.0: # %entry
; EGPR-NEXT: movl %esi, %eax # encoding: [0x89,0xf0]
; EGPR-NEXT: cmpnpxadd %edx, %eax, (%rdi) # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x69,0xeb,0x07]
Expand All @@ -397,14 +397,14 @@ entry:
ret i32 %0
}

define dso_local i64 @test_cmpnzxadd64(ptr %__A, i64 %__B, i64 %__C) nounwind {
; CHECK-LABEL: test_cmpnzxadd64:
define dso_local i64 @test_cmpnexadd64(ptr %__A, i64 %__B, i64 %__C) nounwind {
; CHECK-LABEL: test_cmpnexadd64:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movq %rsi, %rax # encoding: [0x48,0x89,0xf0]
; CHECK-NEXT: cmpnpxadd %rdx, %rax, (%rdi) # encoding: [0xc4,0xe2,0xe9,0xeb,0x07]
; CHECK-NEXT: retq # encoding: [0xc3]
;
; EGPR-LABEL: test_cmpnzxadd64:
; EGPR-LABEL: test_cmpnexadd64:
; EGPR: # %bb.0: # %entry
; EGPR-NEXT: movq %rsi, %rax # encoding: [0x48,0x89,0xf0]
; EGPR-NEXT: cmpnpxadd %rdx, %rax, (%rdi) # EVEX TO VEX Compression encoding: [0xc4,0xe2,0xe9,0xeb,0x07]
Expand Down Expand Up @@ -452,13 +452,13 @@ define dso_local i32 @test_cmppxadd32(ptr %__A, i32 %__B, i32 %__C) nounwind {
; CHECK-LABEL: test_cmppxadd32:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movl %esi, %eax # encoding: [0x89,0xf0]
; CHECK-NEXT: cmpnlxadd %edx, %eax, (%rdi) # encoding: [0xc4,0xe2,0x69,0xed,0x07]
; CHECK-NEXT: cmpgexadd %edx, %eax, (%rdi) # encoding: [0xc4,0xe2,0x69,0xed,0x07]
; CHECK-NEXT: retq # encoding: [0xc3]
;
; EGPR-LABEL: test_cmppxadd32:
; EGPR: # %bb.0: # %entry
; EGPR-NEXT: movl %esi, %eax # encoding: [0x89,0xf0]
; EGPR-NEXT: cmpnlxadd %edx, %eax, (%rdi) # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x69,0xed,0x07]
; EGPR-NEXT: cmpgexadd %edx, %eax, (%rdi) # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x69,0xed,0x07]
; EGPR-NEXT: retq # encoding: [0xc3]
entry:
%0 = tail call i32 @llvm.x86.cmpccxadd32(ptr %__A, i32 %__B, i32 %__C, i32 13)
Expand All @@ -469,13 +469,13 @@ define dso_local i64 @test_cmppxadd64(ptr %__A, i64 %__B, i64 %__C) nounwind {
; CHECK-LABEL: test_cmppxadd64:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movq %rsi, %rax # encoding: [0x48,0x89,0xf0]
; CHECK-NEXT: cmpnlxadd %rdx, %rax, (%rdi) # encoding: [0xc4,0xe2,0xe9,0xed,0x07]
; CHECK-NEXT: cmpgexadd %rdx, %rax, (%rdi) # encoding: [0xc4,0xe2,0xe9,0xed,0x07]
; CHECK-NEXT: retq # encoding: [0xc3]
;
; EGPR-LABEL: test_cmppxadd64:
; EGPR: # %bb.0: # %entry
; EGPR-NEXT: movq %rsi, %rax # encoding: [0x48,0x89,0xf0]
; EGPR-NEXT: cmpnlxadd %rdx, %rax, (%rdi) # EVEX TO VEX Compression encoding: [0xc4,0xe2,0xe9,0xed,0x07]
; EGPR-NEXT: cmpgexadd %rdx, %rax, (%rdi) # EVEX TO VEX Compression encoding: [0xc4,0xe2,0xe9,0xed,0x07]
; EGPR-NEXT: retq # encoding: [0xc3]
entry:
%0 = tail call i64 @llvm.x86.cmpccxadd64(ptr %__A, i64 %__B, i64 %__C, i32 13)
Expand Down Expand Up @@ -516,34 +516,34 @@ entry:
ret i64 %0
}

define dso_local i32 @test_cmpzxadd32(ptr %__A, i32 %__B, i32 %__C) nounwind {
; CHECK-LABEL: test_cmpzxadd32:
define dso_local i32 @test_cmpexadd32(ptr %__A, i32 %__B, i32 %__C) nounwind {
; CHECK-LABEL: test_cmpexadd32:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movl %esi, %eax # encoding: [0x89,0xf0]
; CHECK-NEXT: cmpnlexadd %edx, %eax, (%rdi) # encoding: [0xc4,0xe2,0x69,0xef,0x07]
; CHECK-NEXT: cmpgxadd %edx, %eax, (%rdi) # encoding: [0xc4,0xe2,0x69,0xef,0x07]
; CHECK-NEXT: retq # encoding: [0xc3]
;
; EGPR-LABEL: test_cmpzxadd32:
; EGPR-LABEL: test_cmpexadd32:
; EGPR: # %bb.0: # %entry
; EGPR-NEXT: movl %esi, %eax # encoding: [0x89,0xf0]
; EGPR-NEXT: cmpnlexadd %edx, %eax, (%rdi) # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x69,0xef,0x07]
; EGPR-NEXT: cmpgxadd %edx, %eax, (%rdi) # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x69,0xef,0x07]
; EGPR-NEXT: retq # encoding: [0xc3]
entry:
%0 = tail call i32 @llvm.x86.cmpccxadd32(ptr %__A, i32 %__B, i32 %__C, i32 15)
ret i32 %0
}

define dso_local i64 @test_cmpzxadd64(ptr %__A, i64 %__B, i64 %__C) nounwind {
; CHECK-LABEL: test_cmpzxadd64:
define dso_local i64 @test_cmpexadd64(ptr %__A, i64 %__B, i64 %__C) nounwind {
; CHECK-LABEL: test_cmpexadd64:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movq %rsi, %rax # encoding: [0x48,0x89,0xf0]
; CHECK-NEXT: cmpnlexadd %rdx, %rax, (%rdi) # encoding: [0xc4,0xe2,0xe9,0xef,0x07]
; CHECK-NEXT: cmpgxadd %rdx, %rax, (%rdi) # encoding: [0xc4,0xe2,0xe9,0xef,0x07]
; CHECK-NEXT: retq # encoding: [0xc3]
;
; EGPR-LABEL: test_cmpzxadd64:
; EGPR-LABEL: test_cmpexadd64:
; EGPR: # %bb.0: # %entry
; EGPR-NEXT: movq %rsi, %rax # encoding: [0x48,0x89,0xf0]
; EGPR-NEXT: cmpnlexadd %rdx, %rax, (%rdi) # EVEX TO VEX Compression encoding: [0xc4,0xe2,0xe9,0xef,0x07]
; EGPR-NEXT: cmpgxadd %rdx, %rax, (%rdi) # EVEX TO VEX Compression encoding: [0xc4,0xe2,0xe9,0xef,0x07]
; EGPR-NEXT: retq # encoding: [0xc3]
entry:
%0 = tail call i64 @llvm.x86.cmpccxadd64(ptr %__A, i64 %__B, i64 %__C, i32 15)
Expand Down
80 changes: 40 additions & 40 deletions llvm/test/MC/Disassembler/X86/apx/cmpccxadd.txt
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
# RUN: llvm-mc --disassemble %s -triple=x86_64 | FileCheck %s --check-prefixes=ATT
# RUN: llvm-mc --disassemble %s -triple=x86_64 -x86-asm-syntax=intel --output-asm-variant=1 | FileCheck %s --check-prefixes=INTEL

# ATT: cmpnbexadd %ecx, %edx, 123(%rax,%rbx,4)
# INTEL: cmpnbexadd dword ptr [rax + 4*rbx + 123], edx, ecx
# ATT: cmpaxadd %ecx, %edx, 123(%rax,%rbx,4)
# INTEL: cmpaxadd dword ptr [rax + 4*rbx + 123], edx, ecx
0x62,0xf2,0x75,0x08,0xe7,0x54,0x98,0x7b

# ATT: cmpnbexadd %r9, %r15, 123(%rax,%rbx,4)
# INTEL: cmpnbexadd qword ptr [rax + 4*rbx + 123], r15, r9
# ATT: cmpaxadd %r9, %r15, 123(%rax,%rbx,4)
# INTEL: cmpaxadd qword ptr [rax + 4*rbx + 123], r15, r9
0x62,0x72,0xb5,0x08,0xe7,0x7c,0x98,0x7b

# ATT: cmpnbexadd %r18d, %r22d, 291(%r28,%r29,4)
# INTEL: cmpnbexadd dword ptr [r28 + 4*r29 + 291], r22d, r18d
# ATT: cmpaxadd %r18d, %r22d, 291(%r28,%r29,4)
# INTEL: cmpaxadd dword ptr [r28 + 4*r29 + 291], r22d, r18d
0x62,0x8a,0x69,0x00,0xe7,0xb4,0xac,0x23,0x01,0x00,0x00

# ATT: cmpnbexadd %r19, %r23, 291(%r28,%r29,4)
# INTEL: cmpnbexadd qword ptr [r28 + 4*r29 + 291], r23, r19
# ATT: cmpaxadd %r19, %r23, 291(%r28,%r29,4)
# INTEL: cmpaxadd qword ptr [r28 + 4*r29 + 291], r23, r19
0x62,0x8a,0xe1,0x00,0xe7,0xbc,0xac,0x23,0x01,0x00,0x00

# ATT: cmpbexadd %ecx, %edx, 123(%rax,%rbx,4)
Expand Down Expand Up @@ -49,52 +49,52 @@
# INTEL: cmpbxadd qword ptr [r28 + 4*r29 + 291], r23, r19
0x62,0x8a,0xe1,0x00,0xe2,0xbc,0xac,0x23,0x01,0x00,0x00

# ATT: cmpzxadd %ecx, %edx, 123(%rax,%rbx,4)
# INTEL: cmpzxadd dword ptr [rax + 4*rbx + 123], edx, ecx
# ATT: cmpexadd %ecx, %edx, 123(%rax,%rbx,4)
# INTEL: cmpexadd dword ptr [rax + 4*rbx + 123], edx, ecx
0x62,0xf2,0x75,0x08,0xe4,0x54,0x98,0x7b

# ATT: cmpzxadd %r9, %r15, 123(%rax,%rbx,4)
# INTEL: cmpzxadd qword ptr [rax + 4*rbx + 123], r15, r9
# ATT: cmpexadd %r9, %r15, 123(%rax,%rbx,4)
# INTEL: cmpexadd qword ptr [rax + 4*rbx + 123], r15, r9
0x62,0x72,0xb5,0x08,0xe4,0x7c,0x98,0x7b

# ATT: cmpzxadd %r18d, %r22d, 291(%r28,%r29,4)
# INTEL: cmpzxadd dword ptr [r28 + 4*r29 + 291], r22d, r18d
# ATT: cmpexadd %r18d, %r22d, 291(%r28,%r29,4)
# INTEL: cmpexadd dword ptr [r28 + 4*r29 + 291], r22d, r18d
0x62,0x8a,0x69,0x00,0xe4,0xb4,0xac,0x23,0x01,0x00,0x00

# ATT: cmpzxadd %r19, %r23, 291(%r28,%r29,4)
# INTEL: cmpzxadd qword ptr [r28 + 4*r29 + 291], r23, r19
# ATT: cmpexadd %r19, %r23, 291(%r28,%r29,4)
# INTEL: cmpexadd qword ptr [r28 + 4*r29 + 291], r23, r19
0x62,0x8a,0xe1,0x00,0xe4,0xbc,0xac,0x23,0x01,0x00,0x00

# ATT: cmpnlxadd %ecx, %edx, 123(%rax,%rbx,4)
# INTEL: cmpnlxadd dword ptr [rax + 4*rbx + 123], edx, ecx
# ATT: cmpgexadd %ecx, %edx, 123(%rax,%rbx,4)
# INTEL: cmpgexadd dword ptr [rax + 4*rbx + 123], edx, ecx
0x62,0xf2,0x75,0x08,0xed,0x54,0x98,0x7b

# ATT: cmpnlxadd %r9, %r15, 123(%rax,%rbx,4)
# INTEL: cmpnlxadd qword ptr [rax + 4*rbx + 123], r15, r9
# ATT: cmpgexadd %r9, %r15, 123(%rax,%rbx,4)
# INTEL: cmpgexadd qword ptr [rax + 4*rbx + 123], r15, r9
0x62,0x72,0xb5,0x08,0xed,0x7c,0x98,0x7b

# ATT: cmpnlxadd %r18d, %r22d, 291(%r28,%r29,4)
# INTEL: cmpnlxadd dword ptr [r28 + 4*r29 + 291], r22d, r18d
# ATT: cmpgexadd %r18d, %r22d, 291(%r28,%r29,4)
# INTEL: cmpgexadd dword ptr [r28 + 4*r29 + 291], r22d, r18d
0x62,0x8a,0x69,0x00,0xed,0xb4,0xac,0x23,0x01,0x00,0x00

# ATT: cmpnlxadd %r19, %r23, 291(%r28,%r29,4)
# INTEL: cmpnlxadd qword ptr [r28 + 4*r29 + 291], r23, r19
# ATT: cmpgexadd %r19, %r23, 291(%r28,%r29,4)
# INTEL: cmpgexadd qword ptr [r28 + 4*r29 + 291], r23, r19
0x62,0x8a,0xe1,0x00,0xed,0xbc,0xac,0x23,0x01,0x00,0x00

# ATT: cmpnlexadd %ecx, %edx, 123(%rax,%rbx,4)
# INTEL: cmpnlexadd dword ptr [rax + 4*rbx + 123], edx, ecx
# ATT: cmpgxadd %ecx, %edx, 123(%rax,%rbx,4)
# INTEL: cmpgxadd dword ptr [rax + 4*rbx + 123], edx, ecx
0x62,0xf2,0x75,0x08,0xef,0x54,0x98,0x7b

# ATT: cmpnlexadd %r9, %r15, 123(%rax,%rbx,4)
# INTEL: cmpnlexadd qword ptr [rax + 4*rbx + 123], r15, r9
# ATT: cmpgxadd %r9, %r15, 123(%rax,%rbx,4)
# INTEL: cmpgxadd qword ptr [rax + 4*rbx + 123], r15, r9
0x62,0x72,0xb5,0x08,0xef,0x7c,0x98,0x7b

# ATT: cmpnlexadd %r18d, %r22d, 291(%r28,%r29,4)
# INTEL: cmpnlexadd dword ptr [r28 + 4*r29 + 291], r22d, r18d
# ATT: cmpgxadd %r18d, %r22d, 291(%r28,%r29,4)
# INTEL: cmpgxadd dword ptr [r28 + 4*r29 + 291], r22d, r18d
0x62,0x8a,0x69,0x00,0xef,0xb4,0xac,0x23,0x01,0x00,0x00

# ATT: cmpnlexadd %r19, %r23, 291(%r28,%r29,4)
# INTEL: cmpnlexadd qword ptr [r28 + 4*r29 + 291], r23, r19
# ATT: cmpgxadd %r19, %r23, 291(%r28,%r29,4)
# INTEL: cmpgxadd qword ptr [r28 + 4*r29 + 291], r23, r19
0x62,0x8a,0xe1,0x00,0xef,0xbc,0xac,0x23,0x01,0x00,0x00

# ATT: cmplexadd %ecx, %edx, 123(%rax,%rbx,4)
Expand Down Expand Up @@ -129,20 +129,20 @@
# INTEL: cmplxadd qword ptr [r28 + 4*r29 + 291], r23, r19
0x62,0x8a,0xe1,0x00,0xec,0xbc,0xac,0x23,0x01,0x00,0x00

# ATT: cmpnzxadd %ecx, %edx, 123(%rax,%rbx,4)
# INTEL: cmpnzxadd dword ptr [rax + 4*rbx + 123], edx, ecx
# ATT: cmpnexadd %ecx, %edx, 123(%rax,%rbx,4)
# INTEL: cmpnexadd dword ptr [rax + 4*rbx + 123], edx, ecx
0x62,0xf2,0x75,0x08,0xe5,0x54,0x98,0x7b

# ATT: cmpnzxadd %r9, %r15, 123(%rax,%rbx,4)
# INTEL: cmpnzxadd qword ptr [rax + 4*rbx + 123], r15, r9
# ATT: cmpnexadd %r9, %r15, 123(%rax,%rbx,4)
# INTEL: cmpnexadd qword ptr [rax + 4*rbx + 123], r15, r9
0x62,0x72,0xb5,0x08,0xe5,0x7c,0x98,0x7b

# ATT: cmpnzxadd %r18d, %r22d, 291(%r28,%r29,4)
# INTEL: cmpnzxadd dword ptr [r28 + 4*r29 + 291], r22d, r18d
# ATT: cmpnexadd %r18d, %r22d, 291(%r28,%r29,4)
# INTEL: cmpnexadd dword ptr [r28 + 4*r29 + 291], r22d, r18d
0x62,0x8a,0x69,0x00,0xe5,0xb4,0xac,0x23,0x01,0x00,0x00

# ATT: cmpnzxadd %r19, %r23, 291(%r28,%r29,4)
# INTEL: cmpnzxadd qword ptr [r28 + 4*r29 + 291], r23, r19
# ATT: cmpnexadd %r19, %r23, 291(%r28,%r29,4)
# INTEL: cmpnexadd qword ptr [r28 + 4*r29 + 291], r23, r19
0x62,0x8a,0xe1,0x00,0xe5,0xbc,0xac,0x23,0x01,0x00,0x00

# ATT: cmpnoxadd %ecx, %edx, 123(%rax,%rbx,4)
Expand Down
288 changes: 144 additions & 144 deletions llvm/test/MC/Disassembler/X86/cmpccxadd-64.txt

Large diffs are not rendered by default.

80 changes: 40 additions & 40 deletions llvm/test/MC/X86/apx/cmpccxadd-att.s
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,21 @@

# ERROR-COUNT-60: error:
# ERROR-NOT: error:
# CHECK: {evex} cmpnbexadd %ecx, %edx, 123(%eax,%ebx,4)
# CHECK: {evex} cmpaxadd %ecx, %edx, 123(%eax,%ebx,4)
# CHECK: encoding: [0x67,0x62,0xf2,0x75,0x08,0xe7,0x54,0x98,0x7b]
{evex} cmpnbexadd %ecx, %edx, 123(%eax,%ebx,4)
{evex} cmpaxadd %ecx, %edx, 123(%eax,%ebx,4)

# CHECK: {evex} cmpnbexadd %r9, %r15, 123(%rax,%rbx,4)
# CHECK: {evex} cmpaxadd %r9, %r15, 123(%rax,%rbx,4)
# CHECK: encoding: [0x62,0x72,0xb5,0x08,0xe7,0x7c,0x98,0x7b]
{evex} cmpnbexadd %r9, %r15, 123(%rax,%rbx,4)
{evex} cmpaxadd %r9, %r15, 123(%rax,%rbx,4)

# CHECK: cmpnbexadd %r18d, %r22d, 291(%r28,%r29,4)
# CHECK: cmpaxadd %r18d, %r22d, 291(%r28,%r29,4)
# CHECK: encoding: [0x62,0x8a,0x69,0x00,0xe7,0xb4,0xac,0x23,0x01,0x00,0x00]
cmpnbexadd %r18d, %r22d, 291(%r28,%r29,4)
cmpaxadd %r18d, %r22d, 291(%r28,%r29,4)

# CHECK: cmpnbexadd %r19, %r23, 291(%r28,%r29,4)
# CHECK: cmpaxadd %r19, %r23, 291(%r28,%r29,4)
# CHECK: encoding: [0x62,0x8a,0xe1,0x00,0xe7,0xbc,0xac,0x23,0x01,0x00,0x00]
cmpnbexadd %r19, %r23, 291(%r28,%r29,4)
cmpaxadd %r19, %r23, 291(%r28,%r29,4)

# CHECK: {evex} cmpbexadd %ecx, %edx, 123(%rax,%rbx,4)
# CHECK: encoding: [0x62,0xf2,0x75,0x08,0xe6,0x54,0x98,0x7b]
Expand Down Expand Up @@ -51,53 +51,53 @@
# CHECK: encoding: [0x62,0x8a,0xe1,0x00,0xe2,0xbc,0xac,0x23,0x01,0x00,0x00]
cmpbxadd %r19, %r23, 291(%r28,%r29,4)

# CHECK: {evex} cmpzxadd %ecx, %edx, 123(%rax,%rbx,4)
# CHECK: {evex} cmpexadd %ecx, %edx, 123(%rax,%rbx,4)
# CHECK: encoding: [0x62,0xf2,0x75,0x08,0xe4,0x54,0x98,0x7b]
{evex} cmpzxadd %ecx, %edx, 123(%rax,%rbx,4)
{evex} cmpexadd %ecx, %edx, 123(%rax,%rbx,4)

# CHECK: {evex} cmpzxadd %r9, %r15, 123(%rax,%rbx,4)
# CHECK: {evex} cmpexadd %r9, %r15, 123(%rax,%rbx,4)
# CHECK: encoding: [0x62,0x72,0xb5,0x08,0xe4,0x7c,0x98,0x7b]
{evex} cmpzxadd %r9, %r15, 123(%rax,%rbx,4)
{evex} cmpexadd %r9, %r15, 123(%rax,%rbx,4)

# CHECK: cmpzxadd %r18d, %r22d, 291(%r28,%r29,4)
# CHECK: cmpexadd %r18d, %r22d, 291(%r28,%r29,4)
# CHECK: encoding: [0x62,0x8a,0x69,0x00,0xe4,0xb4,0xac,0x23,0x01,0x00,0x00]
cmpzxadd %r18d, %r22d, 291(%r28,%r29,4)
cmpexadd %r18d, %r22d, 291(%r28,%r29,4)

# CHECK: cmpzxadd %r19, %r23, 291(%r28,%r29,4)
# CHECK: cmpexadd %r19, %r23, 291(%r28,%r29,4)
# CHECK: encoding: [0x62,0x8a,0xe1,0x00,0xe4,0xbc,0xac,0x23,0x01,0x00,0x00]
cmpzxadd %r19, %r23, 291(%r28,%r29,4)
cmpexadd %r19, %r23, 291(%r28,%r29,4)

# CHECK: {evex} cmpnlxadd %ecx, %edx, 123(%rax,%rbx,4)
# CHECK: {evex} cmpgexadd %ecx, %edx, 123(%rax,%rbx,4)
# CHECK: encoding: [0x62,0xf2,0x75,0x08,0xed,0x54,0x98,0x7b]
{evex} cmpnlxadd %ecx, %edx, 123(%rax,%rbx,4)
{evex} cmpgexadd %ecx, %edx, 123(%rax,%rbx,4)

# CHECK: {evex} cmpnlxadd %r9, %r15, 123(%rax,%rbx,4)
# CHECK: {evex} cmpgexadd %r9, %r15, 123(%rax,%rbx,4)
# CHECK: encoding: [0x62,0x72,0xb5,0x08,0xed,0x7c,0x98,0x7b]
{evex} cmpnlxadd %r9, %r15, 123(%rax,%rbx,4)
{evex} cmpgexadd %r9, %r15, 123(%rax,%rbx,4)

# CHECK: cmpnlxadd %r18d, %r22d, 291(%r28,%r29,4)
# CHECK: cmpgexadd %r18d, %r22d, 291(%r28,%r29,4)
# CHECK: encoding: [0x62,0x8a,0x69,0x00,0xed,0xb4,0xac,0x23,0x01,0x00,0x00]
cmpnlxadd %r18d, %r22d, 291(%r28,%r29,4)
cmpgexadd %r18d, %r22d, 291(%r28,%r29,4)

# CHECK: cmpnlxadd %r19, %r23, 291(%r28,%r29,4)
# CHECK: cmpgexadd %r19, %r23, 291(%r28,%r29,4)
# CHECK: encoding: [0x62,0x8a,0xe1,0x00,0xed,0xbc,0xac,0x23,0x01,0x00,0x00]
cmpnlxadd %r19, %r23, 291(%r28,%r29,4)
cmpgexadd %r19, %r23, 291(%r28,%r29,4)

# CHECK: {evex} cmpnlexadd %ecx, %edx, 123(%rax,%rbx,4)
# CHECK: {evex} cmpgxadd %ecx, %edx, 123(%rax,%rbx,4)
# CHECK: encoding: [0x62,0xf2,0x75,0x08,0xef,0x54,0x98,0x7b]
{evex} cmpnlexadd %ecx, %edx, 123(%rax,%rbx,4)
{evex} cmpgxadd %ecx, %edx, 123(%rax,%rbx,4)

# CHECK: {evex} cmpnlexadd %r9, %r15, 123(%rax,%rbx,4)
# CHECK: {evex} cmpgxadd %r9, %r15, 123(%rax,%rbx,4)
# CHECK: encoding: [0x62,0x72,0xb5,0x08,0xef,0x7c,0x98,0x7b]
{evex} cmpnlexadd %r9, %r15, 123(%rax,%rbx,4)
{evex} cmpgxadd %r9, %r15, 123(%rax,%rbx,4)

# CHECK: cmpnlexadd %r18d, %r22d, 291(%r28,%r29,4)
# CHECK: cmpgxadd %r18d, %r22d, 291(%r28,%r29,4)
# CHECK: encoding: [0x62,0x8a,0x69,0x00,0xef,0xb4,0xac,0x23,0x01,0x00,0x00]
cmpnlexadd %r18d, %r22d, 291(%r28,%r29,4)
cmpgxadd %r18d, %r22d, 291(%r28,%r29,4)

# CHECK: cmpnlexadd %r19, %r23, 291(%r28,%r29,4)
# CHECK: cmpgxadd %r19, %r23, 291(%r28,%r29,4)
# CHECK: encoding: [0x62,0x8a,0xe1,0x00,0xef,0xbc,0xac,0x23,0x01,0x00,0x00]
cmpnlexadd %r19, %r23, 291(%r28,%r29,4)
cmpgxadd %r19, %r23, 291(%r28,%r29,4)

# CHECK: {evex} cmplexadd %ecx, %edx, 123(%rax,%rbx,4)
# CHECK: encoding: [0x62,0xf2,0x75,0x08,0xee,0x54,0x98,0x7b]
Expand Down Expand Up @@ -131,21 +131,21 @@
# CHECK: encoding: [0x62,0x8a,0xe1,0x00,0xec,0xbc,0xac,0x23,0x01,0x00,0x00]
cmplxadd %r19, %r23, 291(%r28,%r29,4)

# CHECK: {evex} cmpnzxadd %ecx, %edx, 123(%rax,%rbx,4)
# CHECK: {evex} cmpnexadd %ecx, %edx, 123(%rax,%rbx,4)
# CHECK: encoding: [0x62,0xf2,0x75,0x08,0xe5,0x54,0x98,0x7b]
{evex} cmpnzxadd %ecx, %edx, 123(%rax,%rbx,4)
{evex} cmpnexadd %ecx, %edx, 123(%rax,%rbx,4)

# CHECK: {evex} cmpnzxadd %r9, %r15, 123(%rax,%rbx,4)
# CHECK: {evex} cmpnexadd %r9, %r15, 123(%rax,%rbx,4)
# CHECK: encoding: [0x62,0x72,0xb5,0x08,0xe5,0x7c,0x98,0x7b]
{evex} cmpnzxadd %r9, %r15, 123(%rax,%rbx,4)
{evex} cmpnexadd %r9, %r15, 123(%rax,%rbx,4)

# CHECK: cmpnzxadd %r18d, %r22d, 291(%r28,%r29,4)
# CHECK: cmpnexadd %r18d, %r22d, 291(%r28,%r29,4)
# CHECK: encoding: [0x62,0x8a,0x69,0x00,0xe5,0xb4,0xac,0x23,0x01,0x00,0x00]
cmpnzxadd %r18d, %r22d, 291(%r28,%r29,4)
cmpnexadd %r18d, %r22d, 291(%r28,%r29,4)

# CHECK: cmpnzxadd %r19, %r23, 291(%r28,%r29,4)
# CHECK: cmpnexadd %r19, %r23, 291(%r28,%r29,4)
# CHECK: encoding: [0x62,0x8a,0xe1,0x00,0xe5,0xbc,0xac,0x23,0x01,0x00,0x00]
cmpnzxadd %r19, %r23, 291(%r28,%r29,4)
cmpnexadd %r19, %r23, 291(%r28,%r29,4)

# CHECK: {evex} cmpnoxadd %ecx, %edx, 123(%rax,%rbx,4)
# CHECK: encoding: [0x62,0xf2,0x75,0x08,0xe1,0x54,0x98,0x7b]
Expand Down
80 changes: 40 additions & 40 deletions llvm/test/MC/X86/apx/cmpccxadd-intel.s
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
# RUN: llvm-mc -triple x86_64 -x86-asm-syntax=intel -output-asm-variant=1 --show-encoding %s | FileCheck %s

# CHECK: {evex} cmpnbexadd dword ptr [rax + 4*rbx + 123], edx, ecx
# CHECK: {evex} cmpaxadd dword ptr [rax + 4*rbx + 123], edx, ecx
# CHECK: encoding: [0x62,0xf2,0x75,0x08,0xe7,0x54,0x98,0x7b]
{evex} cmpnbexadd dword ptr [rax + 4*rbx + 123], edx, ecx
{evex} cmpaxadd dword ptr [rax + 4*rbx + 123], edx, ecx

# CHECK: {evex} cmpnbexadd qword ptr [rax + 4*rbx + 123], r15, r9
# CHECK: {evex} cmpaxadd qword ptr [rax + 4*rbx + 123], r15, r9
# CHECK: encoding: [0x62,0x72,0xb5,0x08,0xe7,0x7c,0x98,0x7b]
{evex} cmpnbexadd qword ptr [rax + 4*rbx + 123], r15, r9
{evex} cmpaxadd qword ptr [rax + 4*rbx + 123], r15, r9

# CHECK: cmpnbexadd dword ptr [r28 + 4*r29 + 291], r22d, r18d
# CHECK: cmpaxadd dword ptr [r28 + 4*r29 + 291], r22d, r18d
# CHECK: encoding: [0x62,0x8a,0x69,0x00,0xe7,0xb4,0xac,0x23,0x01,0x00,0x00]
cmpnbexadd dword ptr [r28 + 4*r29 + 291], r22d, r18d
cmpaxadd dword ptr [r28 + 4*r29 + 291], r22d, r18d

# CHECK: cmpnbexadd qword ptr [r28 + 4*r29 + 291], r23, r19
# CHECK: cmpaxadd qword ptr [r28 + 4*r29 + 291], r23, r19
# CHECK: encoding: [0x62,0x8a,0xe1,0x00,0xe7,0xbc,0xac,0x23,0x01,0x00,0x00]
cmpnbexadd qword ptr [r28 + 4*r29 + 291], r23, r19
cmpaxadd qword ptr [r28 + 4*r29 + 291], r23, r19

# CHECK: {evex} cmpbexadd dword ptr [rax + 4*rbx + 123], edx, ecx
# CHECK: encoding: [0x62,0xf2,0x75,0x08,0xe6,0x54,0x98,0x7b]
Expand Down Expand Up @@ -48,53 +48,53 @@
# CHECK: encoding: [0x62,0x8a,0xe1,0x00,0xe2,0xbc,0xac,0x23,0x01,0x00,0x00]
cmpbxadd qword ptr [r28 + 4*r29 + 291], r23, r19

# CHECK: {evex} cmpzxadd dword ptr [rax + 4*rbx + 123], edx, ecx
# CHECK: {evex} cmpexadd dword ptr [rax + 4*rbx + 123], edx, ecx
# CHECK: encoding: [0x62,0xf2,0x75,0x08,0xe4,0x54,0x98,0x7b]
{evex} cmpzxadd dword ptr [rax + 4*rbx + 123], edx, ecx
{evex} cmpexadd dword ptr [rax + 4*rbx + 123], edx, ecx

# CHECK: {evex} cmpzxadd qword ptr [rax + 4*rbx + 123], r15, r9
# CHECK: {evex} cmpexadd qword ptr [rax + 4*rbx + 123], r15, r9
# CHECK: encoding: [0x62,0x72,0xb5,0x08,0xe4,0x7c,0x98,0x7b]
{evex} cmpzxadd qword ptr [rax + 4*rbx + 123], r15, r9
{evex} cmpexadd qword ptr [rax + 4*rbx + 123], r15, r9

# CHECK: cmpzxadd dword ptr [r28 + 4*r29 + 291], r22d, r18d
# CHECK: cmpexadd dword ptr [r28 + 4*r29 + 291], r22d, r18d
# CHECK: encoding: [0x62,0x8a,0x69,0x00,0xe4,0xb4,0xac,0x23,0x01,0x00,0x00]
cmpzxadd dword ptr [r28 + 4*r29 + 291], r22d, r18d
cmpexadd dword ptr [r28 + 4*r29 + 291], r22d, r18d

# CHECK: cmpzxadd qword ptr [r28 + 4*r29 + 291], r23, r19
# CHECK: cmpexadd qword ptr [r28 + 4*r29 + 291], r23, r19
# CHECK: encoding: [0x62,0x8a,0xe1,0x00,0xe4,0xbc,0xac,0x23,0x01,0x00,0x00]
cmpzxadd qword ptr [r28 + 4*r29 + 291], r23, r19
cmpexadd qword ptr [r28 + 4*r29 + 291], r23, r19

# CHECK: {evex} cmpnlxadd dword ptr [rax + 4*rbx + 123], edx, ecx
# CHECK: {evex} cmpgexadd dword ptr [rax + 4*rbx + 123], edx, ecx
# CHECK: encoding: [0x62,0xf2,0x75,0x08,0xed,0x54,0x98,0x7b]
{evex} cmpnlxadd dword ptr [rax + 4*rbx + 123], edx, ecx
{evex} cmpgexadd dword ptr [rax + 4*rbx + 123], edx, ecx

# CHECK: {evex} cmpnlxadd qword ptr [rax + 4*rbx + 123], r15, r9
# CHECK: {evex} cmpgexadd qword ptr [rax + 4*rbx + 123], r15, r9
# CHECK: encoding: [0x62,0x72,0xb5,0x08,0xed,0x7c,0x98,0x7b]
{evex} cmpnlxadd qword ptr [rax + 4*rbx + 123], r15, r9
{evex} cmpgexadd qword ptr [rax + 4*rbx + 123], r15, r9

# CHECK: cmpnlxadd dword ptr [r28 + 4*r29 + 291], r22d, r18d
# CHECK: cmpgexadd dword ptr [r28 + 4*r29 + 291], r22d, r18d
# CHECK: encoding: [0x62,0x8a,0x69,0x00,0xed,0xb4,0xac,0x23,0x01,0x00,0x00]
cmpnlxadd dword ptr [r28 + 4*r29 + 291], r22d, r18d
cmpgexadd dword ptr [r28 + 4*r29 + 291], r22d, r18d

# CHECK: cmpnlxadd qword ptr [r28 + 4*r29 + 291], r23, r19
# CHECK: cmpgexadd qword ptr [r28 + 4*r29 + 291], r23, r19
# CHECK: encoding: [0x62,0x8a,0xe1,0x00,0xed,0xbc,0xac,0x23,0x01,0x00,0x00]
cmpnlxadd qword ptr [r28 + 4*r29 + 291], r23, r19
cmpgexadd qword ptr [r28 + 4*r29 + 291], r23, r19

# CHECK: {evex} cmpnlexadd dword ptr [rax + 4*rbx + 123], edx, ecx
# CHECK: {evex} cmpgxadd dword ptr [rax + 4*rbx + 123], edx, ecx
# CHECK: encoding: [0x62,0xf2,0x75,0x08,0xef,0x54,0x98,0x7b]
{evex} cmpnlexadd dword ptr [rax + 4*rbx + 123], edx, ecx
{evex} cmpgxadd dword ptr [rax + 4*rbx + 123], edx, ecx

# CHECK: {evex} cmpnlexadd qword ptr [rax + 4*rbx + 123], r15, r9
# CHECK: {evex} cmpgxadd qword ptr [rax + 4*rbx + 123], r15, r9
# CHECK: encoding: [0x62,0x72,0xb5,0x08,0xef,0x7c,0x98,0x7b]
{evex} cmpnlexadd qword ptr [rax + 4*rbx + 123], r15, r9
{evex} cmpgxadd qword ptr [rax + 4*rbx + 123], r15, r9

# CHECK: cmpnlexadd dword ptr [r28 + 4*r29 + 291], r22d, r18d
# CHECK: cmpgxadd dword ptr [r28 + 4*r29 + 291], r22d, r18d
# CHECK: encoding: [0x62,0x8a,0x69,0x00,0xef,0xb4,0xac,0x23,0x01,0x00,0x00]
cmpnlexadd dword ptr [r28 + 4*r29 + 291], r22d, r18d
cmpgxadd dword ptr [r28 + 4*r29 + 291], r22d, r18d

# CHECK: cmpnlexadd qword ptr [r28 + 4*r29 + 291], r23, r19
# CHECK: cmpgxadd qword ptr [r28 + 4*r29 + 291], r23, r19
# CHECK: encoding: [0x62,0x8a,0xe1,0x00,0xef,0xbc,0xac,0x23,0x01,0x00,0x00]
cmpnlexadd qword ptr [r28 + 4*r29 + 291], r23, r19
cmpgxadd qword ptr [r28 + 4*r29 + 291], r23, r19

# CHECK: {evex} cmplexadd dword ptr [rax + 4*rbx + 123], edx, ecx
# CHECK: encoding: [0x62,0xf2,0x75,0x08,0xee,0x54,0x98,0x7b]
Expand Down Expand Up @@ -128,21 +128,21 @@
# CHECK: encoding: [0x62,0x8a,0xe1,0x00,0xec,0xbc,0xac,0x23,0x01,0x00,0x00]
cmplxadd qword ptr [r28 + 4*r29 + 291], r23, r19

# CHECK: {evex} cmpnzxadd dword ptr [rax + 4*rbx + 123], edx, ecx
# CHECK: {evex} cmpnexadd dword ptr [rax + 4*rbx + 123], edx, ecx
# CHECK: encoding: [0x62,0xf2,0x75,0x08,0xe5,0x54,0x98,0x7b]
{evex} cmpnzxadd dword ptr [rax + 4*rbx + 123], edx, ecx
{evex} cmpnexadd dword ptr [rax + 4*rbx + 123], edx, ecx

# CHECK: {evex} cmpnzxadd qword ptr [rax + 4*rbx + 123], r15, r9
# CHECK: {evex} cmpnexadd qword ptr [rax + 4*rbx + 123], r15, r9
# CHECK: encoding: [0x62,0x72,0xb5,0x08,0xe5,0x7c,0x98,0x7b]
{evex} cmpnzxadd qword ptr [rax + 4*rbx + 123], r15, r9
{evex} cmpnexadd qword ptr [rax + 4*rbx + 123], r15, r9

# CHECK: cmpnzxadd dword ptr [r28 + 4*r29 + 291], r22d, r18d
# CHECK: cmpnexadd dword ptr [r28 + 4*r29 + 291], r22d, r18d
# CHECK: encoding: [0x62,0x8a,0x69,0x00,0xe5,0xb4,0xac,0x23,0x01,0x00,0x00]
cmpnzxadd dword ptr [r28 + 4*r29 + 291], r22d, r18d
cmpnexadd dword ptr [r28 + 4*r29 + 291], r22d, r18d

# CHECK: cmpnzxadd qword ptr [r28 + 4*r29 + 291], r23, r19
# CHECK: cmpnexadd qword ptr [r28 + 4*r29 + 291], r23, r19
# CHECK: encoding: [0x62,0x8a,0xe1,0x00,0xe5,0xbc,0xac,0x23,0x01,0x00,0x00]
cmpnzxadd qword ptr [r28 + 4*r29 + 291], r23, r19
cmpnexadd qword ptr [r28 + 4*r29 + 291], r23, r19

# CHECK: {evex} cmpnoxadd dword ptr [rax + 4*rbx + 123], edx, ecx
# CHECK: encoding: [0x62,0xf2,0x75,0x08,0xe1,0x54,0x98,0x7b]
Expand Down
26 changes: 13 additions & 13 deletions llvm/test/MC/X86/cmpccxadd-att-alias.s
Original file line number Diff line number Diff line change
@@ -1,28 +1,28 @@
// RUN: llvm-mc -triple x86_64 --show-encoding %s | FileCheck %s

// CHECK: cmpnbxadd %eax, %ecx, (%rip)
// CHECK: cmpaexadd %eax, %ecx, (%rip)
// CHECK: encoding: [0xc4,0xe2,0x79,0xe3,0x0d,0x00,0x00,0x00,0x00]
cmpaexadd %eax, %ecx, (%rip)
cmpnbxadd %eax, %ecx, (%rip)

// CHECK: cmpzxadd %eax, %ecx, (%rip)
// CHECK: cmpexadd %eax, %ecx, (%rip)
// CHECK: encoding: [0xc4,0xe2,0x79,0xe4,0x0d,0x00,0x00,0x00,0x00]
cmpexadd %eax, %ecx, (%rip)
cmpzxadd %eax, %ecx, (%rip)

// CHECK: cmpnzxadd %eax, %ecx, (%rip)
// CHECK: cmpnexadd %eax, %ecx, (%rip)
// CHECK: encoding: [0xc4,0xe2,0x79,0xe5,0x0d,0x00,0x00,0x00,0x00]
cmpnexadd %eax, %ecx, (%rip)
cmpnzxadd %eax, %ecx, (%rip)

// CHECK: cmpnbexadd %eax, %ecx, (%rip)
// CHECK: cmpaxadd %eax, %ecx, (%rip)
// CHECK: encoding: [0xc4,0xe2,0x79,0xe7,0x0d,0x00,0x00,0x00,0x00]
cmpaxadd %eax, %ecx, (%rip)
cmpnbexadd %eax, %ecx, (%rip)

// CHECK: cmpnlxadd %eax, %ecx, (%rip)
// CHECK: cmpgexadd %eax, %ecx, (%rip)
// CHECK: encoding: [0xc4,0xe2,0x79,0xed,0x0d,0x00,0x00,0x00,0x00]
cmpgexadd %eax, %ecx, (%rip)
cmpnlxadd %eax, %ecx, (%rip)

// CHECK: cmpnlexadd %eax, %ecx, (%rip)
// CHECK: cmpgxadd %eax, %ecx, (%rip)
// CHECK: encoding: [0xc4,0xe2,0x79,0xef,0x0d,0x00,0x00,0x00,0x00]
cmpgxadd %eax, %ecx, (%rip)
cmpnlexadd %eax, %ecx, (%rip)

// CHECK: cmpbxadd %eax, %ecx, (%rip)
// CHECK: encoding: [0xc4,0xe2,0x79,0xe2,0x0d,0x00,0x00,0x00,0x00]
Expand All @@ -32,7 +32,7 @@
// CHECK: encoding: [0xc4,0xe2,0x79,0xe2,0x0d,0x00,0x00,0x00,0x00]
cmpnaexadd %eax, %ecx, (%rip)

// CHECK: cmpnbxadd %eax, %ecx, (%rip)
// CHECK: cmpaexadd %eax, %ecx, (%rip)
// CHECK: encoding: [0xc4,0xe2,0x79,0xe3,0x0d,0x00,0x00,0x00,0x00]
cmpncxadd %eax, %ecx, (%rip)

Expand Down
Loading