Skip to content

Commit 249d949

Browse files
authored
[DSE] Only consider provenance captures (#138286)
As a memory analysis, DSE only cares about provenance captures. Address captures can be ignored as they cannot be used to read or modify memory.
1 parent 0054ab4 commit 249d949

File tree

3 files changed

+57
-5
lines changed

3 files changed

+57
-5
lines changed

llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -1213,7 +1213,8 @@ struct DSEState {
12131213

12141214
auto I = InvisibleToCallerAfterRet.insert({V, false});
12151215
if (I.second && isInvisibleToCallerOnUnwind(V) && isNoAliasCall(V))
1216-
I.first->second = !PointerMayBeCaptured(V, /*ReturnCaptures=*/true);
1216+
I.first->second = capturesNothing(PointerMayBeCaptured(
1217+
V, /*ReturnCaptures=*/true, CaptureComponents::Provenance));
12171218
return I.first->second;
12181219
}
12191220

@@ -1230,7 +1231,8 @@ struct DSEState {
12301231
// with the killing MemoryDef. But we refrain from doing so for now to
12311232
// limit compile-time and this does not cause any changes to the number
12321233
// of stores removed on a large test set in practice.
1233-
I.first->second = PointerMayBeCaptured(V, /*ReturnCaptures=*/false);
1234+
I.first->second = capturesAnything(PointerMayBeCaptured(
1235+
V, /*ReturnCaptures=*/false, CaptureComponents::Provenance));
12341236
return !I.first->second;
12351237
}
12361238

llvm/test/Transforms/DeadStoreElimination/assume.ll

-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ define void @f() {
88
; CHECK-NEXT: [[TMP1:%.*]] = call noalias ptr @_Znwm(i64 32)
99
; CHECK-NEXT: [[TMP2:%.*]] = icmp ugt ptr [[TMP1]], @global
1010
; CHECK-NEXT: call void @llvm.assume(i1 [[TMP2]])
11-
; CHECK-NEXT: store i8 0, ptr [[TMP1]], align 1
1211
; CHECK-NEXT: ret void
1312
;
1413
%tmp1 = call noalias ptr @_Znwm(i64 32)
@@ -23,7 +22,6 @@ define void @f2() {
2322
; CHECK-NEXT: [[TMP1:%.*]] = call noalias ptr @_Znwm(i64 32)
2423
; CHECK-NEXT: [[TMP2:%.*]] = icmp ugt ptr [[TMP1]], @global
2524
; CHECK-NEXT: call void @llvm.assume(i1 [[TMP2]])
26-
; CHECK-NEXT: store i8 0, ptr [[TMP1]], align 1
2725
; CHECK-NEXT: call void @quux(ptr @global)
2826
; CHECK-NEXT: ret void
2927
;

llvm/test/Transforms/DeadStoreElimination/simple.ll

+53-1
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,58 @@ define void @custom_malloc_no_escape() {
304304
ret void
305305
}
306306

307+
declare void @use.ptr(ptr)
308+
309+
define void @malloc_no_escape_via_attr() {
310+
; CHECK-LABEL: @malloc_no_escape_via_attr(
311+
; CHECK-NEXT: [[M:%.*]] = call ptr @malloc(i64 24)
312+
; CHECK-NEXT: call void @use.ptr(ptr captures(none) [[M]])
313+
; CHECK-NEXT: ret void
314+
;
315+
%m = call ptr @malloc(i64 24)
316+
call void @use.ptr(ptr captures(none) %m)
317+
store i8 0, ptr %m
318+
ret void
319+
}
320+
321+
define void @malloc_address_only_escape() {
322+
; CHECK-LABEL: @malloc_address_only_escape(
323+
; CHECK-NEXT: [[M:%.*]] = call ptr @malloc(i64 24)
324+
; CHECK-NEXT: call void @use.ptr(ptr captures(address) [[M]])
325+
; CHECK-NEXT: ret void
326+
;
327+
%m = call ptr @malloc(i64 24)
328+
call void @use.ptr(ptr captures(address) %m)
329+
store i8 0, ptr %m
330+
ret void
331+
}
332+
333+
define void @malloc_provenance_escape() {
334+
; CHECK-LABEL: @malloc_provenance_escape(
335+
; CHECK-NEXT: [[M:%.*]] = call ptr @malloc(i64 24)
336+
; CHECK-NEXT: call void @use.ptr(ptr captures(provenance) [[M]])
337+
; CHECK-NEXT: store i8 0, ptr [[M]], align 1
338+
; CHECK-NEXT: ret void
339+
;
340+
%m = call ptr @malloc(i64 24)
341+
call void @use.ptr(ptr captures(provenance) %m)
342+
store i8 0, ptr %m
343+
ret void
344+
}
345+
346+
define void @malloc_read_provenance_escape() {
347+
; CHECK-LABEL: @malloc_read_provenance_escape(
348+
; CHECK-NEXT: [[M:%.*]] = call ptr @malloc(i64 24)
349+
; CHECK-NEXT: call void @use.ptr(ptr captures(read_provenance) [[M]])
350+
; CHECK-NEXT: store i8 0, ptr [[M]], align 1
351+
; CHECK-NEXT: ret void
352+
;
353+
%m = call ptr @malloc(i64 24)
354+
call void @use.ptr(ptr captures(read_provenance) %m)
355+
store i8 0, ptr %m
356+
ret void
357+
}
358+
307359
define void @test21() {
308360
; CHECK-LABEL: @test21(
309361
; CHECK-NEXT: ret void
@@ -484,7 +536,7 @@ define i32 @test32(i1 %c, ptr %p, i32 %i, i1 %arg) {
484536
; CHECK: bb1:
485537
; CHECK-NEXT: store i32 [[V]], ptr [[P]], align 4
486538
; CHECK-NEXT: call void @unknown_func()
487-
; CHECK-NEXT: br i1 %arg, label [[BB1]], label [[BB2:%.*]]
539+
; CHECK-NEXT: br i1 [[ARG:%.*]], label [[BB1]], label [[BB2:%.*]]
488540
; CHECK: bb2:
489541
; CHECK-NEXT: ret i32 0
490542
;

0 commit comments

Comments
 (0)