diff options
| author | Eli Friedman <eli.friedman@gmail.com> | 2009-06-01 09:14:32 +0000 | 
|---|---|---|
| committer | Eli Friedman <eli.friedman@gmail.com> | 2009-06-01 09:14:32 +0000 | 
| commit | ee94e3cc9e8188c940246e5bec02a64d5df8f6ac (patch) | |
| tree | 042a99bc9c494b0eb7f50f7134107e0353b6264f /llvm | |
| parent | 202a68a917ad0caac81ce54ab2d02dd88be33c06 (diff) | |
| download | bcm5719-llvm-ee94e3cc9e8188c940246e5bec02a64d5df8f6ac.tar.gz bcm5719-llvm-ee94e3cc9e8188c940246e5bec02a64d5df8f6ac.zip | |
PR4286: Make RewriteLoadUserOfWholeAlloca and 
RewriteStoreUserOfWholeAlloca deal with tail padding because 
isSafeUseOfBitCastedAllocation expects them to.  Otherwise, we crash 
trying to erase the bitcast.
llvm-svn: 72688
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp | 21 | ||||
| -rw-r--r-- | llvm/test/Transforms/ScalarRepl/2009-06-01-BitcastIntPadding.ll | 17 | 
2 files changed, 30 insertions, 8 deletions
| diff --git a/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp b/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp index 5e2859abae4..9935f12f893 100644 --- a/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp +++ b/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp @@ -903,11 +903,13 @@ void SROA::RewriteStoreUserOfWholeAlloca(StoreInst *SI,    // If this isn't a store of an integer to the whole alloca, it may be a store    // to the first element.  Just ignore the store in this case and normal SROA -  // will handle it.  We don't handle types here that have tail padding, like -  // an alloca of type {i1}. +  // will handle it.    if (!isa<IntegerType>(SrcVal->getType()) || -      TD->getTypeSizeInBits(SrcVal->getType()) != AllocaSizeBits) +      TD->getTypeAllocSizeInBits(SrcVal->getType()) != AllocaSizeBits)      return; +  // Handle tail padding by extending the operand +  if (TD->getTypeSizeInBits(SrcVal->getType()) != AllocaSizeBits) +    SrcVal = new ZExtInst(SrcVal, IntegerType::get(AllocaSizeBits), "", SI);    DOUT << "PROMOTING STORE TO WHOLE ALLOCA: " << *AI << *SI; @@ -1016,10 +1018,9 @@ void SROA::RewriteLoadUserOfWholeAlloca(LoadInst *LI, AllocationInst *AI,    // If this isn't a load of the whole alloca to an integer, it may be a load    // of the first element.  Just ignore the load in this case and normal SROA -  // will handle it.  We don't handle types here that have tail padding, like -  // an alloca of type {i1}. +  // will handle it.    if (!isa<IntegerType>(LI->getType()) || -      TD->getTypeSizeInBits(LI->getType()) != AllocaSizeBits) +      TD->getTypeAllocSizeInBits(LI->getType()) != AllocaSizeBits)      return;    DOUT << "PROMOTING LOAD OF WHOLE ALLOCA: " << *AI << *LI; @@ -1035,7 +1036,7 @@ void SROA::RewriteLoadUserOfWholeAlloca(LoadInst *LI, AllocationInst *AI,      ArrayEltBitOffset = TD->getTypeAllocSizeInBits(ArrayEltTy);    }     -  Value *ResultVal = Constant::getNullValue(LI->getType()); +  Value *ResultVal = Constant::getNullValue(IntegerType::get(AllocaSizeBits));    for (unsigned i = 0, e = NewElts.size(); i != e; ++i) {      // Load the value from the alloca.  If the NewElt is an aggregate, cast @@ -1082,7 +1083,11 @@ void SROA::RewriteLoadUserOfWholeAlloca(LoadInst *LI, AllocationInst *AI,      ResultVal = BinaryOperator::CreateOr(SrcField, ResultVal, "", LI);    } -   + +  // Handle tail padding by truncating the result +  if (TD->getTypeSizeInBits(LI->getType()) != AllocaSizeBits) +    ResultVal = new TruncInst(ResultVal, LI->getType(), "", LI); +    LI->replaceAllUsesWith(ResultVal);    LI->eraseFromParent();  } diff --git a/llvm/test/Transforms/ScalarRepl/2009-06-01-BitcastIntPadding.ll b/llvm/test/Transforms/ScalarRepl/2009-06-01-BitcastIntPadding.ll new file mode 100644 index 00000000000..ffdd679355a --- /dev/null +++ b/llvm/test/Transforms/ScalarRepl/2009-06-01-BitcastIntPadding.ll @@ -0,0 +1,17 @@ +; RUN: llvm-as < %s | opt -scalarrepl +; PR4286 + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" +target triple = "x86_64-undermydesk-freebsd8.0" +	%struct.singlebool = type <{ i8 }> + +define zeroext i8 @doit() nounwind { +entry: +	%a = alloca %struct.singlebool, align 1		; <%struct.singlebool*> [#uses=2] +	%storetmp.i = bitcast %struct.singlebool* %a to i1*		; <i1*> [#uses=1] +	store i1 true, i1* %storetmp.i +	%tmp = getelementptr %struct.singlebool* %a, i64 0, i32 0		; <i8*> [#uses=1] +	%tmp1 = load i8* %tmp		; <i8> [#uses=1] +	ret i8 %tmp1 +} + | 

