@@ -1121,3 +1121,66 @@ entry:
1121
1121
call void @llvm.lifetime.end.p0i8 (i64 8 , i8* %a.2.cast )
1122
1122
ret i64 %lv.2
1123
1123
}
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