diff options
3 files changed, 24 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp b/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp index 38942dcb55c..46ac9482006 100644 --- a/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp +++ b/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp @@ -293,6 +293,11 @@ AllocaInst *ConvertToScalarInfo::TryConvert(AllocaInst *AI) {    if (ScalarKind == Unknown)      ScalarKind = Integer; +  // FIXME: It should be possible to promote the vector type up to the alloca's +  // size. +  if (ScalarKind == Vector && VectorTy->getBitWidth() != AllocaSize * 8) +    ScalarKind = Integer; +    // If we were able to find a vector type that can handle this with    // insert/extract elements, and if there was at least one use that had    // a vector type, promote this to a vector.  We don't want to promote diff --git a/llvm/test/Transforms/ScalarRepl/2011-06-08-VectorExtractValue.ll b/llvm/test/Transforms/ScalarRepl/2011-06-08-VectorExtractValue.ll index 32e67fbce78..98fa1c684ce 100644 --- a/llvm/test/Transforms/ScalarRepl/2011-06-08-VectorExtractValue.ll +++ b/llvm/test/Transforms/ScalarRepl/2011-06-08-VectorExtractValue.ll @@ -10,7 +10,8 @@ target triple = "x86_64-apple-macosx10.7.0"  ; CHECK: main  ; CHECK-NOT: alloca -; CHECK: extractelement <2 x float> zeroinitializer +; CHECK: %[[A:[a-z0-9]*]] = and i128 +; CHECK: %[[B:[a-z0-9]*]] = trunc i128 %[[A]] to i32  define void @main() uwtable ssp {  entry: @@ -27,7 +28,8 @@ entry:  ; CHECK: test1  ; CHECK-NOT: alloca -; CHECK: extractelement <2 x float> zeroinitializer +; CHECK: %[[A:[a-z0-9]*]] = and i128 +; CHECK: %[[B:[a-z0-9]*]] = trunc i128 %[[A]] to i32  define void @test1() uwtable ssp {  entry: diff --git a/llvm/test/Transforms/ScalarRepl/2011-06-17-VectorPartialMemset.ll b/llvm/test/Transforms/ScalarRepl/2011-06-17-VectorPartialMemset.ll index 29d195eba36..f8530d68a8f 100644 --- a/llvm/test/Transforms/ScalarRepl/2011-06-17-VectorPartialMemset.ll +++ b/llvm/test/Transforms/ScalarRepl/2011-06-17-VectorPartialMemset.ll @@ -19,4 +19,19 @@ entry:    ret float %val  } +; CHECK: g +; CHECK-NOT: alloca +; CHECK: and i128 + +define void @g() nounwind ssp { +entry: +  %a = alloca { <4 x float> }, align 16 +  %p = bitcast { <4 x float> }* %a to i8* +  call void @llvm.memset.p0i8.i32(i8* %p, i8 0, i32 16, i32 16, i1 false) +  %q = bitcast { <4 x float> }* %a to [2 x <2 x float>]* +  %arrayidx = getelementptr inbounds [2 x <2 x float>]* %q, i32 0, i32 0 +  store <2 x float> undef, <2 x float>* %arrayidx, align 8 +  ret void +} +  declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1) nounwind  | 

