| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py | |
| ; RUN: opt -S -passes=jump-threading < %s | FileCheck %s | |
| %struct.ham = type { i8, i8, i16, i32 } | |
| %struct.zot = type { ptr } | |
| %struct.quux.0 = type { %struct.wombat } | |
| %struct.wombat = type { %struct.zot } | |
| @global = external global ptr, align 8 | |
| @global.1 = external constant ptr | |
| declare i32 @wombat.2() | |
| define void @blam() { | |
| ; CHECK-LABEL: @blam( | |
| ; CHECK-NEXT: bb: | |
| ; CHECK-NEXT: [[TMP:%.*]] = load i32, ptr undef, align 4 | |
| ; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[TMP]], 0 | |
| ; CHECK-NEXT: br i1 [[TMP1]], label [[BB11:%.*]], label [[BB2:%.*]] | |
| ; CHECK: bb2: | |
| ; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @wombat.2() | |
| ; CHECK-NEXT: switch i32 [[TMP3]], label [[BB10:%.*]] [ | |
| ; CHECK-NEXT: i32 0, label [[BB7:%.*]] | |
| ; CHECK-NEXT: i32 1, label [[BB10]] | |
| ; CHECK-NEXT: i32 2, label [[BB10]] | |
| ; CHECK-NEXT: i32 3, label [[BB11]] | |
| ; CHECK-NEXT: ] | |
| ; CHECK: bb7: | |
| ; CHECK-NEXT: [[TMP6:%.*]] = tail call i32 @wombat.2() | |
| ; CHECK-NEXT: br label [[BB11]] | |
| ; CHECK: bb10: | |
| ; CHECK-NEXT: ret void | |
| ; CHECK: bb11: | |
| ; CHECK-NEXT: ret void | |
| ; | |
| bb: | |
| %tmp = load i32, ptr undef | |
| %tmp1 = icmp eq i32 %tmp, 0 | |
| br i1 %tmp1, label %bb11, label %bb2 | |
| bb2: | |
| %tmp3 = tail call i32 @wombat.2() | |
| switch i32 %tmp3, label %bb4 [ | |
| i32 0, label %bb5 | |
| i32 1, label %bb7 | |
| i32 2, label %bb7 | |
| i32 3, label %bb11 | |
| ] | |
| bb4: | |
| br label %bb7 | |
| bb5: | |
| %tmp6 = tail call i32 @wombat.2() | |
| br label %bb7 | |
| bb7: | |
| %tmp8 = phi i32 [ 0, %bb5 ], [ 1, %bb4 ], [ 2, %bb2 ], [ 2, %bb2 ] | |
| %tmp9 = icmp eq i32 %tmp8, 0 | |
| br i1 %tmp9, label %bb11, label %bb10 | |
| bb10: | |
| ret void | |
| bb11: | |
| ret void | |
| } | |
| define void @spam(ptr %arg, i1 %arg2) { | |
| ; CHECK-LABEL: @spam( | |
| ; CHECK-NEXT: bb: | |
| ; CHECK-NEXT: [[TMP:%.*]] = load i8, ptr undef, align 8 | |
| ; CHECK-NEXT: switch i8 [[TMP]], label [[BB11:%.*]] [ | |
| ; CHECK-NEXT: i8 1, label [[BB11]] | |
| ; CHECK-NEXT: i8 2, label [[BB11]] | |
| ; CHECK-NEXT: i8 3, label [[BB1:%.*]] | |
| ; CHECK-NEXT: i8 4, label [[BB1]] | |
| ; CHECK-NEXT: ] | |
| ; CHECK: bb1: | |
| ; CHECK-NEXT: br label [[BB2:%.*]] | |
| ; CHECK: bb2: | |
| ; CHECK-NEXT: [[TMP3:%.*]] = phi i32 [ 0, [[BB1]] ], [ [[TMP3]], [[BB8:%.*]] ] | |
| ; CHECK-NEXT: br label [[BB4:%.*]] | |
| ; CHECK: bb4: | |
| ; CHECK-NEXT: [[TMP5:%.*]] = load i8, ptr undef, align 8 | |
| ; CHECK-NEXT: switch i8 [[TMP5]], label [[BB11]] [ | |
| ; CHECK-NEXT: i8 0, label [[BB11]] | |
| ; CHECK-NEXT: i8 1, label [[BB10:%.*]] | |
| ; CHECK-NEXT: i8 2, label [[BB10]] | |
| ; CHECK-NEXT: i8 3, label [[BB7:%.*]] | |
| ; CHECK-NEXT: i8 4, label [[BB7]] | |
| ; CHECK-NEXT: ] | |
| ; CHECK: bb7: | |
| ; CHECK-NEXT: br i1 [[ARG2:%.*]], label [[BB8]], label [[BB10]] | |
| ; CHECK: bb8: | |
| ; CHECK-NEXT: [[TMP9:%.*]] = icmp eq ptr undef, [[ARG:%.*]] | |
| ; CHECK-NEXT: br i1 [[TMP9]], label [[BB10]], label [[BB2]] | |
| ; CHECK: bb10: | |
| ; CHECK-NEXT: switch i32 [[TMP3]], label [[BB4]] [ | |
| ; CHECK-NEXT: i32 0, label [[BB16:%.*]] | |
| ; CHECK-NEXT: i32 1, label [[BB11]] | |
| ; CHECK-NEXT: i32 2, label [[BB12:%.*]] | |
| ; CHECK-NEXT: ] | |
| ; CHECK: bb11: | |
| ; CHECK-NEXT: unreachable | |
| ; CHECK: bb12: | |
| ; CHECK-NEXT: [[TMP13:%.*]] = load ptr, ptr undef, align 8 | |
| ; CHECK-NEXT: br label [[BB16]] | |
| ; CHECK: bb16: | |
| ; CHECK-NEXT: [[TMP15:%.*]] = phi ptr [ [[TMP13]], [[BB12]] ], [ null, [[BB10]] ] | |
| ; CHECK-NEXT: [[TMP17:%.*]] = load i8, ptr undef, align 8 | |
| ; CHECK-NEXT: switch i8 [[TMP17]], label [[BB11]] [ | |
| ; CHECK-NEXT: i8 0, label [[BB11]] | |
| ; CHECK-NEXT: i8 11, label [[BB23:%.*]] | |
| ; CHECK-NEXT: i8 12, label [[BB23]] | |
| ; CHECK-NEXT: ] | |
| ; CHECK: bb23: | |
| ; CHECK-NEXT: [[TMP21:%.*]] = load ptr, ptr undef, align 8 | |
| ; CHECK-NEXT: [[TMP24:%.*]] = icmp eq ptr [[TMP21]], null | |
| ; CHECK-NEXT: br i1 [[TMP24]], label [[BB37:%.*]], label [[BB25:%.*]] | |
| ; CHECK: bb25: | |
| ; CHECK-NEXT: [[TMP26:%.*]] = icmp eq ptr [[TMP15]], null | |
| ; CHECK-NEXT: br i1 [[TMP26]], label [[BB41_THREAD:%.*]], label [[BB27:%.*]] | |
| ; CHECK: bb27: | |
| ; CHECK-NEXT: [[TMP28:%.*]] = load ptr, ptr undef, align 8 | |
| ; CHECK-NEXT: [[TMP29:%.*]] = icmp eq ptr [[TMP28]], [[TMP21]] | |
| ; CHECK-NEXT: br i1 [[TMP29]], label [[BB41_THREAD]], label [[BB30:%.*]] | |
| ; CHECK: bb30: | |
| ; CHECK-NEXT: [[TMP32_PR:%.*]] = load i8, ptr undef, align 8 | |
| ; CHECK-NEXT: br label [[BB31:%.*]] | |
| ; CHECK: bb31: | |
| ; CHECK-NEXT: [[TMP32:%.*]] = phi i8 [ [[TMP32]], [[BB31]] ], [ [[TMP32_PR]], [[BB30]] ] | |
| ; CHECK-NEXT: [[TMP33:%.*]] = icmp eq i8 [[TMP32]], 0 | |
| ; CHECK-NEXT: br i1 [[TMP33]], label [[BB31]], label [[BB41_THREAD]] | |
| ; CHECK: bb37: | |
| ; CHECK-NEXT: [[TMP36:%.*]] = phi i1 [ false, [[BB23]] ] | |
| ; CHECK-NEXT: [[TMP38:%.*]] = icmp eq ptr [[TMP15]], null | |
| ; CHECK-NEXT: br i1 [[TMP38]], label [[BB41:%.*]], label [[BB41_THREAD]] | |
| ; CHECK: bb41: | |
| ; CHECK-NEXT: [[TMP40:%.*]] = load ptr, ptr @global, align 8 | |
| ; CHECK-NEXT: br label [[BB41_THREAD]] | |
| ; CHECK: bb41.thread11: | |
| ; CHECK-NEXT: [[TMP0:%.*]] = phi ptr [ undef, [[BB27]] ], [ undef, [[BB41]] ], [ undef, [[BB25]] ], [ undef, [[BB31]] ], [ undef, [[BB37]] ] | |
| ; CHECK-NEXT: ret void | |
| ; | |
| bb: | |
| %tmp = load i8, ptr undef, align 8 | |
| switch i8 %tmp, label %bb11 [ | |
| i8 1, label %bb11 | |
| i8 2, label %bb11 | |
| i8 3, label %bb1 | |
| i8 4, label %bb1 | |
| ] | |
| bb1: | |
| br label %bb2 | |
| bb2: | |
| %tmp3 = phi i32 [ 0, %bb1 ], [ %tmp3, %bb8 ] | |
| br label %bb4 | |
| bb4: | |
| %tmp5 = load i8, ptr undef, align 8 | |
| switch i8 %tmp5, label %bb11 [ | |
| i8 0, label %bb11 | |
| i8 1, label %bb10 | |
| i8 2, label %bb10 | |
| i8 3, label %bb6 | |
| i8 4, label %bb6 | |
| ] | |
| bb6: | |
| br label %bb7 | |
| bb7: | |
| br i1 %arg2, label %bb8, label %bb10 | |
| bb8: | |
| %tmp9 = icmp eq ptr undef, %arg | |
| br i1 %tmp9, label %bb10, label %bb2 | |
| bb10: | |
| switch i32 %tmp3, label %bb4 [ | |
| i32 0, label %bb14 | |
| i32 1, label %bb11 | |
| i32 2, label %bb12 | |
| ] | |
| bb11: | |
| unreachable | |
| bb12: | |
| %tmp13 = load ptr, ptr undef | |
| br label %bb14 | |
| bb14: | |
| %tmp15 = phi ptr [ %tmp13, %bb12 ], [ null, %bb10 ] | |
| br label %bb16 | |
| bb16: | |
| %tmp17 = load i8, ptr undef, align 8 | |
| switch i8 %tmp17, label %bb11 [ | |
| i8 0, label %bb11 | |
| i8 11, label %bb18 | |
| i8 12, label %bb18 | |
| ] | |
| bb18: | |
| br label %bb19 | |
| bb19: | |
| br label %bb20 | |
| bb20: | |
| %tmp21 = load ptr, ptr undef | |
| switch i8 undef, label %bb22 [ | |
| i8 0, label %bb4 | |
| i8 11, label %bb10 | |
| i8 12, label %bb10 | |
| ] | |
| bb22: | |
| br label %bb23 | |
| bb23: | |
| %tmp24 = icmp eq ptr %tmp21, null | |
| br i1 %tmp24, label %bb35, label %bb25 | |
| bb25: | |
| %tmp26 = icmp eq ptr %tmp15, null | |
| br i1 %tmp26, label %bb34, label %bb27 | |
| bb27: | |
| %tmp28 = load ptr, ptr undef | |
| %tmp29 = icmp eq ptr %tmp28, %tmp21 | |
| br i1 %tmp29, label %bb35, label %bb30 | |
| bb30: | |
| br label %bb31 | |
| bb31: | |
| %tmp32 = load i8, ptr undef, align 8 | |
| %tmp33 = icmp eq i8 %tmp32, 0 | |
| br i1 %tmp33, label %bb31, label %bb34 | |
| bb34: | |
| br label %bb35 | |
| bb35: | |
| %tmp36 = phi i1 [ true, %bb34 ], [ false, %bb23 ], [ true, %bb27 ] | |
| br label %bb37 | |
| bb37: | |
| %tmp38 = icmp eq ptr %tmp15, null | |
| br i1 %tmp38, label %bb39, label %bb41 | |
| bb39: | |
| %tmp40 = load ptr, ptr @global | |
| br label %bb41 | |
| bb41: | |
| %tmp42 = select i1 %tmp36, ptr undef, ptr undef | |
| ret void | |
| } | |
| declare i32 @foo(...) | |
| define void @zot() align 2 personality ptr @foo { | |
| ; CHECK-LABEL: @zot( | |
| ; CHECK-NEXT: bb: | |
| ; CHECK-NEXT: invoke void @bar() | |
| ; CHECK-NEXT: to label [[BB1:%.*]] unwind label [[BB3:%.*]] | |
| ; CHECK: bb1: | |
| ; CHECK-NEXT: invoke void @bar() | |
| ; CHECK-NEXT: to label [[BB2:%.*]] unwind label [[BB4:%.*]] | |
| ; CHECK: bb2: | |
| ; CHECK-NEXT: invoke void @bar() | |
| ; CHECK-NEXT: to label [[BB6:%.*]] unwind label [[BB17:%.*]] | |
| ; CHECK: bb3: | |
| ; CHECK-NEXT: [[TMP:%.*]] = landingpad { ptr, i32 } | |
| ; CHECK-NEXT: catch ptr @global.1 | |
| ; CHECK-NEXT: catch ptr null | |
| ; CHECK-NEXT: unreachable | |
| ; CHECK: bb4: | |
| ; CHECK-NEXT: [[TMP5:%.*]] = landingpad { ptr, i32 } | |
| ; CHECK-NEXT: catch ptr @global.1 | |
| ; CHECK-NEXT: catch ptr null | |
| ; CHECK-NEXT: unreachable | |
| ; CHECK: bb6: | |
| ; CHECK-NEXT: invoke void @bar() | |
| ; CHECK-NEXT: to label [[BB7:%.*]] unwind label [[BB19:%.*]] | |
| ; CHECK: bb7: | |
| ; CHECK-NEXT: invoke void @bar() | |
| ; CHECK-NEXT: to label [[BB10:%.*]] unwind label [[BB8:%.*]] | |
| ; CHECK: bb8: | |
| ; CHECK-NEXT: [[TMP9:%.*]] = landingpad { ptr, i32 } | |
| ; CHECK-NEXT: cleanup | |
| ; CHECK-NEXT: catch ptr @global.1 | |
| ; CHECK-NEXT: catch ptr null | |
| ; CHECK-NEXT: unreachable | |
| ; CHECK: bb10: | |
| ; CHECK-NEXT: [[TMP11:%.*]] = load ptr, ptr undef, align 8 | |
| ; CHECK-NEXT: [[TMP12:%.*]] = invoke i32 [[TMP11]](ptr nonnull undef) | |
| ; CHECK-NEXT: to label [[BB13:%.*]] unwind label [[BB21:%.*]] | |
| ; CHECK: bb13: | |
| ; CHECK-NEXT: invoke void @bar() | |
| ; CHECK-NEXT: to label [[BB14:%.*]] unwind label [[BB30:%.*]] | |
| ; CHECK: bb14: | |
| ; CHECK-NEXT: [[TMP15:%.*]] = load ptr, ptr undef, align 8 | |
| ; CHECK-NEXT: [[TMP16:%.*]] = invoke i32 [[TMP15]](ptr nonnull undef) | |
| ; CHECK-NEXT: to label [[BB26:%.*]] unwind label [[BB30_THREAD:%.*]] | |
| ; CHECK: bb17: | |
| ; CHECK-NEXT: [[TMP18:%.*]] = landingpad { ptr, i32 } | |
| ; CHECK-NEXT: catch ptr @global.1 | |
| ; CHECK-NEXT: catch ptr null | |
| ; CHECK-NEXT: unreachable | |
| ; CHECK: bb19: | |
| ; CHECK-NEXT: [[TMP20:%.*]] = landingpad { ptr, i32 } | |
| ; CHECK-NEXT: catch ptr @global.1 | |
| ; CHECK-NEXT: catch ptr null | |
| ; CHECK-NEXT: unreachable | |
| ; CHECK: bb21: | |
| ; CHECK-NEXT: [[TMP22:%.*]] = landingpad { ptr, i32 } | |
| ; CHECK-NEXT: catch ptr @global.1 | |
| ; CHECK-NEXT: catch ptr null | |
| ; CHECK-NEXT: unreachable | |
| ; CHECK: bb26: | |
| ; CHECK-NEXT: [[TMP27:%.*]] = load ptr, ptr undef, align 8 | |
| ; CHECK-NEXT: [[TMP28:%.*]] = invoke i32 [[TMP27]](ptr nonnull undef) | |
| ; CHECK-NEXT: to label [[BB29:%.*]] unwind label [[BB30_THREAD]] | |
| ; CHECK: bb29: | |
| ; CHECK-NEXT: unreachable | |
| ; CHECK: bb30.thread: | |
| ; CHECK-NEXT: [[LPAD_THR_COMM:%.*]] = landingpad { ptr, i32 } | |
| ; CHECK-NEXT: catch ptr @global.1 | |
| ; CHECK-NEXT: catch ptr null | |
| ; CHECK-NEXT: br label [[BB32:%.*]] | |
| ; CHECK: bb30: | |
| ; CHECK-NEXT: [[LPAD_THR_COMM_SPLIT_LP:%.*]] = landingpad { ptr, i32 } | |
| ; CHECK-NEXT: catch ptr @global.1 | |
| ; CHECK-NEXT: catch ptr null | |
| ; CHECK-NEXT: br label [[BB32]] | |
| ; CHECK: bb32: | |
| ; CHECK-NEXT: unreachable | |
| ; | |
| bb: | |
| invoke void @bar() | |
| to label %bb1 unwind label %bb3 | |
| bb1: | |
| invoke void @bar() | |
| to label %bb2 unwind label %bb4 | |
| bb2: | |
| invoke void @bar() | |
| to label %bb6 unwind label %bb17 | |
| bb3: | |
| %tmp = landingpad { ptr, i32 } | |
| catch ptr @global.1 | |
| catch ptr null | |
| unreachable | |
| bb4: | |
| %tmp5 = landingpad { ptr, i32 } | |
| catch ptr @global.1 | |
| catch ptr null | |
| unreachable | |
| bb6: | |
| invoke void @bar() | |
| to label %bb7 unwind label %bb19 | |
| bb7: | |
| invoke void @bar() | |
| to label %bb10 unwind label %bb8 | |
| bb8: | |
| %tmp9 = landingpad { ptr, i32 } | |
| cleanup | |
| catch ptr @global.1 | |
| catch ptr null | |
| unreachable | |
| bb10: | |
| %tmp11 = load ptr, ptr undef, align 8 | |
| %tmp12 = invoke i32 %tmp11(ptr nonnull undef) | |
| to label %bb13 unwind label %bb21 | |
| bb13: | |
| invoke void @bar() | |
| to label %bb14 unwind label %bb23 | |
| bb14: | |
| %tmp15 = load ptr, ptr undef, align 8 | |
| %tmp16 = invoke i32 %tmp15(ptr nonnull undef) | |
| to label %bb26 unwind label %bb23 | |
| bb17: | |
| %tmp18 = landingpad { ptr, i32 } | |
| catch ptr @global.1 | |
| catch ptr null | |
| unreachable | |
| bb19: | |
| %tmp20 = landingpad { ptr, i32 } | |
| catch ptr @global.1 | |
| catch ptr null | |
| unreachable | |
| bb21: | |
| %tmp22 = landingpad { ptr, i32 } | |
| catch ptr @global.1 | |
| catch ptr null | |
| unreachable | |
| bb23: | |
| %tmp24 = phi ptr [ null, %bb26 ], [ null, %bb14 ], [ undef, %bb13 ] | |
| %tmp25 = landingpad { ptr, i32 } | |
| catch ptr @global.1 | |
| catch ptr null | |
| br label %bb30 | |
| bb26: | |
| %tmp27 = load ptr, ptr undef, align 8 | |
| %tmp28 = invoke i32 %tmp27(ptr nonnull undef) | |
| to label %bb29 unwind label %bb23 | |
| bb29: | |
| unreachable | |
| bb30: | |
| %tmp31 = icmp eq ptr %tmp24, null | |
| br i1 %tmp31, label %bb32, label %bb29 | |
| bb32: | |
| unreachable | |
| } | |
| declare void @bar() |