mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
Fix a case in SROA where lifetime intrinsics could inhibit alloca promotion. In
this case, the code path dealing with vector promotion was missing the explicit checks for lifetime intrinsics that were present on the corresponding integer promotion path. llvm-svn: 215148
This commit is contained in:
parent
79ce5fa64b
commit
8abb8c6ff5
@ -1659,6 +1659,10 @@ static bool isVectorPromotionViableForSlice(
|
||||
return false;
|
||||
if (!I->isSplittable())
|
||||
return false; // Skip any unsplittable intrinsics.
|
||||
} else if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(U->getUser())) {
|
||||
if (II->getIntrinsicID() != Intrinsic::lifetime_start &&
|
||||
II->getIntrinsicID() != Intrinsic::lifetime_end)
|
||||
return false;
|
||||
} else if (U->get()->getType()->getPointerElementType()->isStructTy()) {
|
||||
// Disable vector promotion when there are loads or stores of an FCA.
|
||||
return false;
|
||||
|
31
test/Transforms/SROA/vector-lifetime-intrinsic.ll
Normal file
31
test/Transforms/SROA/vector-lifetime-intrinsic.ll
Normal file
@ -0,0 +1,31 @@
|
||||
; RUN: opt -sroa -S < %s | FileCheck %s
|
||||
|
||||
target datalayout = "e-p:64:32-i64:32-v32:32-n32-S64"
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare void @llvm.lifetime.start(i64, i8* nocapture) #0
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare void @llvm.lifetime.end(i64, i8* nocapture) #0
|
||||
|
||||
; CHECK: @wombat
|
||||
; CHECK-NOT: alloca
|
||||
; CHECK: ret void
|
||||
define void @wombat(<4 x float> %arg1) {
|
||||
bb:
|
||||
%tmp = alloca <4 x float>, align 16
|
||||
%tmp8 = bitcast <4 x float>* %tmp to i8*
|
||||
call void @llvm.lifetime.start(i64 16, i8* %tmp8)
|
||||
store <4 x float> %arg1, <4 x float>* %tmp, align 16
|
||||
%tmp17 = bitcast <4 x float>* %tmp to <3 x float>*
|
||||
%tmp18 = load <3 x float>* %tmp17
|
||||
%tmp20 = bitcast <4 x float>* %tmp to i8*
|
||||
call void @llvm.lifetime.end(i64 16, i8* %tmp20)
|
||||
call void @wombat3(<3 x float> %tmp18)
|
||||
ret void
|
||||
}
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare void @wombat3(<3 x float>) #0
|
||||
|
||||
attributes #0 = { nounwind }
|
Loading…
x
Reference in New Issue
Block a user