Skip to content

Commit 20854d8

Browse files
[DSE,MSSA] Recognise init_trampoline in getLocForWriteEx
This fixes an instance where MemorySSA-using Dead Store Elimination is failing to do a transformation that the non-MemorySSA-using version does. Differential Revision: https://reviews.llvm.org/D83783
1 parent a9e10a0 commit 20854d8

File tree

3 files changed

+18
-23
lines changed

3 files changed

+18
-23
lines changed

llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1593,6 +1593,12 @@ struct DSEState {
15931593
break;
15941594
}
15951595
}
1596+
switch (CB->getIntrinsicID()) {
1597+
case Intrinsic::init_trampoline:
1598+
return {MemoryLocation(CB->getArgOperand(0))};
1599+
default:
1600+
break;
1601+
}
15961602
return None;
15971603
}
15981604

llvm/test/Transforms/DeadStoreElimination/MSSA/simple-todo.ll

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,6 @@
44
; RUN: opt < %s -aa-pipeline=basic-aa -passes=dse -enable-dse-memoryssa -S | FileCheck %s
55
target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"
66

7-
declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i1) nounwind
8-
declare void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* nocapture, i8, i64, i32) nounwind
9-
declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
10-
declare void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32) nounwind
11-
declare void @llvm.init.trampoline(i8*, i8*, i8*)
12-
13-
; DSE should delete the dead trampoline.
14-
declare void @test11f()
15-
define void @test11() {
16-
; CHECK-LABEL: @test11(
17-
; CHECK-NEXT: ret void
18-
;
19-
%storage = alloca [10 x i8], align 16 ; <[10 x i8]*> [#uses=1]
20-
%cast = getelementptr [10 x i8], [10 x i8]* %storage, i32 0, i32 0 ; <i8*> [#uses=1]
21-
call void @llvm.init.trampoline( i8* %cast, i8* bitcast (void ()* @test11f to i8*), i8* null ) ; <i8*> [#uses=1]
22-
ret void
23-
}
24-
25-
26-
declare noalias i8* @malloc(i32)
27-
28-
declare void @unknown_func()
29-
307
; Remove redundant store if loaded value is in another block inside a loop.
318
define i32 @test31(i1 %c, i32* %p, i32 %i) {
329
; CHECK-LABEL: @test31(

llvm/test/Transforms/DeadStoreElimination/MSSA/simple.ll

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,18 @@ define double @test10(i8* %X) {
181181
ret double %tmp.0
182182
}
183183

184+
; DSE should delete the dead trampoline.
185+
declare void @test11f()
186+
define void @test11() {
187+
; CHECK-LABEL: @test11(
188+
; CHECK-NEXT: ret void
189+
;
190+
%storage = alloca [10 x i8], align 16 ; <[10 x i8]*> [#uses=1]
191+
%cast = getelementptr [10 x i8], [10 x i8]* %storage, i32 0, i32 0 ; <i8*> [#uses=1]
192+
call void @llvm.init.trampoline( i8* %cast, i8* bitcast (void ()* @test11f to i8*), i8* null ) ; <i8*> [#uses=1]
193+
ret void
194+
}
195+
184196
; %P doesn't escape, the DEAD instructions should be removed.
185197
declare void @test13f()
186198
define i32* @test13() {

0 commit comments

Comments
 (0)