mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-15 07:59:57 +00:00
[LoopUtils] Add an extra parameter OpValue to propagateIRFlags function,
If OpValue is non-null, we only consider operations similar to OpValue when intersecting. Differential Revision: https://reviews.llvm.org/D35292 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@308428 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
4729bc52ff
commit
86f1776395
@ -531,8 +531,10 @@ Value *createTargetReduction(IRBuilder<> &B, const TargetTransformInfo *TTI,
|
||||
|
||||
/// Get the intersection (logical and) of all of the potential IR flags
|
||||
/// of each scalar operation (VL) that will be converted into a vector (I).
|
||||
/// If OpValue is non-null, we only consider operations similar to OpValue
|
||||
/// when intersecting.
|
||||
/// Flag set: NSW, NUW, exact, and all of fast-math.
|
||||
void propagateIRFlags(Value *I, ArrayRef<Value *> VL);
|
||||
void propagateIRFlags(Value *I, ArrayRef<Value *> VL, Value *OpValue = nullptr);
|
||||
|
||||
} // end namespace llvm
|
||||
|
||||
|
@ -1376,16 +1376,21 @@ Value *llvm::createTargetReduction(IRBuilder<> &Builder,
|
||||
}
|
||||
}
|
||||
|
||||
void llvm::propagateIRFlags(Value *I, ArrayRef<Value *> VL) {
|
||||
if (auto *VecOp = dyn_cast<Instruction>(I)) {
|
||||
if (auto *I0 = dyn_cast<Instruction>(VL[0])) {
|
||||
// VecOVp is initialized to the 0th scalar, so start counting from index
|
||||
// '1'.
|
||||
VecOp->copyIRFlags(I0);
|
||||
for (int i = 1, e = VL.size(); i < e; ++i) {
|
||||
if (auto *Scalar = dyn_cast<Instruction>(VL[i]))
|
||||
VecOp->andIRFlags(Scalar);
|
||||
}
|
||||
}
|
||||
void llvm::propagateIRFlags(Value *I, ArrayRef<Value *> VL, Value *OpValue) {
|
||||
auto *VecOp = dyn_cast<Instruction>(I);
|
||||
if (!VecOp)
|
||||
return;
|
||||
auto *Intersection = (OpValue == nullptr) ? dyn_cast<Instruction>(VL[0])
|
||||
: dyn_cast<Instruction>(OpValue);
|
||||
if (!Intersection)
|
||||
return;
|
||||
const unsigned Opcode = Intersection->getOpcode();
|
||||
VecOp->copyIRFlags(Intersection);
|
||||
for (auto *V : VL) {
|
||||
auto *Instr = dyn_cast<Instruction>(V);
|
||||
if (!Instr)
|
||||
continue;
|
||||
if (OpValue == nullptr || Opcode == Instr->getOpcode())
|
||||
VecOp->andIRFlags(V);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user