mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
Rename ValueRequiresCast to ShouldOptimizeCast, to better reflect
what it does. Enhance it to return false to optimizing vector sign extensions from vector comparisions, which is the idiom used to get a splatted vector for a vector comparison. Doing this breaks vector-casts.ll, add some compensating transformations to handle the important case they cover without depending on this canonicalization. This fixes rdar://7434900 a serious pessimization of vector compares. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@95855 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -255,17 +255,26 @@ isEliminableCastPair(
|
||||
return Instruction::CastOps(Res);
|
||||
}
|
||||
|
||||
/// ValueRequiresCast - Return true if the cast from "V to Ty" actually results
|
||||
/// in any code being generated. It does not require codegen if V is simple
|
||||
/// enough or if the cast can be folded into other casts.
|
||||
bool InstCombiner::ValueRequiresCast(Instruction::CastOps opcode,const Value *V,
|
||||
const Type *Ty) {
|
||||
/// ShouldOptimizeCast - Return true if the cast from "V to Ty" actually
|
||||
/// results in any code being generated and is interesting to optimize out. If
|
||||
/// the cast can be eliminated by some other simple transformation, we prefer
|
||||
/// to do the simplification first.
|
||||
bool InstCombiner::ShouldOptimizeCast(Instruction::CastOps opc, const Value *V,
|
||||
const Type *Ty) {
|
||||
// Noop casts and casts of constants should be eliminated trivially.
|
||||
if (V->getType() == Ty || isa<Constant>(V)) return false;
|
||||
|
||||
// If this is another cast that can be eliminated, it isn't codegen either.
|
||||
// If this is another cast that can be eliminated, we prefer to have it
|
||||
// eliminated.
|
||||
if (const CastInst *CI = dyn_cast<CastInst>(V))
|
||||
if (isEliminableCastPair(CI, opcode, Ty, TD))
|
||||
if (isEliminableCastPair(CI, opc, Ty, TD))
|
||||
return false;
|
||||
|
||||
// If this is a vector sext from a compare, then we don't want to break the
|
||||
// idiom where each element of the extended vector is either zero or all ones.
|
||||
if (opc == Instruction::SExt && isa<CmpInst>(V) && isa<VectorType>(Ty))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user