forked from OSchip/llvm-project
Re-land "[VP] vp intrinsics are not speculatable" with test fix
Update the llvmir-intrinsics.mlir test to account for the modified
attribute sets.
This reverts commit 2e2a8a2d90
.
This commit is contained in:
parent
2e2a8a2d90
commit
18c1ee04de
|
@ -463,6 +463,28 @@ constexpr unsigned MaxAnalysisRecursionDepth = 6;
|
|||
const DominatorTree *DT = nullptr,
|
||||
const TargetLibraryInfo *TLI = nullptr);
|
||||
|
||||
/// This returns the same result as isSafeToSpeculativelyExecute if Opcode is
|
||||
/// the actual opcode of Inst. If the provided and actual opcode differ, the
|
||||
/// function (virtually) overrides the opcode of Inst with the provided
|
||||
/// Opcode. There are come constraints in this case:
|
||||
/// * If Opcode has a fixed number of operands (eg, as binary operators do),
|
||||
/// then Inst has to have at least as many leading operands. The function
|
||||
/// will ignore all trailing operands beyond that number.
|
||||
/// * If Opcode allows for an arbitrary number of operands (eg, as CallInsts
|
||||
/// do), then all operands are considered.
|
||||
/// * The virtual instruction has to satisfy all typing rules of the provided
|
||||
/// Opcode.
|
||||
/// * This function is pessimistic in the following sense: If one actually
|
||||
/// materialized the virtual instruction, then isSafeToSpeculativelyExecute
|
||||
/// may say that the materialized instruction is speculatable whereas this
|
||||
/// function may have said that the instruction wouldn't be speculatable.
|
||||
/// This behavior is a shortcoming in the current implementation and not
|
||||
/// intentional.
|
||||
bool isSafeToSpeculativelyExecuteWithOpcode(
|
||||
unsigned Opcode, const Operator *Inst, const Instruction *CtxI = nullptr,
|
||||
const DominatorTree *DT = nullptr,
|
||||
const TargetLibraryInfo *TLI = nullptr);
|
||||
|
||||
/// Returns true if the result or effects of the given instructions \p I
|
||||
/// depend values not reachable through the def use graph.
|
||||
/// * Memory dependence arises for example if the instruction reads from
|
||||
|
|
|
@ -1415,11 +1415,11 @@ def int_vp_gather: DefaultAttrsIntrinsic<[ llvm_anyvector_ty],
|
|||
[ IntrReadMem, IntrNoSync, IntrWillReturn, IntrArgMemOnly ]>;
|
||||
|
||||
def int_vp_scatter: DefaultAttrsIntrinsic<[],
|
||||
[ llvm_anyvector_ty,
|
||||
LLVMVectorOfAnyPointersToElt<0>,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty],
|
||||
[ IntrArgMemOnly, IntrNoSync, IntrWillReturn ]>; // TODO allow IntrNoCapture for vectors of pointers
|
||||
[ llvm_anyvector_ty,
|
||||
LLVMVectorOfAnyPointersToElt<0>,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty],
|
||||
[ IntrArgMemOnly, IntrNoSync, IntrWillReturn ]>; // TODO allow IntrNoCapture for vectors of pointers
|
||||
|
||||
// Experimental strided memory accesses
|
||||
def int_experimental_vp_strided_store : DefaultAttrsIntrinsic<[],
|
||||
|
@ -1437,8 +1437,9 @@ def int_experimental_vp_strided_load : DefaultAttrsIntrinsic<[llvm_anyvector_ty
|
|||
llvm_i32_ty],
|
||||
[ NoCapture<ArgIndex<0>>, IntrNoSync, IntrReadMem, IntrWillReturn, IntrArgMemOnly ]>;
|
||||
|
||||
// Speculatable Binary operators
|
||||
let IntrProperties = [IntrSpeculatable, IntrNoMem, IntrNoSync, IntrWillReturn] in {
|
||||
// Operators
|
||||
let IntrProperties = [IntrNoMem, IntrNoSync, IntrWillReturn] in {
|
||||
// Integer arithmetic
|
||||
def int_vp_add : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
|
@ -1450,30 +1451,30 @@ let IntrProperties = [IntrSpeculatable, IntrNoMem, IntrNoSync, IntrWillReturn] i
|
|||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_mul : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
[ LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_ashr : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
[ LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_lshr : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
[ LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_shl : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_or : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
[ LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_and : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
|
@ -1484,35 +1485,28 @@ let IntrProperties = [IntrSpeculatable, IntrNoMem, IntrNoSync, IntrWillReturn] i
|
|||
LLVMMatchType<0>,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
}
|
||||
|
||||
// Non-speculatable binary operators.
|
||||
let IntrProperties = [IntrNoMem, IntrNoSync, IntrWillReturn] in {
|
||||
def int_vp_sdiv : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
[ LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_udiv : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
[ LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_srem : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
[ LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_urem : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
}
|
||||
[ LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
|
||||
// Floating-point arithmetic.
|
||||
let IntrProperties =
|
||||
[IntrSpeculatable, IntrNoMem, IntrNoSync, IntrWillReturn] in {
|
||||
// Floating-point arithmetic
|
||||
def int_vp_fadd : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
|
@ -1524,177 +1518,169 @@ let IntrProperties =
|
|||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_fmul : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
[ LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_fdiv : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
[ LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_frem : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
|
||||
[ LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_fneg : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ LLVMMatchType<0>,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
|
||||
[ LLVMMatchType<0>,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_fma : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
}
|
||||
[ LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
|
||||
// Casts.
|
||||
def int_vp_trunc : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_zext : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_sext : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_fptrunc : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_fpext : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_fptoui : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_fptosi : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_uitofp : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_sitofp : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_ptrtoint : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_inttoptr : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
// Casts
|
||||
def int_vp_trunc : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_zext : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_sext : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_fptrunc : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_fpext : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_fptoui : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_fptosi : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_uitofp : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_sitofp : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_ptrtoint : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_inttoptr : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
|
||||
// Shuffles.
|
||||
def int_vp_select : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
llvm_i32_ty]>;
|
||||
// Shuffles
|
||||
def int_vp_select : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_merge : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
llvm_i32_ty]>;
|
||||
|
||||
def int_vp_merge : DefaultAttrsIntrinsic<[ llvm_anyvector_ty ],
|
||||
[ LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
LLVMMatchType<0>,
|
||||
LLVMMatchType<0>,
|
||||
llvm_i32_ty]>;
|
||||
|
||||
// Comparisons.
|
||||
let IntrProperties = [IntrNoMem, IntrNoSync, IntrWillReturn] in {
|
||||
// Comparisons
|
||||
def int_vp_fcmp : DefaultAttrsIntrinsic<[ LLVMScalarOrSameVectorWidth<0, llvm_i1_ty> ],
|
||||
[ llvm_anyvector_ty,
|
||||
LLVMMatchType<0>,
|
||||
llvm_metadata_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
|
||||
[ llvm_anyvector_ty,
|
||||
LLVMMatchType<0>,
|
||||
llvm_metadata_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_icmp : DefaultAttrsIntrinsic<[ LLVMScalarOrSameVectorWidth<0, llvm_i1_ty> ],
|
||||
[ llvm_anyvector_ty,
|
||||
LLVMMatchType<0>,
|
||||
llvm_metadata_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
}
|
||||
[ llvm_anyvector_ty,
|
||||
LLVMMatchType<0>,
|
||||
llvm_metadata_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
|
||||
// Reductions
|
||||
let IntrProperties = [IntrSpeculatable, IntrNoMem, IntrNoSync, IntrWillReturn] in {
|
||||
// Reductions
|
||||
def int_vp_reduce_fadd : DefaultAttrsIntrinsic<[LLVMVectorElementType<0>],
|
||||
[LLVMVectorElementType<0>,
|
||||
llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
[ LLVMVectorElementType<0>,
|
||||
llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_reduce_fmul : DefaultAttrsIntrinsic<[LLVMVectorElementType<0>],
|
||||
[LLVMVectorElementType<0>,
|
||||
llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
[ LLVMVectorElementType<0>,
|
||||
llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_reduce_add : DefaultAttrsIntrinsic<[LLVMVectorElementType<0>],
|
||||
[LLVMVectorElementType<0>,
|
||||
llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
[ LLVMVectorElementType<0>,
|
||||
llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_reduce_mul : DefaultAttrsIntrinsic<[LLVMVectorElementType<0>],
|
||||
[LLVMVectorElementType<0>,
|
||||
llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
[ LLVMVectorElementType<0>,
|
||||
llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_reduce_and : DefaultAttrsIntrinsic<[LLVMVectorElementType<0>],
|
||||
[LLVMVectorElementType<0>,
|
||||
llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
[ LLVMVectorElementType<0>,
|
||||
llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_reduce_or : DefaultAttrsIntrinsic<[LLVMVectorElementType<0>],
|
||||
[LLVMVectorElementType<0>,
|
||||
llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
[ LLVMVectorElementType<0>,
|
||||
llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_reduce_xor : DefaultAttrsIntrinsic<[LLVMVectorElementType<0>],
|
||||
[LLVMVectorElementType<0>,
|
||||
llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
[ LLVMVectorElementType<0>,
|
||||
llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_reduce_smax : DefaultAttrsIntrinsic<[LLVMVectorElementType<0>],
|
||||
[LLVMVectorElementType<0>,
|
||||
llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
[ LLVMVectorElementType<0>,
|
||||
llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_reduce_smin : DefaultAttrsIntrinsic<[LLVMVectorElementType<0>],
|
||||
[LLVMVectorElementType<0>,
|
||||
llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
[ LLVMVectorElementType<0>,
|
||||
llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_reduce_umax : DefaultAttrsIntrinsic<[LLVMVectorElementType<0>],
|
||||
[LLVMVectorElementType<0>,
|
||||
llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
[ LLVMVectorElementType<0>,
|
||||
llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_reduce_umin : DefaultAttrsIntrinsic<[LLVMVectorElementType<0>],
|
||||
[LLVMVectorElementType<0>,
|
||||
llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
[ LLVMVectorElementType<0>,
|
||||
llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_reduce_fmax : DefaultAttrsIntrinsic<[LLVMVectorElementType<0>],
|
||||
[LLVMVectorElementType<0>,
|
||||
llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
[ LLVMVectorElementType<0>,
|
||||
llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
def int_vp_reduce_fmin : DefaultAttrsIntrinsic<[LLVMVectorElementType<0>],
|
||||
[LLVMVectorElementType<0>,
|
||||
llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
[ LLVMVectorElementType<0>,
|
||||
llvm_anyvector_ty,
|
||||
LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>,
|
||||
llvm_i32_ty]>;
|
||||
}
|
||||
|
||||
def int_get_active_lane_mask:
|
||||
|
|
|
@ -4599,13 +4599,38 @@ bool llvm::isSafeToSpeculativelyExecute(const Value *V,
|
|||
const Operator *Inst = dyn_cast<Operator>(V);
|
||||
if (!Inst)
|
||||
return false;
|
||||
return isSafeToSpeculativelyExecuteWithOpcode(Inst->getOpcode(), Inst, CtxI, DT, TLI);
|
||||
}
|
||||
|
||||
bool llvm::isSafeToSpeculativelyExecuteWithOpcode(unsigned Opcode,
|
||||
const Operator *Inst,
|
||||
const Instruction *CtxI,
|
||||
const DominatorTree *DT,
|
||||
const TargetLibraryInfo *TLI) {
|
||||
if (Inst->getOpcode() != Opcode) {
|
||||
// Check that the operands are actually compatible with the Opcode override.
|
||||
auto hasEqualReturnAndLeadingOperandTypes =
|
||||
[](const Operator *Inst, unsigned NumLeadingOperands) {
|
||||
if (Inst->getNumOperands() < NumLeadingOperands)
|
||||
return false;
|
||||
const Type *ExpectedType = Inst->getType();
|
||||
for (unsigned ItOp = 0; ItOp < NumLeadingOperands; ++ItOp)
|
||||
if (Inst->getOperand(ItOp)->getType() != ExpectedType)
|
||||
return false;
|
||||
return true;
|
||||
};
|
||||
assert(!Instruction::isBinaryOp(Opcode) ||
|
||||
hasEqualReturnAndLeadingOperandTypes(Inst, 2));
|
||||
assert(!Instruction::isUnaryOp(Opcode) ||
|
||||
hasEqualReturnAndLeadingOperandTypes(Inst, 1));
|
||||
}
|
||||
|
||||
for (unsigned i = 0, e = Inst->getNumOperands(); i != e; ++i)
|
||||
if (Constant *C = dyn_cast<Constant>(Inst->getOperand(i)))
|
||||
if (C->canTrap())
|
||||
return false;
|
||||
|
||||
switch (Inst->getOpcode()) {
|
||||
switch (Opcode) {
|
||||
default:
|
||||
return true;
|
||||
case Instruction::UDiv:
|
||||
|
@ -4636,7 +4661,9 @@ bool llvm::isSafeToSpeculativelyExecute(const Value *V,
|
|||
return false;
|
||||
}
|
||||
case Instruction::Load: {
|
||||
const LoadInst *LI = cast<LoadInst>(Inst);
|
||||
const LoadInst *LI = dyn_cast<LoadInst>(Inst);
|
||||
if (!LI)
|
||||
return false;
|
||||
if (mustSuppressSpeculation(*LI))
|
||||
return false;
|
||||
const DataLayout &DL = LI->getModule()->getDataLayout();
|
||||
|
@ -4645,7 +4672,9 @@ bool llvm::isSafeToSpeculativelyExecute(const Value *V,
|
|||
TLI);
|
||||
}
|
||||
case Instruction::Call: {
|
||||
auto *CI = cast<const CallInst>(Inst);
|
||||
auto *CI = dyn_cast<const CallInst>(Inst);
|
||||
if (!CI)
|
||||
return false;
|
||||
const Function *Callee = CI->getCalledFunction();
|
||||
|
||||
// The called function could have undefined behavior or side-effects, even
|
||||
|
|
|
@ -118,10 +118,10 @@ static bool maySpeculateLanes(VPIntrinsic &VPI) {
|
|||
if (isa<VPReductionIntrinsic>(VPI))
|
||||
return false;
|
||||
// Fallback to whether the intrinsic is speculatable.
|
||||
// FIXME: Check whether the replacing non-VP code will be speculatable
|
||||
// instead. VP intrinsics themselves are never speculatable because of
|
||||
// UB if %evl is greater than the runtime vector length.
|
||||
return isSafeToSpeculativelyExecute(cast<Operator>(&VPI));
|
||||
Optional<unsigned> OpcOpt = VPI.getFunctionalOpcode();
|
||||
unsigned FunctionalOpc = OpcOpt.getValueOr((unsigned)Instruction::Call);
|
||||
return isSafeToSpeculativelyExecuteWithOpcode(FunctionalOpc,
|
||||
cast<Operator>(&VPI));
|
||||
}
|
||||
|
||||
//// } Helpers
|
||||
|
@ -481,7 +481,7 @@ struct TransformJob {
|
|||
};
|
||||
|
||||
void sanitizeStrategy(VPIntrinsic &VPI, VPLegalization &LegalizeStrat) {
|
||||
// Speculatable instructions do not strictly need predication.
|
||||
// Operations with speculatable lanes do not strictly need predication.
|
||||
if (maySpeculateLanes(VPI)) {
|
||||
// Converting a speculatable VP intrinsic means dropping %mask and %evl.
|
||||
// No need to expand %evl into the %mask only to ignore that code.
|
||||
|
|
|
@ -735,49 +735,49 @@ llvm.func @vector_predication_intrinsics(%A: vector<8xi32>, %B: vector<8xi32>,
|
|||
// CHECK-DAG: declare i1 @llvm.coro.end(i8*, i1)
|
||||
// CHECK-DAG: declare i8* @llvm.coro.free(token, i8* nocapture readonly)
|
||||
// CHECK-DAG: declare void @llvm.coro.resume(i8*)
|
||||
// CHECK-DAG: declare <8 x i32> @llvm.vp.add.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32) #0
|
||||
// CHECK-DAG: declare <8 x i32> @llvm.vp.sub.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32) #0
|
||||
// CHECK-DAG: declare <8 x i32> @llvm.vp.mul.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32) #0
|
||||
// CHECK-DAG: declare <8 x i32> @llvm.vp.add.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare <8 x i32> @llvm.vp.sub.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare <8 x i32> @llvm.vp.mul.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare <8 x i32> @llvm.vp.sdiv.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare <8 x i32> @llvm.vp.udiv.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare <8 x i32> @llvm.vp.srem.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare <8 x i32> @llvm.vp.urem.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare <8 x i32> @llvm.vp.ashr.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32) #0
|
||||
// CHECK-DAG: declare <8 x i32> @llvm.vp.lshr.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32) #0
|
||||
// CHECK-DAG: declare <8 x i32> @llvm.vp.shl.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32) #0
|
||||
// CHECK-DAG: declare <8 x i32> @llvm.vp.or.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32) #0
|
||||
// CHECK-DAG: declare <8 x i32> @llvm.vp.and.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32) #0
|
||||
// CHECK-DAG: declare <8 x i32> @llvm.vp.xor.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32) #0
|
||||
// CHECK-DAG: declare <8 x float> @llvm.vp.fadd.v8f32(<8 x float>, <8 x float>, <8 x i1>, i32) #0
|
||||
// CHECK-DAG: declare <8 x float> @llvm.vp.fsub.v8f32(<8 x float>, <8 x float>, <8 x i1>, i32) #0
|
||||
// CHECK-DAG: declare <8 x float> @llvm.vp.fmul.v8f32(<8 x float>, <8 x float>, <8 x i1>, i32) #0
|
||||
// CHECK-DAG: declare <8 x float> @llvm.vp.fdiv.v8f32(<8 x float>, <8 x float>, <8 x i1>, i32) #0
|
||||
// CHECK-DAG: declare <8 x float> @llvm.vp.frem.v8f32(<8 x float>, <8 x float>, <8 x i1>, i32) #0
|
||||
// CHECK-DAG: declare <8 x float> @llvm.vp.fneg.v8f32(<8 x float>, <8 x i1>, i32) #0
|
||||
// CHECK-DAG: declare <8 x float> @llvm.vp.fma.v8f32(<8 x float>, <8 x float>, <8 x float>, <8 x i1>, i32) #0
|
||||
// CHECK-DAG: declare i32 @llvm.vp.reduce.add.v8i32(i32, <8 x i32>, <8 x i1>, i32) #0
|
||||
// CHECK-DAG: declare i32 @llvm.vp.reduce.mul.v8i32(i32, <8 x i32>, <8 x i1>, i32) #0
|
||||
// CHECK-DAG: declare i32 @llvm.vp.reduce.and.v8i32(i32, <8 x i32>, <8 x i1>, i32) #0
|
||||
// CHECK-DAG: declare i32 @llvm.vp.reduce.or.v8i32(i32, <8 x i32>, <8 x i1>, i32) #0
|
||||
// CHECK-DAG: declare i32 @llvm.vp.reduce.xor.v8i32(i32, <8 x i32>, <8 x i1>, i32) #0
|
||||
// CHECK-DAG: declare i32 @llvm.vp.reduce.smax.v8i32(i32, <8 x i32>, <8 x i1>, i32) #0
|
||||
// CHECK-DAG: declare i32 @llvm.vp.reduce.smin.v8i32(i32, <8 x i32>, <8 x i1>, i32) #0
|
||||
// CHECK-DAG: declare i32 @llvm.vp.reduce.umax.v8i32(i32, <8 x i32>, <8 x i1>, i32) #0
|
||||
// CHECK-DAG: declare i32 @llvm.vp.reduce.umin.v8i32(i32, <8 x i32>, <8 x i1>, i32) #0
|
||||
// CHECK-DAG: declare float @llvm.vp.reduce.fadd.v8f32(float, <8 x float>, <8 x i1>, i32) #0
|
||||
// CHECK-DAG: declare float @llvm.vp.reduce.fmul.v8f32(float, <8 x float>, <8 x i1>, i32) #0
|
||||
// CHECK-DAG: declare float @llvm.vp.reduce.fmax.v8f32(float, <8 x float>, <8 x i1>, i32) #0
|
||||
// CHECK-DAG: declare float @llvm.vp.reduce.fmin.v8f32(float, <8 x float>, <8 x i1>, i32) #0
|
||||
// CHECK-DAG: declare <8 x i32> @llvm.vp.select.v8i32(<8 x i1>, <8 x i32>, <8 x i32>, i32) #12
|
||||
// CHECK-DAG: declare <8 x i32> @llvm.vp.merge.v8i32(<8 x i1>, <8 x i32>, <8 x i32>, i32) #12
|
||||
// CHECK-DAG: declare <8 x i32> @llvm.vp.ashr.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare <8 x i32> @llvm.vp.lshr.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare <8 x i32> @llvm.vp.shl.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare <8 x i32> @llvm.vp.or.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare <8 x i32> @llvm.vp.and.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare <8 x i32> @llvm.vp.xor.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare <8 x float> @llvm.vp.fadd.v8f32(<8 x float>, <8 x float>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare <8 x float> @llvm.vp.fsub.v8f32(<8 x float>, <8 x float>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare <8 x float> @llvm.vp.fmul.v8f32(<8 x float>, <8 x float>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare <8 x float> @llvm.vp.fdiv.v8f32(<8 x float>, <8 x float>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare <8 x float> @llvm.vp.frem.v8f32(<8 x float>, <8 x float>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare <8 x float> @llvm.vp.fneg.v8f32(<8 x float>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare <8 x float> @llvm.vp.fma.v8f32(<8 x float>, <8 x float>, <8 x float>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare i32 @llvm.vp.reduce.add.v8i32(i32, <8 x i32>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare i32 @llvm.vp.reduce.mul.v8i32(i32, <8 x i32>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare i32 @llvm.vp.reduce.and.v8i32(i32, <8 x i32>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare i32 @llvm.vp.reduce.or.v8i32(i32, <8 x i32>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare i32 @llvm.vp.reduce.xor.v8i32(i32, <8 x i32>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare i32 @llvm.vp.reduce.smax.v8i32(i32, <8 x i32>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare i32 @llvm.vp.reduce.smin.v8i32(i32, <8 x i32>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare i32 @llvm.vp.reduce.umax.v8i32(i32, <8 x i32>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare i32 @llvm.vp.reduce.umin.v8i32(i32, <8 x i32>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare float @llvm.vp.reduce.fadd.v8f32(float, <8 x float>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare float @llvm.vp.reduce.fmul.v8f32(float, <8 x float>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare float @llvm.vp.reduce.fmax.v8f32(float, <8 x float>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare float @llvm.vp.reduce.fmin.v8f32(float, <8 x float>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare <8 x i32> @llvm.vp.select.v8i32(<8 x i1>, <8 x i32>, <8 x i32>, i32) #2
|
||||
// CHECK-DAG: declare <8 x i32> @llvm.vp.merge.v8i32(<8 x i1>, <8 x i32>, <8 x i32>, i32) #2
|
||||
// CHECK-DAG: declare void @llvm.experimental.vp.strided.store.v8i32.p0i32.i32(<8 x i32>, i32* nocapture, i32, <8 x i1>, i32) #4
|
||||
// CHECK-DAG: declare <8 x i32> @llvm.experimental.vp.strided.load.v8i32.p0i32.i32(i32* nocapture, i32, <8 x i1>, i32) #3
|
||||
// CHECK-DAG: declare <8 x i32> @llvm.vp.trunc.v8i32.v8i64(<8 x i64>, <8 x i1>, i32) #12
|
||||
// CHECK-DAG: declare <8 x i64> @llvm.vp.zext.v8i64.v8i32(<8 x i32>, <8 x i1>, i32) #12
|
||||
// CHECK-DAG: declare <8 x i64> @llvm.vp.sext.v8i64.v8i32(<8 x i32>, <8 x i1>, i32) #12
|
||||
// CHECK-DAG: declare <8 x float> @llvm.vp.fptrunc.v8f32.v8f64(<8 x double>, <8 x i1>, i32) #12
|
||||
// CHECK-DAG: declare <8 x double> @llvm.vp.fpext.v8f64.v8f32(<8 x float>, <8 x i1>, i32) #12
|
||||
// CHECK-DAG: declare <8 x i64> @llvm.vp.fptoui.v8i64.v8f64(<8 x double>, <8 x i1>, i32) #12
|
||||
// CHECK-DAG: declare <8 x i64> @llvm.vp.fptosi.v8i64.v8f64(<8 x double>, <8 x i1>, i32) #12
|
||||
// CHECK-DAG: declare <8 x i64> @llvm.vp.ptrtoint.v8i64.v8p0i32(<8 x i32*>, <8 x i1>, i32) #12
|
||||
// CHECK-DAG: declare <8 x i32*> @llvm.vp.inttoptr.v8p0i32.v8i64(<8 x i64>, <8 x i1>, i32) #12
|
||||
// CHECK-DAG: declare <8 x i32> @llvm.vp.trunc.v8i32.v8i64(<8 x i64>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare <8 x i64> @llvm.vp.zext.v8i64.v8i32(<8 x i32>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare <8 x i64> @llvm.vp.sext.v8i64.v8i32(<8 x i32>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare <8 x float> @llvm.vp.fptrunc.v8f32.v8f64(<8 x double>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare <8 x double> @llvm.vp.fpext.v8f64.v8f32(<8 x float>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare <8 x i64> @llvm.vp.fptoui.v8i64.v8f64(<8 x double>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare <8 x i64> @llvm.vp.fptosi.v8i64.v8f64(<8 x double>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare <8 x i64> @llvm.vp.ptrtoint.v8i64.v8p0i32(<8 x i32*>, <8 x i1>, i32) #2
|
||||
// CHECK-DAG: declare <8 x i32*> @llvm.vp.inttoptr.v8p0i32.v8i64(<8 x i64>, <8 x i1>, i32) #2
|
||||
|
|
Loading…
Reference in New Issue