Skip to content

Commit f46193a

Browse files
mshelegoigcbot
authored andcommitted
Lifetimes fix for GenXStructSplitter
Generate lifetime intrinsics only on successfull substitution. Otherwise they prevent DCE from removing newly added allocas
1 parent 8fd046f commit f46193a

File tree

2 files changed

+19
-16
lines changed

2 files changed

+19
-16
lines changed

IGC/VectorCompiler/lib/GenXCodeGen/GenXStructSplitter.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1172,8 +1172,6 @@ Substituter::generateAlloca(AllocaInst &AI,
11721172
NewTy, 0, AI.getName() + "." + getTypePrefix(*getBaseTy(NewTy)));
11731173
NewAI->setAlignment(IGCLLVM::getAlign(AI));
11741174

1175-
createLifetime(&AI, NewAI);
1176-
11771175
DbgDeclareInst *DbgDeclare = getDbgDeclare(AI);
11781176
if (!DbgDeclare)
11791177
return NewAI;
@@ -1459,6 +1457,11 @@ bool Substituter::processAlloca(AllocaInst &Alloca) {
14591457
for (auto &[InstToReplace, ToInst] : InstToInst)
14601458
InstToReplace->replaceAllUsesWith(ToInst);
14611459

1460+
for (auto &[Ty, Inst] : NewInstrs) {
1461+
auto *NewAlloca = cast<AllocaInst>(Inst);
1462+
createLifetime(&Alloca, NewAlloca);
1463+
}
1464+
14621465
return true;
14631466
}
14641467

IGC/VectorCompiler/test/StructSplitter/lifetime.ll

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,16 @@ entry:
2525
%f2 = alloca %F, align 4
2626
%f3 = alloca %F, align 4
2727

28-
; CHECK: %[[BC1:[^ ]+]] = bitcast %F* %f1 to i8*
29-
; CHECK: %[[BC2:[^ ]+]] = bitcast %F* %f2 to i8*
30-
; CHECK: %[[BC_I_S:[^ ]+]] = bitcast i32* %[[I_A]] to i8*
31-
; CHECK: call void @llvm.lifetime.start.p0i8(i64 4, i8* %[[BC_I_S]])
32-
; CHECK: %[[BC_F_S:[^ ]+]] = bitcast float* %[[F_A]] to i8*
33-
; CHECK: call void @llvm.lifetime.start.p0i8(i64 4, i8* %[[BC_F_S]])
28+
; CHECK: %[[BC1:[^ ]+]] = bitcast %F* %f1 to i8*
29+
; CHECK: %[[BC2:[^ ]+]] = bitcast %F* %f2 to i8*
30+
; CHECK-DAG: %[[BC_I_S:[^ ]+]] = bitcast i32* %[[I_A]] to i8*
31+
; CHECK-DAG: call void @llvm.lifetime.start.p0i8(i64 4, i8* %[[BC_I_S]])
32+
; CHECK-DAG: %[[BC_F_S:[^ ]+]] = bitcast float* %[[F_A]] to i8*
33+
; CHECK-DAG: call void @llvm.lifetime.start.p0i8(i64 4, i8* %[[BC_F_S]])
3434
%bc1 = bitcast %F* %f1 to i8*
3535
%bc2 = bitcast %F* %f2 to i8*
36-
call void @llvm.lifetime.start.p0i8(i64 1, i8* %bc1)
37-
call void @llvm.lifetime.start.p0i8(i64 2, i8* %bc2)
36+
call void @llvm.lifetime.start.p0i8(i64 8, i8* %bc1)
37+
call void @llvm.lifetime.start.p0i8(i64 8, i8* %bc2)
3838

3939
; CHECK: %[[I_USAGE:[^ ]+]] = ptrtoint i32* %[[I_A]] to i64
4040
%i = getelementptr %F, %F* %f1, i32 0, i32 0
@@ -53,12 +53,12 @@ entry:
5353
%i1 = getelementptr %F, %F* %f3, i32 0, i32 0
5454
%i1_usage = ptrtoint i32* %i1 to i64 ; %i1 wont be replaced because of addrspacecast.
5555

56-
; CHECK: %[[BC_I_E:[^ ]+]] = bitcast i32* %[[I_A]] to i8*
57-
; CHECK: call void @llvm.lifetime.end.p0i8(i64 4, i8* %[[BC_I_E]])
58-
; CHECK: %[[BC_F_E:[^ ]+]] = bitcast float* %[[F_A]] to i8*
59-
; CHECK: call void @llvm.lifetime.end.p0i8(i64 4, i8* %[[BC_F_E]])
60-
call void @llvm.lifetime.end.p0i8(i64 1, i8* %bc1)
61-
call void @llvm.lifetime.end.p0i8(i64 2, i8* %bc2)
56+
; CHECK-DAG: %[[BC_I_E:[^ ]+]] = bitcast i32* %[[I_A]] to i8*
57+
; CHECK-DAG: call void @llvm.lifetime.end.p0i8(i64 4, i8* %[[BC_I_E]])
58+
; CHECK-DAG: %[[BC_F_E:[^ ]+]] = bitcast float* %[[F_A]] to i8*
59+
; CHECK-DAG: call void @llvm.lifetime.end.p0i8(i64 4, i8* %[[BC_F_E]])
60+
call void @llvm.lifetime.end.p0i8(i64 8, i8* %bc1)
61+
call void @llvm.lifetime.end.p0i8(i64 8, i8* %bc2)
6262

6363
ret void
6464
}

0 commit comments

Comments
 (0)