Skip to content

Commit 832626d

Browse files
nikicfhahn
authored andcommitted
[DSE] Add additional capture tests (NFC)
These test other escape sources and the case of multiple underlying objects. (cherry-picked from 7774166)
1 parent 4c53f70 commit 832626d

File tree

1 file changed

+63
-0
lines changed

1 file changed

+63
-0
lines changed

llvm/test/Transforms/DeadStoreElimination/captures-before-load.ll

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1121,3 +1121,66 @@ entry:
11211121
call void @llvm.lifetime.end.p0i8(i64 8, i8* %a.2.cast)
11221122
ret i64 %lv.2
11231123
}
1124+
1125+
define i32 @test_not_captured_before_load_of_ptrtoint(i64 %in) {
1126+
; CHECK-LABEL: @test_not_captured_before_load_of_ptrtoint(
1127+
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
1128+
; CHECK-NEXT: store i32 55, i32* [[A]], align 4
1129+
; CHECK-NEXT: [[IN_PTR:%.*]] = inttoptr i64 [[IN:%.*]] to i32*
1130+
; CHECK-NEXT: [[IN_PTR_LOAD:%.*]] = load i32, i32* [[IN_PTR]], align 4
1131+
; CHECK-NEXT: store i32 99, i32* [[A]], align 4
1132+
; CHECK-NEXT: call void @escape_and_clobber(i32* [[A]])
1133+
; CHECK-NEXT: ret i32 [[IN_PTR_LOAD]]
1134+
;
1135+
%a = alloca i32, align 4
1136+
store i32 55, i32* %a
1137+
%in.ptr = inttoptr i64 %in to i32*
1138+
%in.ptr.load = load i32, i32* %in.ptr
1139+
store i32 99, i32* %a
1140+
call void @escape_and_clobber(i32* %a)
1141+
ret i32 %in.ptr.load
1142+
}
1143+
1144+
declare i32* @getptr()
1145+
1146+
define i32 @test_not_captured_before_load_of_call() {
1147+
; CHECK-LABEL: @test_not_captured_before_load_of_call(
1148+
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
1149+
; CHECK-NEXT: store i32 55, i32* [[A]], align 4
1150+
; CHECK-NEXT: [[IN_PTR:%.*]] = call i32* @getptr() #[[ATTR4:[0-9]+]]
1151+
; CHECK-NEXT: [[IN_PTR_LOAD:%.*]] = load i32, i32* [[IN_PTR]], align 4
1152+
; CHECK-NEXT: store i32 99, i32* [[A]], align 4
1153+
; CHECK-NEXT: call void @escape_and_clobber(i32* [[A]])
1154+
; CHECK-NEXT: ret i32 [[IN_PTR_LOAD]]
1155+
;
1156+
%a = alloca i32, align 4
1157+
store i32 55, i32* %a
1158+
%in.ptr = call i32* @getptr() readnone
1159+
%in.ptr.load = load i32, i32* %in.ptr
1160+
store i32 99, i32* %a
1161+
call void @escape_and_clobber(i32* %a)
1162+
ret i32 %in.ptr.load
1163+
}
1164+
1165+
define i32 @test_not_captured_multiple_objects(i1 %c, i32** %in.ptr) {
1166+
; CHECK-LABEL: @test_not_captured_multiple_objects(
1167+
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
1168+
; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4
1169+
; CHECK-NEXT: [[O:%.*]] = select i1 [[C:%.*]], i32* [[A]], i32* [[B]]
1170+
; CHECK-NEXT: store i32 55, i32* [[O]], align 4
1171+
; CHECK-NEXT: [[IN_LV_1:%.*]] = load i32*, i32** [[IN_PTR:%.*]], align 2
1172+
; CHECK-NEXT: [[IN_LV_2:%.*]] = load i32, i32* [[IN_LV_1]], align 2
1173+
; CHECK-NEXT: store i32 99, i32* [[O]], align 4
1174+
; CHECK-NEXT: call void @escape_and_clobber(i32* [[O]])
1175+
; CHECK-NEXT: ret i32 [[IN_LV_2]]
1176+
;
1177+
%a = alloca i32, align 4
1178+
%b = alloca i32, align 4
1179+
%o = select i1 %c, i32* %a, i32* %b
1180+
store i32 55, i32* %o
1181+
%in.lv.1 = load i32* , i32** %in.ptr, align 2
1182+
%in.lv.2 = load i32 , i32* %in.lv.1, align 2
1183+
store i32 99, i32* %o
1184+
call void @escape_and_clobber(i32* %o)
1185+
ret i32 %in.lv.2
1186+
}

0 commit comments

Comments
 (0)