Skip to content

Commit 69d43a5

Browse files
committed
Consider the aliasing through global variable while checking read clobber
1 parent e339f0a commit 69d43a5

File tree

2 files changed

+42
-3
lines changed

2 files changed

+42
-3
lines changed

llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1665,11 +1665,16 @@ struct DSEState {
16651665
// original MD. Stop walk.
16661666
// If KillingDef is a CallInst with "initializes" attribute, the reads in
16671667
// the callee would be dominated by initializations, so it should be safe.
1668+
// Note that in `getInitializesArgMemLoc`, we only check the aliasing
1669+
// among arguments. If aliasing through global variables, we consider it
1670+
// as read clobber.
16681671
bool IsKillingDefFromInitAttr = false;
16691672
if (IsInitializesAttrMemLoc) {
1670-
if (KillingI == UseInst &&
1671-
KillingUndObj == getUnderlyingObject(MaybeDeadLoc.Ptr))
1672-
IsKillingDefFromInitAttr = true;
1673+
if (auto *CB = dyn_cast<CallBase>(UseInst))
1674+
IsKillingDefFromInitAttr =
1675+
KillingI == UseInst &&
1676+
KillingUndObj == getUnderlyingObject(MaybeDeadLoc.Ptr) &&
1677+
CB->onlyAccessesInaccessibleMemOrArgMem();
16731678
}
16741679

16751680
if (isReadClobber(MaybeDeadLoc, UseInst) && !IsKillingDefFromInitAttr) {

llvm/test/Transforms/DeadStoreElimination/inter-procedural.ll

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,22 @@
22
; RUN: opt < %s -passes=dse -enable-dse-initializes-attr-improvement -S | FileCheck %s
33

44
declare void @p1_write_only(ptr nocapture noundef writeonly initializes((0, 2)) dead_on_unwind)
5+
56
declare void @p1_write_then_read(ptr nocapture noundef initializes((0, 2)) dead_on_unwind)
7+
memory(argmem: readwrite, inaccessiblemem: readwrite)
8+
69
declare void @p1_clobber(ptr nocapture noundef)
10+
711
declare void @p2_same_range(ptr nocapture noundef initializes((0, 2)) dead_on_unwind, ptr nocapture noundef initializes((0, 2)) dead_on_unwind)
12+
memory(argmem: readwrite, inaccessiblemem: readwrite)
13+
814
declare void @p2_no_init(ptr nocapture noundef initializes((0, 2)) dead_on_unwind, ptr nocapture noundef dead_on_unwind)
15+
916
declare void @p2_no_dead_on_unwind(ptr nocapture noundef initializes((0, 2)) dead_on_unwind, ptr nocapture noundef initializes((0, 2)))
17+
memory(argmem: readwrite, inaccessiblemem: readwrite)
18+
1019
declare void @p2_no_dead_on_unwind_but_nounwind(ptr nocapture noundef initializes((0, 2)) dead_on_unwind, ptr nocapture noundef initializes((0, 2))) nounwind
20+
memory(argmem: readwrite, inaccessiblemem: readwrite)
1121

1222
; Function Attrs: mustprogress nounwind uwtable
1323
define i16 @p1_write_only_caller() {
@@ -215,8 +225,12 @@ define i16 @p2_no_dead_on_unwind_but_nounwind_alias_caller() {
215225
}
216226

217227
declare void @llvm.memset.p0.i64(ptr nocapture, i8, i64, i1) nounwind
228+
218229
declare void @large_p1(ptr nocapture noundef initializes((0, 200))) nounwind
230+
memory(argmem: readwrite, inaccessiblemem: readwrite)
231+
219232
declare void @large_p2(ptr nocapture noundef initializes((0, 200)), ptr nocapture noundef initializes((0, 100))) nounwind
233+
memory(argmem: readwrite, inaccessiblemem: readwrite)
220234

221235
; Function Attrs: mustprogress nounwind uwtable
222236
define i16 @large_p1_caller() {
@@ -299,3 +313,23 @@ define i16 @large_p2_may_or_partial_alias_caller2(ptr %base1, ptr %base2) {
299313
ret i16 %l
300314
}
301315

316+
@g = global i16 123, align 2
317+
318+
declare void @read_global(ptr nocapture noundef initializes((0, 2)))
319+
memory(read, argmem: write, inaccessiblemem: none) nounwind
320+
321+
define i16 @global_var_alias() {
322+
; CHECK-LABEL: @global_var_alias(
323+
; CHECK-NEXT: store i32 0, ptr @g, align 4
324+
; CHECK-NEXT: [[G_ADDR:%.*]] = getelementptr i32, ptr @g, i64 1
325+
; CHECK-NEXT: call void @read_global(ptr [[G_ADDR]])
326+
; CHECK-NEXT: [[L:%.*]] = load i16, ptr @g, align 2
327+
; CHECK-NEXT: ret i16 [[L]]
328+
;
329+
store i32 0, ptr @g, align 4
330+
%g_addr = getelementptr i32, ptr @g, i64 1
331+
call void @read_global(ptr %g_addr)
332+
%l = load i16, ptr @g
333+
ret i16 %l
334+
}
335+

0 commit comments

Comments
 (0)