From 380a3255203ce0bac81dbb7f3526e517f32d61cf Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 24 Jan 2012 14:31:22 +0000 Subject: [PATCH] basic instcombine support for CDS. llvm-svn: 148806 --- .../InstCombineSimplifyDemanded.cpp | 35 +++++++++++++------ .../InstCombine/InstCombineVectorOps.cpp | 11 ++++-- 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp b/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp index 91a48a84739..ed9442511d2 100644 --- a/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp +++ b/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp @@ -855,23 +855,36 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts, return NewCP != CV ? NewCP : 0; } - if (isa(V)) { - // Simplify the CAZ to a ConstantVector where the non-demanded elements are - // set to undef. + if (ConstantDataVector *CDV = dyn_cast(V)) { + // Check if this is identity. If so, return 0 since we are not simplifying + // anything. + if (DemandedElts.isAllOnesValue()) + return 0; + + // Simplify to a ConstantVector where the non-demanded elements are undef. + Constant *Undef = UndefValue::get(CDV->getElementType()); + SmallVector Elts; + for (unsigned i = 0; i != VWidth; ++i) + Elts.push_back(DemandedElts[i] ? CDV->getElementAsConstant(i) : Undef); + UndefElts = DemandedElts ^ EltMask; + return ConstantVector::get(Elts); + + } + + if (ConstantAggregateZero *CAZ = dyn_cast(V)) { // Check if this is identity. If so, return 0 since we are not simplifying // anything. if (DemandedElts.isAllOnesValue()) return 0; - Type *EltTy = cast(V->getType())->getElementType(); - Constant *Zero = Constant::getNullValue(EltTy); - Constant *Undef = UndefValue::get(EltTy); - std::vector Elts; - for (unsigned i = 0; i != VWidth; ++i) { - Constant *Elt = DemandedElts[i] ? Zero : Undef; - Elts.push_back(Elt); - } + // Simplify the CAZ to a ConstantVector where the non-demanded elements are + // set to undef. + Constant *Zero = CAZ->getSequentialElement(); + Constant *Undef = UndefValue::get(Zero->getType()); + SmallVector Elts; + for (unsigned i = 0; i != VWidth; ++i) + Elts.push_back(DemandedElts[i] ? Zero : Undef); UndefElts = DemandedElts ^ EltMask; return ConstantVector::get(Elts); } diff --git a/lib/Transforms/InstCombine/InstCombineVectorOps.cpp b/lib/Transforms/InstCombine/InstCombineVectorOps.cpp index 0995d467223..0f8ffb9aebc 100644 --- a/lib/Transforms/InstCombine/InstCombineVectorOps.cpp +++ b/lib/Transforms/InstCombine/InstCombineVectorOps.cpp @@ -16,7 +16,8 @@ using namespace llvm; /// CheapToScalarize - Return true if the value is cheaper to scalarize than it -/// is to leave as a vector operation. +/// is to leave as a vector operation. isConstant indicates whether we're +/// extracting one known element. If false we're extracting a variable index. static bool CheapToScalarize(Value *V, bool isConstant) { if (isa(V)) return true; @@ -335,10 +336,14 @@ static Value *CollectShuffleElements(Value *V, std::vector &Mask, if (isa(V)) { Mask.assign(NumElts, UndefValue::get(Type::getInt32Ty(V->getContext()))); return V; - } else if (isa(V)) { + } + + if (isa(V)) { Mask.assign(NumElts, ConstantInt::get(Type::getInt32Ty(V->getContext()),0)); return V; - } else if (InsertElementInst *IEI = dyn_cast(V)) { + } + + if (InsertElementInst *IEI = dyn_cast(V)) { // If this is an insert of an extract from some other vector, include it. Value *VecOp = IEI->getOperand(0); Value *ScalarOp = IEI->getOperand(1);