1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -S -passes=jump-threading < %s | FileCheck %s 3 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 8 10@global.1 = external constant ptr 11 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 4 18; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[TMP]], 0 19; 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 void 33; CHECK: bb11: 34; CHECK-NEXT: ret void 35; 36bb: 37 %tmp = load i32, ptr undef 38 %tmp1 = icmp eq i32 %tmp, 0 39 br i1 %tmp1, label %bb11, label %bb2 40 41bb2: 42 %tmp3 = tail call i32 @wombat.2() 43 switch i32 %tmp3, label %bb4 [ 44 i32 0, label %bb5 45 i32 1, label %bb7 46 i32 2, label %bb7 47 i32 3, label %bb11 48 ] 49 50bb4: 51 br label %bb7 52 53bb5: 54 %tmp6 = tail call i32 @wombat.2() 55 br label %bb7 56 57bb7: 58 %tmp8 = phi i32 [ 0, %bb5 ], [ 1, %bb4 ], [ 2, %bb2 ], [ 2, %bb2 ] 59 %tmp9 = icmp eq i32 %tmp8, 0 60 br i1 %tmp9, label %bb11, label %bb10 61 62bb10: 63 ret void 64 65bb11: 66 ret void 67} 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 8 73; 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 8 86; 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: unreachable 106; CHECK: bb12: 107; CHECK-NEXT: [[TMP13:%.*]] = load ptr, ptr undef, align 8 108; 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 8 112; 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 8 119; CHECK-NEXT: [[TMP24:%.*]] = icmp eq ptr [[TMP21]], null 120; CHECK-NEXT: br i1 [[TMP24]], label [[BB37:%.*]], label [[BB25:%.*]] 121; CHECK: bb25: 122; CHECK-NEXT: [[TMP26:%.*]] = icmp eq ptr [[TMP15]], null 123; CHECK-NEXT: br i1 [[TMP26]], label [[BB41_THREAD:%.*]], label [[BB27:%.*]] 124; CHECK: bb27: 125; CHECK-NEXT: [[TMP28:%.*]] = load ptr, ptr undef, align 8 126; 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 8 130; 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]], 0 134; CHECK-NEXT: br i1 [[TMP33]], label [[BB31]], label [[BB37]] 135; CHECK: bb37: 136; CHECK-NEXT: [[TMP36:%.*]] = phi i1 [ false, [[BB23]] ], [ true, [[BB31]] ] 137; CHECK-NEXT: [[TMP38:%.*]] = icmp eq ptr [[TMP15]], null 138; CHECK-NEXT: br i1 [[TMP38]], label [[BB39:%.*]], label [[BB41:%.*]] 139; CHECK: bb39: 140; CHECK-NEXT: [[TMP364:%.*]] = phi i1 [ [[TMP36]], [[BB37]] ] 141; CHECK-NEXT: [[TMP40:%.*]] = load ptr, ptr @global, align 8 142; CHECK-NEXT: br i1 [[TMP364]], label [[BB41_THREAD]], label [[BB41_THREAD]] 143; CHECK: bb41: 144; CHECK-NEXT: [[TMP363:%.*]] = phi i1 [ [[TMP36]], [[BB37]] ] 145; CHECK-NEXT: br i1 [[TMP363]], label [[BB41_THREAD]], label [[BB41_THREAD]] 146; CHECK: bb41.thread: 147; CHECK-NEXT: [[TMP0:%.*]] = phi ptr [ undef, [[BB41]] ], [ undef, [[BB39]] ], [ undef, [[BB39]] ], [ undef, [[BB41]] ], [ undef, [[BB27]] ], [ undef, [[BB25]] ] 148; CHECK-NEXT: ret void 149; 150bb: 151 %tmp = load i8, ptr undef, align 8 152 switch i8 %tmp, label %bb11 [ 153 i8 1, label %bb11 154 i8 2, label %bb11 155 i8 3, label %bb1 156 i8 4, label %bb1 157 ] 158 159bb1: 160 br label %bb2 161 162bb2: 163 %tmp3 = phi i32 [ 0, %bb1 ], [ %tmp3, %bb8 ] 164 br label %bb4 165 166bb4: 167 %tmp5 = load i8, ptr undef, align 8 168 switch i8 %tmp5, label %bb11 [ 169 i8 0, label %bb11 170 i8 1, label %bb10 171 i8 2, label %bb10 172 i8 3, label %bb6 173 i8 4, label %bb6 174 ] 175 176bb6: 177 br label %bb7 178 179bb7: 180 br i1 %arg2, label %bb8, label %bb10 181 182bb8: 183 %tmp9 = icmp eq ptr undef, %arg 184 br i1 %tmp9, label %bb10, label %bb2 185 186bb10: 187 switch i32 %tmp3, label %bb4 [ 188 i32 0, label %bb14 189 i32 1, label %bb11 190 i32 2, label %bb12 191 ] 192 193bb11: 194 unreachable 195 196bb12: 197 %tmp13 = load ptr, ptr undef 198 br label %bb14 199 200bb14: 201 %tmp15 = phi ptr [ %tmp13, %bb12 ], [ null, %bb10 ] 202 br label %bb16 203 204bb16: 205 %tmp17 = load i8, ptr undef, align 8 206 switch i8 %tmp17, label %bb11 [ 207 i8 0, label %bb11 208 i8 11, label %bb18 209 i8 12, label %bb18 210 ] 211 212bb18: 213 br label %bb19 214 215bb19: 216 br label %bb20 217 218bb20: 219 %tmp21 = load ptr, ptr undef 220 switch i8 undef, label %bb22 [ 221 i8 0, label %bb4 222 i8 11, label %bb10 223 i8 12, label %bb10 224 ] 225 226bb22: 227 br label %bb23 228 229bb23: 230 %tmp24 = icmp eq ptr %tmp21, null 231 br i1 %tmp24, label %bb35, label %bb25 232 233bb25: 234 %tmp26 = icmp eq ptr %tmp15, null 235 br i1 %tmp26, label %bb34, label %bb27 236 237bb27: 238 %tmp28 = load ptr, ptr undef 239 %tmp29 = icmp eq ptr %tmp28, %tmp21 240 br i1 %tmp29, label %bb35, label %bb30 241 242bb30: 243 br label %bb31 244 245bb31: 246 %tmp32 = load i8, ptr undef, align 8 247 %tmp33 = icmp eq i8 %tmp32, 0 248 br i1 %tmp33, label %bb31, label %bb34 249 250bb34: 251 br label %bb35 252 253bb35: 254 %tmp36 = phi i1 [ true, %bb34 ], [ false, %bb23 ], [ true, %bb27 ] 255 br label %bb37 256 257bb37: 258 %tmp38 = icmp eq ptr %tmp15, null 259 br i1 %tmp38, label %bb39, label %bb41 260 261bb39: 262 %tmp40 = load ptr, ptr @global 263 br label %bb41 264 265bb41: 266 %tmp42 = select i1 %tmp36, ptr undef, ptr undef 267 ret void 268} 269 270declare i32 @foo(...) 271 272define void @zot() align 2 personality ptr @foo { 273; CHECK-LABEL: @zot( 274; CHECK-NEXT: bb: 275; CHECK-NEXT: invoke void @bar() 276; CHECK-NEXT: to label [[BB1:%.*]] unwind label [[BB3:%.*]] 277; CHECK: bb1: 278; CHECK-NEXT: invoke void @bar() 279; CHECK-NEXT: to label [[BB2:%.*]] unwind label [[BB4:%.*]] 280; CHECK: bb2: 281; CHECK-NEXT: invoke void @bar() 282; CHECK-NEXT: to label [[BB6:%.*]] unwind label [[BB17:%.*]] 283; CHECK: bb3: 284; CHECK-NEXT: [[TMP:%.*]] = landingpad { ptr, i32 } 285; CHECK-NEXT: catch ptr @global.1 286; CHECK-NEXT: catch ptr null 287; CHECK-NEXT: unreachable 288; CHECK: bb4: 289; CHECK-NEXT: [[TMP5:%.*]] = landingpad { ptr, i32 } 290; CHECK-NEXT: catch ptr @global.1 291; CHECK-NEXT: catch ptr null 292; CHECK-NEXT: unreachable 293; CHECK: bb6: 294; CHECK-NEXT: invoke void @bar() 295; CHECK-NEXT: to label [[BB7:%.*]] unwind label [[BB19:%.*]] 296; CHECK: bb7: 297; CHECK-NEXT: invoke void @bar() 298; CHECK-NEXT: to label [[BB10:%.*]] unwind label [[BB8:%.*]] 299; CHECK: bb8: 300; CHECK-NEXT: [[TMP9:%.*]] = landingpad { ptr, i32 } 301; CHECK-NEXT: cleanup 302; CHECK-NEXT: catch ptr @global.1 303; CHECK-NEXT: catch ptr null 304; CHECK-NEXT: unreachable 305; CHECK: bb10: 306; CHECK-NEXT: [[TMP11:%.*]] = load ptr, ptr undef, align 8 307; CHECK-NEXT: [[TMP12:%.*]] = invoke i32 [[TMP11]](ptr nonnull undef) 308; CHECK-NEXT: to label [[BB13:%.*]] unwind label [[BB21:%.*]] 309; CHECK: bb13: 310; CHECK-NEXT: invoke void @bar() 311; CHECK-NEXT: to label [[BB14:%.*]] unwind label [[BB30:%.*]] 312; CHECK: bb14: 313; CHECK-NEXT: [[TMP15:%.*]] = load ptr, ptr undef, align 8 314; CHECK-NEXT: [[TMP16:%.*]] = invoke i32 [[TMP15]](ptr nonnull undef) 315; CHECK-NEXT: to label [[BB26:%.*]] unwind label [[BB30_THREAD:%.*]] 316; CHECK: bb17: 317; CHECK-NEXT: [[TMP18:%.*]] = landingpad { ptr, i32 } 318; CHECK-NEXT: catch ptr @global.1 319; CHECK-NEXT: catch ptr null 320; CHECK-NEXT: unreachable 321; CHECK: bb19: 322; CHECK-NEXT: [[TMP20:%.*]] = landingpad { ptr, i32 } 323; CHECK-NEXT: catch ptr @global.1 324; CHECK-NEXT: catch ptr null 325; CHECK-NEXT: unreachable 326; CHECK: bb21: 327; CHECK-NEXT: [[TMP22:%.*]] = landingpad { ptr, i32 } 328; CHECK-NEXT: catch ptr @global.1 329; CHECK-NEXT: catch ptr null 330; CHECK-NEXT: unreachable 331; CHECK: bb26: 332; CHECK-NEXT: [[TMP27:%.*]] = load ptr, ptr undef, align 8 333; CHECK-NEXT: [[TMP28:%.*]] = invoke i32 [[TMP27]](ptr nonnull undef) 334; CHECK-NEXT: to label [[BB29:%.*]] unwind label [[BB30_THREAD]] 335; CHECK: bb29: 336; CHECK-NEXT: unreachable 337; CHECK: bb30.thread: 338; CHECK-NEXT: [[LPAD_THR_COMM:%.*]] = landingpad { ptr, i32 } 339; CHECK-NEXT: catch ptr @global.1 340; CHECK-NEXT: catch ptr null 341; CHECK-NEXT: br label [[BB32:%.*]] 342; CHECK: bb30: 343; CHECK-NEXT: [[LPAD_THR_COMM_SPLIT_LP:%.*]] = landingpad { ptr, i32 } 344; CHECK-NEXT: catch ptr @global.1 345; CHECK-NEXT: catch ptr null 346; CHECK-NEXT: br label [[BB32]] 347; CHECK: bb32: 348; CHECK-NEXT: unreachable 349; 350bb: 351 invoke void @bar() 352 to label %bb1 unwind label %bb3 353 354bb1: 355 invoke void @bar() 356 to label %bb2 unwind label %bb4 357 358bb2: 359 invoke void @bar() 360 to label %bb6 unwind label %bb17 361 362bb3: 363 %tmp = landingpad { ptr, i32 } 364 catch ptr @global.1 365 catch ptr null 366 unreachable 367 368bb4: 369 %tmp5 = landingpad { ptr, i32 } 370 catch ptr @global.1 371 catch ptr null 372 unreachable 373 374bb6: 375 invoke void @bar() 376 to label %bb7 unwind label %bb19 377 378bb7: 379 invoke void @bar() 380 to label %bb10 unwind label %bb8 381 382bb8: 383 %tmp9 = landingpad { ptr, i32 } 384 cleanup 385 catch ptr @global.1 386 catch ptr null 387 unreachable 388 389bb10: 390 %tmp11 = load ptr, ptr undef, align 8 391 %tmp12 = invoke i32 %tmp11(ptr nonnull undef) 392 to label %bb13 unwind label %bb21 393 394bb13: 395 invoke void @bar() 396 to label %bb14 unwind label %bb23 397 398bb14: 399 %tmp15 = load ptr, ptr undef, align 8 400 %tmp16 = invoke i32 %tmp15(ptr nonnull undef) 401 to label %bb26 unwind label %bb23 402 403bb17: 404 %tmp18 = landingpad { ptr, i32 } 405 catch ptr @global.1 406 catch ptr null 407 unreachable 408 409bb19: 410 %tmp20 = landingpad { ptr, i32 } 411 catch ptr @global.1 412 catch ptr null 413 unreachable 414 415bb21: 416 %tmp22 = landingpad { ptr, i32 } 417 catch ptr @global.1 418 catch ptr null 419 unreachable 420 421bb23: 422 %tmp24 = phi ptr [ null, %bb26 ], [ null, %bb14 ], [ undef, %bb13 ] 423 %tmp25 = landingpad { ptr, i32 } 424 catch ptr @global.1 425 catch ptr null 426 br label %bb30 427 428bb26: 429 %tmp27 = load ptr, ptr undef, align 8 430 %tmp28 = invoke i32 %tmp27(ptr nonnull undef) 431 to label %bb29 unwind label %bb23 432 433bb29: 434 unreachable 435 436bb30: 437 %tmp31 = icmp eq ptr %tmp24, null 438 br i1 %tmp31, label %bb32, label %bb29 439 440bb32: 441 unreachable 442} 443 444declare void @bar() 445