472 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=instcombine -S < %s | FileCheck %s3 4define void @test_bitcast_1(i1 %c, ptr %ptr) {5; CHECK-LABEL: @test_bitcast_1(6; CHECK-NEXT: entry:7; CHECK-NEXT: br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]8; CHECK: b0:9; CHECK-NEXT: call void @use(ptr [[PTR:%.*]])10; CHECK-NEXT: br label [[END:%.*]]11; CHECK: b1:12; CHECK-NEXT: br label [[END]]13; CHECK: end:14; CHECK-NEXT: store i8 0, ptr [[PTR]], align 115; CHECK-NEXT: ret void16;17entry:18 br i1 %c, label %b0, label %b119 20b0:21 call void @use(ptr %ptr)22 br label %end23 24b1:25 br label %end26 27end:28 %p = phi ptr [ %ptr, %b0 ], [ %ptr, %b1 ]29 store i8 0, ptr %p30 ret void31}32 33define void @test_bitcast_2(i1 %c, ptr %ptr) {34; CHECK-LABEL: @test_bitcast_2(35; CHECK-NEXT: entry:36; CHECK-NEXT: br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]37; CHECK: b0:38; CHECK-NEXT: br label [[END:%.*]]39; CHECK: b1:40; CHECK-NEXT: call void @use(ptr [[PTR:%.*]])41; CHECK-NEXT: br label [[END]]42; CHECK: end:43; CHECK-NEXT: store i8 0, ptr [[PTR]], align 144; CHECK-NEXT: ret void45;46entry:47 br i1 %c, label %b0, label %b148 49b0:50 br label %end51 52b1:53 call void @use(ptr %ptr)54 br label %end55 56end:57 %p = phi ptr [ %ptr, %b0 ], [ %ptr, %b1 ]58 store i8 0, ptr %p59 ret void60}61 62 63define void @test_bitcast_3(i1 %c, ptr %ptr) {64; CHECK-LABEL: @test_bitcast_3(65; CHECK-NEXT: entry:66; CHECK-NEXT: [[LOAD_PTR:%.*]] = load ptr, ptr [[PTR:%.*]], align 867; CHECK-NEXT: br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]68; CHECK: b0:69; CHECK-NEXT: br label [[END:%.*]]70; CHECK: b1:71; CHECK-NEXT: call void @use(ptr [[LOAD_PTR]])72; CHECK-NEXT: br label [[END]]73; CHECK: end:74; CHECK-NEXT: store i8 0, ptr [[LOAD_PTR]], align 175; CHECK-NEXT: ret void76;77entry:78 %load.ptr = load ptr, ptr %ptr79 br i1 %c, label %b0, label %b180 81b0:82 br label %end83 84b1:85 call void @use(ptr %load.ptr)86 br label %end87 88end:89 %p = phi ptr [ %load.ptr, %b0 ], [ %load.ptr, %b1 ]90 store i8 0, ptr %p91 ret void92}93 94define void @test_bitcast_loads_in_different_bbs(i1 %c, ptr %ptr.0, ptr %ptr.1) {95; CHECK-LABEL: @test_bitcast_loads_in_different_bbs(96; CHECK-NEXT: entry:97; CHECK-NEXT: br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]98; CHECK: b0:99; CHECK-NEXT: [[LOAD_PTR_0:%.*]] = load ptr, ptr [[PTR_0:%.*]], align 8100; CHECK-NEXT: call void @use(ptr [[LOAD_PTR_0]])101; CHECK-NEXT: br label [[END:%.*]]102; CHECK: b1:103; CHECK-NEXT: [[LOAD_PTR_1:%.*]] = load ptr, ptr [[PTR_1:%.*]], align 8104; CHECK-NEXT: br label [[END]]105; CHECK: end:106; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[LOAD_PTR_0]], [[B0]] ], [ [[LOAD_PTR_1]], [[B1]] ]107; CHECK-NEXT: store i8 0, ptr [[P]], align 1108; CHECK-NEXT: ret void109;110entry:111 br i1 %c, label %b0, label %b1112 113b0:114 %load.ptr.0 = load ptr, ptr %ptr.0115 call void @use(ptr %load.ptr.0)116 br label %end117 118b1:119 %load.ptr.1 = load ptr, ptr %ptr.1120 br label %end121 122end:123 %p = phi ptr [ %load.ptr.0, %b0 ], [ %load.ptr.1, %b1 ]124 store i8 0, ptr %p125 ret void126}127 128define void @test_gep_1(i1 %c, ptr %ptr) {129; CHECK-LABEL: @test_gep_1(130; CHECK-NEXT: entry:131; CHECK-NEXT: br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]132; CHECK: b0:133; CHECK-NEXT: call void @use.i32(ptr [[PTR:%.*]])134; CHECK-NEXT: br label [[END:%.*]]135; CHECK: b1:136; CHECK-NEXT: br label [[END]]137; CHECK: end:138; CHECK-NEXT: store i32 0, ptr [[PTR]], align 4139; CHECK-NEXT: ret void140;141entry:142 br i1 %c, label %b0, label %b1143 144b0:145 call void @use.i32(ptr %ptr)146 br label %end147 148b1:149 br label %end150 151end:152 %p = phi ptr [ %ptr, %b0 ], [ %ptr, %b1 ]153 store i32 0, ptr %p154 ret void155}156 157define void @test_bitcast_not_foldable(i1 %c, ptr %ptr.0, ptr %ptr.1) {158; CHECK-LABEL: @test_bitcast_not_foldable(159; CHECK-NEXT: entry:160; CHECK-NEXT: br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]161; CHECK: b0:162; CHECK-NEXT: br label [[END:%.*]]163; CHECK: b1:164; CHECK-NEXT: call void @use(ptr [[PTR_1:%.*]])165; CHECK-NEXT: br label [[END]]166; CHECK: end:167; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[PTR_0:%.*]], [[B0]] ], [ [[PTR_1]], [[B1]] ]168; CHECK-NEXT: store i8 0, ptr [[P]], align 1169; CHECK-NEXT: ret void170;171entry:172 br i1 %c, label %b0, label %b1173 174b0:175 br label %end176 177b1:178 call void @use(ptr %ptr.1)179 br label %end180 181end:182 %p = phi ptr [ %ptr.0, %b0 ], [ %ptr.1, %b1 ]183 store i8 0, ptr %p184 ret void185}186 187define void @test_bitcast_with_extra_use(i1 %c, ptr %ptr) {188; CHECK-LABEL: @test_bitcast_with_extra_use(189; CHECK-NEXT: entry:190; CHECK-NEXT: br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]191; CHECK: b0:192; CHECK-NEXT: call void @use(ptr [[PTR:%.*]])193; CHECK-NEXT: br label [[END:%.*]]194; CHECK: b1:195; CHECK-NEXT: br label [[END]]196; CHECK: end:197; CHECK-NEXT: store i8 0, ptr [[PTR]], align 1198; CHECK-NEXT: ret void199;200entry:201 br i1 %c, label %b0, label %b1202 203b0:204 call void @use(ptr %ptr)205 br label %end206 207b1:208 br label %end209 210end:211 %p = phi ptr [ %ptr, %b0 ], [ %ptr, %b1 ]212 store i8 0, ptr %p213 ret void214}215 216define void @test_bitcast_different_bases(i1 %c, ptr %ptr.0, ptr %ptr.1) {217; CHECK-LABEL: @test_bitcast_different_bases(218; CHECK-NEXT: entry:219; CHECK-NEXT: br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]220; CHECK: b0:221; CHECK-NEXT: call void @use(ptr [[PTR_0:%.*]])222; CHECK-NEXT: br label [[END:%.*]]223; CHECK: b1:224; CHECK-NEXT: br label [[END]]225; CHECK: end:226; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[PTR_0]], [[B0]] ], [ [[PTR_1:%.*]], [[B1]] ]227; CHECK-NEXT: store i8 0, ptr [[P]], align 1228; CHECK-NEXT: ret void229;230entry:231 br i1 %c, label %b0, label %b1232 233b0:234 call void @use(ptr %ptr.0)235 br label %end236 237b1:238 br label %end239 240end:241 %p = phi ptr [ %ptr.0, %b0 ], [ %ptr.1, %b1 ]242 store i8 0, ptr %p243 ret void244}245 246define void @test_bitcast_gep_chains(i1 %c, ptr %ptr) {247; CHECK-LABEL: @test_bitcast_gep_chains(248; CHECK-NEXT: entry:249; CHECK-NEXT: br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]250; CHECK: b0:251; CHECK-NEXT: call void @use(ptr [[PTR:%.*]])252; CHECK-NEXT: br label [[END:%.*]]253; CHECK: b1:254; CHECK-NEXT: call void @use.i32(ptr [[PTR]])255; CHECK-NEXT: br label [[END]]256; CHECK: end:257; CHECK-NEXT: store i8 0, ptr [[PTR]], align 1258; CHECK-NEXT: ret void259;260entry:261 br i1 %c, label %b0, label %b1262 263b0:264 call void @use(ptr %ptr)265 br label %end266 267b1:268 call void @use.i32(ptr %ptr)269 br label %end270 271end:272 %p = phi ptr [ %ptr, %b0 ], [ %ptr, %b1 ]273 store i8 0, ptr %p274 ret void275}276 277define void @test_4_incoming_values_different_bases_1(i32 %c, ptr %ptr.0, ptr %ptr.1) {278; CHECK-LABEL: @test_4_incoming_values_different_bases_1(279; CHECK-NEXT: entry:280; CHECK-NEXT: switch i32 [[C:%.*]], label [[END_2:%.*]] [281; CHECK-NEXT: i32 0, label [[B0:%.*]]282; CHECK-NEXT: i32 1, label [[B1:%.*]]283; CHECK-NEXT: i32 2, label [[B2:%.*]]284; CHECK-NEXT: i32 3, label [[B3:%.*]]285; CHECK-NEXT: ]286; CHECK: b0:287; CHECK-NEXT: call void @use(ptr [[PTR_0:%.*]])288; CHECK-NEXT: br label [[END:%.*]]289; CHECK: b1:290; CHECK-NEXT: br label [[END]]291; CHECK: b2:292; CHECK-NEXT: br label [[END]]293; CHECK: b3:294; CHECK-NEXT: br label [[END]]295; CHECK: end:296; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[PTR_0]], [[B0]] ], [ [[PTR_1:%.*]], [[B1]] ], [ [[PTR_0]], [[B2]] ], [ [[PTR_0]], [[B3]] ]297; CHECK-NEXT: store i8 0, ptr [[P]], align 1298; CHECK-NEXT: ret void299; CHECK: end.2:300; CHECK-NEXT: ret void301;302entry:303 switch i32 %c, label %end.2 [ i32 0, label %b0304 i32 1, label %b1305 i32 2, label %b2306 i32 3, label %b3]307 308b0:309 call void @use(ptr %ptr.0)310 br label %end311 312b1:313 br label %end314 315b2:316 br label %end317 318b3:319 br label %end320 321end:322 %p = phi ptr [ %ptr.0, %b0 ], [ %ptr.1, %b1 ], [ %ptr.0, %b2 ], [ %ptr.0, %b3]323 store i8 0, ptr %p324 ret void325 326end.2:327 ret void328}329 330define void @test_4_incoming_values_different_bases_2(i32 %c, ptr %ptr.0, ptr %ptr.1) {331; CHECK-LABEL: @test_4_incoming_values_different_bases_2(332; CHECK-NEXT: entry:333; CHECK-NEXT: switch i32 [[C:%.*]], label [[END_2:%.*]] [334; CHECK-NEXT: i32 0, label [[B0:%.*]]335; CHECK-NEXT: i32 1, label [[B1:%.*]]336; CHECK-NEXT: i32 2, label [[B2:%.*]]337; CHECK-NEXT: i32 3, label [[B3:%.*]]338; CHECK-NEXT: ]339; CHECK: b0:340; CHECK-NEXT: br label [[END:%.*]]341; CHECK: b1:342; CHECK-NEXT: call void @use(ptr [[PTR_0:%.*]])343; CHECK-NEXT: br label [[END]]344; CHECK: b2:345; CHECK-NEXT: br label [[END]]346; CHECK: b3:347; CHECK-NEXT: br label [[END]]348; CHECK: end:349; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[PTR_1:%.*]], [[B0]] ], [ [[PTR_0]], [[B1]] ], [ [[PTR_0]], [[B2]] ], [ [[PTR_0]], [[B3]] ]350; CHECK-NEXT: store i8 0, ptr [[P]], align 1351; CHECK-NEXT: ret void352; CHECK: end.2:353; CHECK-NEXT: ret void354;355entry:356 switch i32 %c, label %end.2 [ i32 0, label %b0357 i32 1, label %b1358 i32 2, label %b2359 i32 3, label %b3]360 361b0:362 br label %end363 364b1:365 call void @use(ptr %ptr.0)366 br label %end367 368b2:369 br label %end370 371b3:372 br label %end373 374end:375 %p = phi ptr [ %ptr.1, %b0 ], [ %ptr.0, %b1 ], [ %ptr.0, %b2 ], [ %ptr.0, %b3]376 store i8 0, ptr %p377 ret void378 379end.2:380 ret void381}382 383define void @test_4_incoming_values_different_bases_3(i32 %c, ptr %ptr.0, ptr %ptr.1) {384; CHECK-LABEL: @test_4_incoming_values_different_bases_3(385; CHECK-NEXT: entry:386; CHECK-NEXT: switch i32 [[C:%.*]], label [[END_2:%.*]] [387; CHECK-NEXT: i32 0, label [[B0:%.*]]388; CHECK-NEXT: i32 1, label [[B1:%.*]]389; CHECK-NEXT: i32 2, label [[B2:%.*]]390; CHECK-NEXT: i32 3, label [[B3:%.*]]391; CHECK-NEXT: ]392; CHECK: b0:393; CHECK-NEXT: br label [[END:%.*]]394; CHECK: b1:395; CHECK-NEXT: br label [[END]]396; CHECK: b2:397; CHECK-NEXT: call void @use(ptr [[PTR_0:%.*]])398; CHECK-NEXT: br label [[END]]399; CHECK: b3:400; CHECK-NEXT: br label [[END]]401; CHECK: end:402; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[PTR_0]], [[B0]] ], [ [[PTR_0]], [[B1]] ], [ [[PTR_0]], [[B2]] ], [ [[PTR_1:%.*]], [[B3]] ]403; CHECK-NEXT: store i8 0, ptr [[P]], align 1404; CHECK-NEXT: ret void405; CHECK: end.2:406; CHECK-NEXT: ret void407;408entry:409 switch i32 %c, label %end.2 [ i32 0, label %b0410 i32 1, label %b1411 i32 2, label %b2412 i32 3, label %b3]413 414b0:415 br label %end416 417b1:418 br label %end419 420b2:421 call void @use(ptr %ptr.0)422 br label %end423 424b3:425 br label %end426 427end:428 %p = phi ptr [ %ptr.0, %b0 ], [ %ptr.0, %b1 ], [ %ptr.0, %b2 ], [ %ptr.1, %b3]429 store i8 0, ptr %p430 ret void431 432end.2:433 ret void434}435 436define void @test_addrspacecast_1(i1 %c, ptr %ptr) {437; CHECK-LABEL: @test_addrspacecast_1(438; CHECK-NEXT: entry:439; CHECK-NEXT: br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]440; CHECK: b0:441; CHECK-NEXT: br label [[END:%.*]]442; CHECK: b1:443; CHECK-NEXT: [[CAST_1:%.*]] = addrspacecast ptr [[PTR:%.*]] to ptr addrspace(1)444; CHECK-NEXT: call void @use.i8.addrspace1(ptr addrspace(1) [[CAST_1]])445; CHECK-NEXT: br label [[END]]446; CHECK: end:447; CHECK-NEXT: [[P:%.*]] = addrspacecast ptr [[PTR]] to ptr addrspace(1)448; CHECK-NEXT: store i8 0, ptr addrspace(1) [[P]], align 1449; CHECK-NEXT: ret void450;451entry:452 %cast.0 = addrspacecast ptr %ptr to ptr addrspace(1)453 %cast.1 = addrspacecast ptr %ptr to ptr addrspace(1)454 br i1 %c, label %b0, label %b1455 456b0:457 br label %end458 459b1:460 call void @use.i8.addrspace1(ptr addrspace(1) %cast.1)461 br label %end462 463end:464 %p = phi ptr addrspace(1) [ %cast.0, %b0 ], [ %cast.1, %b1 ]465 store i8 0, ptr addrspace(1) %p466 ret void467}468 469declare void @use(ptr)470declare void @use.i32(ptr)471declare void @use.i8.addrspace1(ptr addrspace(1))472