441 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -passes=jump-threading < %s | FileCheck %s3 4%struct.ham = type { i8, i8, i16, i32 }5%struct.zot = type { ptr }6%struct.quux.0 = type { %struct.wombat }7%struct.wombat = type { %struct.zot }8 9@global = external global ptr, align 810@global.1 = external constant ptr11 12declare i32 @wombat.2()13 14define void @blam() {15; CHECK-LABEL: @blam(16; CHECK-NEXT: bb:17; CHECK-NEXT: [[TMP:%.*]] = load i32, ptr undef, align 418; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[TMP]], 019; CHECK-NEXT: br i1 [[TMP1]], label [[BB11:%.*]], label [[BB2:%.*]]20; CHECK: bb2:21; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @wombat.2()22; CHECK-NEXT: switch i32 [[TMP3]], label [[BB10:%.*]] [23; CHECK-NEXT: i32 0, label [[BB7:%.*]]24; CHECK-NEXT: i32 1, label [[BB10]]25; CHECK-NEXT: i32 2, label [[BB10]]26; CHECK-NEXT: i32 3, label [[BB11]]27; CHECK-NEXT: ]28; CHECK: bb7:29; CHECK-NEXT: [[TMP6:%.*]] = tail call i32 @wombat.2()30; CHECK-NEXT: br label [[BB11]]31; CHECK: bb10:32; CHECK-NEXT: ret void33; CHECK: bb11:34; CHECK-NEXT: ret void35;36bb:37 %tmp = load i32, ptr undef38 %tmp1 = icmp eq i32 %tmp, 039 br i1 %tmp1, label %bb11, label %bb240 41bb2:42 %tmp3 = tail call i32 @wombat.2()43 switch i32 %tmp3, label %bb4 [44 i32 0, label %bb545 i32 1, label %bb746 i32 2, label %bb747 i32 3, label %bb1148 ]49 50bb4:51 br label %bb752 53bb5:54 %tmp6 = tail call i32 @wombat.2()55 br label %bb756 57bb7:58 %tmp8 = phi i32 [ 0, %bb5 ], [ 1, %bb4 ], [ 2, %bb2 ], [ 2, %bb2 ]59 %tmp9 = icmp eq i32 %tmp8, 060 br i1 %tmp9, label %bb11, label %bb1061 62bb10:63 ret void64 65bb11:66 ret void67}68 69define void @spam(ptr %arg, i1 %arg2) {70; CHECK-LABEL: @spam(71; CHECK-NEXT: bb:72; CHECK-NEXT: [[TMP:%.*]] = load i8, ptr undef, align 873; CHECK-NEXT: switch i8 [[TMP]], label [[BB11:%.*]] [74; CHECK-NEXT: i8 1, label [[BB11]]75; CHECK-NEXT: i8 2, label [[BB11]]76; CHECK-NEXT: i8 3, label [[BB1:%.*]]77; CHECK-NEXT: i8 4, label [[BB1]]78; CHECK-NEXT: ]79; CHECK: bb1:80; CHECK-NEXT: br label [[BB2:%.*]]81; CHECK: bb2:82; CHECK-NEXT: [[TMP3:%.*]] = phi i32 [ 0, [[BB1]] ], [ [[TMP3]], [[BB8:%.*]] ]83; CHECK-NEXT: br label [[BB4:%.*]]84; CHECK: bb4:85; CHECK-NEXT: [[TMP5:%.*]] = load i8, ptr undef, align 886; CHECK-NEXT: switch i8 [[TMP5]], label [[BB11]] [87; CHECK-NEXT: i8 0, label [[BB11]]88; CHECK-NEXT: i8 1, label [[BB10:%.*]]89; CHECK-NEXT: i8 2, label [[BB10]]90; CHECK-NEXT: i8 3, label [[BB7:%.*]]91; CHECK-NEXT: i8 4, label [[BB7]]92; CHECK-NEXT: ]93; CHECK: bb7:94; CHECK-NEXT: br i1 [[ARG2:%.*]], label [[BB8]], label [[BB10]]95; CHECK: bb8:96; CHECK-NEXT: [[TMP9:%.*]] = icmp eq ptr undef, [[ARG:%.*]]97; CHECK-NEXT: br i1 [[TMP9]], label [[BB10]], label [[BB2]]98; CHECK: bb10:99; CHECK-NEXT: switch i32 [[TMP3]], label [[BB4]] [100; CHECK-NEXT: i32 0, label [[BB16:%.*]]101; CHECK-NEXT: i32 1, label [[BB11]]102; CHECK-NEXT: i32 2, label [[BB12:%.*]]103; CHECK-NEXT: ]104; CHECK: bb11:105; CHECK-NEXT: unreachable106; CHECK: bb12:107; CHECK-NEXT: [[TMP13:%.*]] = load ptr, ptr undef, align 8108; CHECK-NEXT: br label [[BB16]]109; CHECK: bb16:110; CHECK-NEXT: [[TMP15:%.*]] = phi ptr [ [[TMP13]], [[BB12]] ], [ null, [[BB10]] ]111; CHECK-NEXT: [[TMP17:%.*]] = load i8, ptr undef, align 8112; CHECK-NEXT: switch i8 [[TMP17]], label [[BB11]] [113; CHECK-NEXT: i8 0, label [[BB11]]114; CHECK-NEXT: i8 11, label [[BB23:%.*]]115; CHECK-NEXT: i8 12, label [[BB23]]116; CHECK-NEXT: ]117; CHECK: bb23:118; CHECK-NEXT: [[TMP21:%.*]] = load ptr, ptr undef, align 8119; CHECK-NEXT: [[TMP24:%.*]] = icmp eq ptr [[TMP21]], null120; CHECK-NEXT: br i1 [[TMP24]], label [[BB37:%.*]], label [[BB25:%.*]]121; CHECK: bb25:122; CHECK-NEXT: [[TMP26:%.*]] = icmp eq ptr [[TMP15]], null123; CHECK-NEXT: br i1 [[TMP26]], label [[BB41_THREAD:%.*]], label [[BB27:%.*]]124; CHECK: bb27:125; CHECK-NEXT: [[TMP28:%.*]] = load ptr, ptr undef, align 8126; CHECK-NEXT: [[TMP29:%.*]] = icmp eq ptr [[TMP28]], [[TMP21]]127; CHECK-NEXT: br i1 [[TMP29]], label [[BB41_THREAD]], label [[BB30:%.*]]128; CHECK: bb30:129; CHECK-NEXT: [[TMP32_PR:%.*]] = load i8, ptr undef, align 8130; CHECK-NEXT: br label [[BB31:%.*]]131; CHECK: bb31:132; CHECK-NEXT: [[TMP32:%.*]] = phi i8 [ [[TMP32]], [[BB31]] ], [ [[TMP32_PR]], [[BB30]] ]133; CHECK-NEXT: [[TMP33:%.*]] = icmp eq i8 [[TMP32]], 0134; CHECK-NEXT: br i1 [[TMP33]], label [[BB31]], label [[BB41_THREAD]]135; CHECK: bb37:136; CHECK-NEXT: [[TMP36:%.*]] = phi i1 [ false, [[BB23]] ]137; CHECK-NEXT: [[TMP38:%.*]] = icmp eq ptr [[TMP15]], null138; CHECK-NEXT: br i1 [[TMP38]], label [[BB41:%.*]], label [[BB41_THREAD]]139; CHECK: bb41:140; CHECK-NEXT: [[TMP40:%.*]] = load ptr, ptr @global, align 8141; CHECK-NEXT: br label [[BB41_THREAD]]142; CHECK: bb41.thread11:143; CHECK-NEXT: [[TMP0:%.*]] = phi ptr [ undef, [[BB41]] ], [ undef, [[BB25]] ], [ undef, [[BB31]] ], [ undef, [[BB27]] ], [ undef, [[BB37]] ]144; CHECK-NEXT: ret void145;146bb:147 %tmp = load i8, ptr undef, align 8148 switch i8 %tmp, label %bb11 [149 i8 1, label %bb11150 i8 2, label %bb11151 i8 3, label %bb1152 i8 4, label %bb1153 ]154 155bb1:156 br label %bb2157 158bb2:159 %tmp3 = phi i32 [ 0, %bb1 ], [ %tmp3, %bb8 ]160 br label %bb4161 162bb4:163 %tmp5 = load i8, ptr undef, align 8164 switch i8 %tmp5, label %bb11 [165 i8 0, label %bb11166 i8 1, label %bb10167 i8 2, label %bb10168 i8 3, label %bb6169 i8 4, label %bb6170 ]171 172bb6:173 br label %bb7174 175bb7:176 br i1 %arg2, label %bb8, label %bb10177 178bb8:179 %tmp9 = icmp eq ptr undef, %arg180 br i1 %tmp9, label %bb10, label %bb2181 182bb10:183 switch i32 %tmp3, label %bb4 [184 i32 0, label %bb14185 i32 1, label %bb11186 i32 2, label %bb12187 ]188 189bb11:190 unreachable191 192bb12:193 %tmp13 = load ptr, ptr undef194 br label %bb14195 196bb14:197 %tmp15 = phi ptr [ %tmp13, %bb12 ], [ null, %bb10 ]198 br label %bb16199 200bb16:201 %tmp17 = load i8, ptr undef, align 8202 switch i8 %tmp17, label %bb11 [203 i8 0, label %bb11204 i8 11, label %bb18205 i8 12, label %bb18206 ]207 208bb18:209 br label %bb19210 211bb19:212 br label %bb20213 214bb20:215 %tmp21 = load ptr, ptr undef216 switch i8 undef, label %bb22 [217 i8 0, label %bb4218 i8 11, label %bb10219 i8 12, label %bb10220 ]221 222bb22:223 br label %bb23224 225bb23:226 %tmp24 = icmp eq ptr %tmp21, null227 br i1 %tmp24, label %bb35, label %bb25228 229bb25:230 %tmp26 = icmp eq ptr %tmp15, null231 br i1 %tmp26, label %bb34, label %bb27232 233bb27:234 %tmp28 = load ptr, ptr undef235 %tmp29 = icmp eq ptr %tmp28, %tmp21236 br i1 %tmp29, label %bb35, label %bb30237 238bb30:239 br label %bb31240 241bb31:242 %tmp32 = load i8, ptr undef, align 8243 %tmp33 = icmp eq i8 %tmp32, 0244 br i1 %tmp33, label %bb31, label %bb34245 246bb34:247 br label %bb35248 249bb35:250 %tmp36 = phi i1 [ true, %bb34 ], [ false, %bb23 ], [ true, %bb27 ]251 br label %bb37252 253bb37:254 %tmp38 = icmp eq ptr %tmp15, null255 br i1 %tmp38, label %bb39, label %bb41256 257bb39:258 %tmp40 = load ptr, ptr @global259 br label %bb41260 261bb41:262 %tmp42 = select i1 %tmp36, ptr undef, ptr undef263 ret void264}265 266declare i32 @foo(...)267 268define void @zot() align 2 personality ptr @foo {269; CHECK-LABEL: @zot(270; CHECK-NEXT: bb:271; CHECK-NEXT: invoke void @bar()272; CHECK-NEXT: to label [[BB1:%.*]] unwind label [[BB3:%.*]]273; CHECK: bb1:274; CHECK-NEXT: invoke void @bar()275; CHECK-NEXT: to label [[BB2:%.*]] unwind label [[BB4:%.*]]276; CHECK: bb2:277; CHECK-NEXT: invoke void @bar()278; CHECK-NEXT: to label [[BB6:%.*]] unwind label [[BB17:%.*]]279; CHECK: bb3:280; CHECK-NEXT: [[TMP:%.*]] = landingpad { ptr, i32 }281; CHECK-NEXT: catch ptr @global.1282; CHECK-NEXT: catch ptr null283; CHECK-NEXT: unreachable284; CHECK: bb4:285; CHECK-NEXT: [[TMP5:%.*]] = landingpad { ptr, i32 }286; CHECK-NEXT: catch ptr @global.1287; CHECK-NEXT: catch ptr null288; CHECK-NEXT: unreachable289; CHECK: bb6:290; CHECK-NEXT: invoke void @bar()291; CHECK-NEXT: to label [[BB7:%.*]] unwind label [[BB19:%.*]]292; CHECK: bb7:293; CHECK-NEXT: invoke void @bar()294; CHECK-NEXT: to label [[BB10:%.*]] unwind label [[BB8:%.*]]295; CHECK: bb8:296; CHECK-NEXT: [[TMP9:%.*]] = landingpad { ptr, i32 }297; CHECK-NEXT: cleanup298; CHECK-NEXT: catch ptr @global.1299; CHECK-NEXT: catch ptr null300; CHECK-NEXT: unreachable301; CHECK: bb10:302; CHECK-NEXT: [[TMP11:%.*]] = load ptr, ptr undef, align 8303; CHECK-NEXT: [[TMP12:%.*]] = invoke i32 [[TMP11]](ptr nonnull undef)304; CHECK-NEXT: to label [[BB13:%.*]] unwind label [[BB21:%.*]]305; CHECK: bb13:306; CHECK-NEXT: invoke void @bar()307; CHECK-NEXT: to label [[BB14:%.*]] unwind label [[BB30:%.*]]308; CHECK: bb14:309; CHECK-NEXT: [[TMP15:%.*]] = load ptr, ptr undef, align 8310; CHECK-NEXT: [[TMP16:%.*]] = invoke i32 [[TMP15]](ptr nonnull undef)311; CHECK-NEXT: to label [[BB26:%.*]] unwind label [[BB30_THREAD:%.*]]312; CHECK: bb17:313; CHECK-NEXT: [[TMP18:%.*]] = landingpad { ptr, i32 }314; CHECK-NEXT: catch ptr @global.1315; CHECK-NEXT: catch ptr null316; CHECK-NEXT: unreachable317; CHECK: bb19:318; CHECK-NEXT: [[TMP20:%.*]] = landingpad { ptr, i32 }319; CHECK-NEXT: catch ptr @global.1320; CHECK-NEXT: catch ptr null321; CHECK-NEXT: unreachable322; CHECK: bb21:323; CHECK-NEXT: [[TMP22:%.*]] = landingpad { ptr, i32 }324; CHECK-NEXT: catch ptr @global.1325; CHECK-NEXT: catch ptr null326; CHECK-NEXT: unreachable327; CHECK: bb26:328; CHECK-NEXT: [[TMP27:%.*]] = load ptr, ptr undef, align 8329; CHECK-NEXT: [[TMP28:%.*]] = invoke i32 [[TMP27]](ptr nonnull undef)330; CHECK-NEXT: to label [[BB29:%.*]] unwind label [[BB30_THREAD]]331; CHECK: bb29:332; CHECK-NEXT: unreachable333; CHECK: bb30.thread:334; CHECK-NEXT: [[LPAD_THR_COMM:%.*]] = landingpad { ptr, i32 }335; CHECK-NEXT: catch ptr @global.1336; CHECK-NEXT: catch ptr null337; CHECK-NEXT: br label [[BB32:%.*]]338; CHECK: bb30:339; CHECK-NEXT: [[LPAD_THR_COMM_SPLIT_LP:%.*]] = landingpad { ptr, i32 }340; CHECK-NEXT: catch ptr @global.1341; CHECK-NEXT: catch ptr null342; CHECK-NEXT: br label [[BB32]]343; CHECK: bb32:344; CHECK-NEXT: unreachable345;346bb:347 invoke void @bar()348 to label %bb1 unwind label %bb3349 350bb1:351 invoke void @bar()352 to label %bb2 unwind label %bb4353 354bb2:355 invoke void @bar()356 to label %bb6 unwind label %bb17357 358bb3:359 %tmp = landingpad { ptr, i32 }360 catch ptr @global.1361 catch ptr null362 unreachable363 364bb4:365 %tmp5 = landingpad { ptr, i32 }366 catch ptr @global.1367 catch ptr null368 unreachable369 370bb6:371 invoke void @bar()372 to label %bb7 unwind label %bb19373 374bb7:375 invoke void @bar()376 to label %bb10 unwind label %bb8377 378bb8:379 %tmp9 = landingpad { ptr, i32 }380 cleanup381 catch ptr @global.1382 catch ptr null383 unreachable384 385bb10:386 %tmp11 = load ptr, ptr undef, align 8387 %tmp12 = invoke i32 %tmp11(ptr nonnull undef)388 to label %bb13 unwind label %bb21389 390bb13:391 invoke void @bar()392 to label %bb14 unwind label %bb23393 394bb14:395 %tmp15 = load ptr, ptr undef, align 8396 %tmp16 = invoke i32 %tmp15(ptr nonnull undef)397 to label %bb26 unwind label %bb23398 399bb17:400 %tmp18 = landingpad { ptr, i32 }401 catch ptr @global.1402 catch ptr null403 unreachable404 405bb19:406 %tmp20 = landingpad { ptr, i32 }407 catch ptr @global.1408 catch ptr null409 unreachable410 411bb21:412 %tmp22 = landingpad { ptr, i32 }413 catch ptr @global.1414 catch ptr null415 unreachable416 417bb23:418 %tmp24 = phi ptr [ null, %bb26 ], [ null, %bb14 ], [ undef, %bb13 ]419 %tmp25 = landingpad { ptr, i32 }420 catch ptr @global.1421 catch ptr null422 br label %bb30423 424bb26:425 %tmp27 = load ptr, ptr undef, align 8426 %tmp28 = invoke i32 %tmp27(ptr nonnull undef)427 to label %bb29 unwind label %bb23428 429bb29:430 unreachable431 432bb30:433 %tmp31 = icmp eq ptr %tmp24, null434 br i1 %tmp31, label %bb32, label %bb29435 436bb32:437 unreachable438}439 440declare void @bar()441