The transforms in visitEXTRACT_VECTOR_ELT are

not valid if the load is volatile.  Hopefully
all wrong DAG combiner transforms of volatile
loads and stores have now been caught.

llvm-svn: 52293
This commit is contained in:
Duncan Sands 2008-06-15 20:12:31 +00:00
parent 0bc21c0551
commit 075293ff46
1 changed files with 4 additions and 4 deletions

View File

@ -4093,8 +4093,8 @@ SDOperand DAGCombiner::visitBR_CC(SDNode *N) {
} }
/// CombineToPreIndexedLoadStore - Try turning a load / store and a /// CombineToPreIndexedLoadStore - Try turning a load / store into a
/// pre-indexed load / store when the base pointer is a add or subtract /// pre-indexed load / store when the base pointer is an add or subtract
/// and it has other uses besides the load / store. After the /// and it has other uses besides the load / store. After the
/// transformation, the new indexed load / store has effectively folded /// transformation, the new indexed load / store has effectively folded
/// the add / subtract in and all of its other uses are redirected to the /// the add / subtract in and all of its other uses are redirected to the
@ -4215,7 +4215,7 @@ bool DAGCombiner::CombineToPreIndexedLoadStore(SDNode *N) {
return true; return true;
} }
/// CombineToPostIndexedLoadStore - Try combine a load / store with a /// CombineToPostIndexedLoadStore - Try to combine a load / store with a
/// add / sub of the base pointer node into a post-indexed load / store. /// add / sub of the base pointer node into a post-indexed load / store.
/// The transformation folded the add / subtract into the new indexed /// The transformation folded the add / subtract into the new indexed
/// load / store effectively and all of its uses are redirected to the /// load / store effectively and all of its uses are redirected to the
@ -4749,7 +4749,7 @@ SDOperand DAGCombiner::visitEXTRACT_VECTOR_ELT(SDNode *N) {
Elt = (Idx < NumElems) ? Idx : Idx - NumElems; Elt = (Idx < NumElems) ? Idx : Idx - NumElems;
} }
} }
if (!LN0 || !LN0->hasOneUse()) if (!LN0 || !LN0->hasOneUse() || LN0->isVolatile())
return SDOperand(); return SDOperand();
unsigned Align = LN0->getAlignment(); unsigned Align = LN0->getAlignment();