443 lines
12 KiB
LLVM
443 lines
12 KiB
LLVM
; 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) {
|
|
; 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 [[BB8]]
|
|
; CHECK-NEXT: i8 4, label [[BB8]]
|
|
; CHECK-NEXT: ]
|
|
; 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 [[BB37]]
|
|
; CHECK: bb37:
|
|
; CHECK-NEXT: [[TMP36:%.*]] = phi i1 [ false, [[BB23]] ], [ true, [[BB31]] ]
|
|
; CHECK-NEXT: [[TMP38:%.*]] = icmp eq ptr [[TMP15]], null
|
|
; CHECK-NEXT: br i1 [[TMP38]], label [[BB39:%.*]], label [[BB41:%.*]]
|
|
; CHECK: bb39:
|
|
; CHECK-NEXT: [[TMP364:%.*]] = phi i1 [ [[TMP36]], [[BB37]] ]
|
|
; CHECK-NEXT: [[TMP40:%.*]] = load ptr, ptr @global, align 8
|
|
; CHECK-NEXT: br i1 [[TMP364]], label [[BB41_THREAD]], label [[BB41_THREAD]]
|
|
; CHECK: bb41:
|
|
; CHECK-NEXT: [[TMP363:%.*]] = phi i1 [ [[TMP36]], [[BB37]] ]
|
|
; CHECK-NEXT: br i1 [[TMP363]], label [[BB41_THREAD]], label [[BB41_THREAD]]
|
|
; CHECK: bb41.thread:
|
|
; CHECK-NEXT: [[TMP0:%.*]] = phi ptr [ undef, [[BB41]] ], [ undef, [[BB39]] ], [ undef, [[BB39]] ], [ undef, [[BB41]] ], [ undef, [[BB27]] ], [ undef, [[BB25]] ]
|
|
; 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 undef, 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()
|