summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorNadav Rotem <nadav.rotem@intel.com>2011-03-31 22:57:29 +0000
committerNadav Rotem <nadav.rotem@intel.com>2011-03-31 22:57:29 +0000
commitd74b72b8a9cf76fae395110218cf06f8ae57c04f (patch)
treedab342e584fd7f3f9e4377c0f818fe3ebb01f312 /llvm/lib/Transforms
parentff51d4e559a4777d79d6ab7d1c7e515de6f313a8 (diff)
downloadbcm5719-llvm-d74b72b8a9cf76fae395110218cf06f8ae57c04f.tar.gz
bcm5719-llvm-d74b72b8a9cf76fae395110218cf06f8ae57c04f.zip
Instcombile optimization: extractelement(cast) -> cast(extractelement)
llvm-svn: 128683
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r--llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp10
1 files changed, 9 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp b/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp
index 5caa12dfdfa..ad6a8d054ee 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp
@@ -230,8 +230,16 @@ Instruction *InstCombiner::visitExtractElementInst(ExtractElementInst &EI) {
ConstantInt::get(Int32Ty,
SrcIdx, false));
}
+ } else if (CastInst *CI = dyn_cast<CastInst>(I)) {
+ // Canonicalize extractelement(cast) -> cast(extractelement)
+ // bitcasts can change the number of vector elements and they cost nothing
+ if (CI->hasOneUse() && EI.hasOneUse() &&
+ (CI->getOpcode() != Instruction::BitCast)) {
+ Value *EE = Builder->CreateExtractElement(CI->getOperand(0),
+ EI.getIndexOperand());
+ return CastInst::Create(CI->getOpcode(), EE, EI.getType());
+ }
}
- // FIXME: Canonicalize extractelement(bitcast) -> bitcast(extractelement)
}
return 0;
}
OpenPOWER on IntegriCloud