xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/token.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s
2*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-pc-windows-msvc18.0.0"
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdeclare i32 @__CxxFrameHandler3(...)
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Workerdefine void @test1() personality i32 (...)* @__CxxFrameHandler3 {
8*9880d681SAndroid Build Coastguard Workerbb:
9*9880d681SAndroid Build Coastguard Worker  unreachable
10*9880d681SAndroid Build Coastguard Worker
11*9880d681SAndroid Build Coastguard Workerunreachable:
12*9880d681SAndroid Build Coastguard Worker  %cl = cleanuppad within none []
13*9880d681SAndroid Build Coastguard Worker  cleanupret from %cl unwind to caller
14*9880d681SAndroid Build Coastguard Worker}
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @test1(
17*9880d681SAndroid Build Coastguard Worker; CHECK: unreachable:
18*9880d681SAndroid Build Coastguard Worker; CHECK:   %cl = cleanuppad within none []
19*9880d681SAndroid Build Coastguard Worker; CHECK:   cleanupret from %cl unwind to caller
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Workerdefine void @test2(i8 %A, i8 %B) personality i32 (...)* @__CxxFrameHandler3 {
22*9880d681SAndroid Build Coastguard Workerbb:
23*9880d681SAndroid Build Coastguard Worker  %X = zext i8 %A to i32
24*9880d681SAndroid Build Coastguard Worker  invoke void @g(i32 0)
25*9880d681SAndroid Build Coastguard Worker    to label %cont
26*9880d681SAndroid Build Coastguard Worker    unwind label %catch
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Workercont:
29*9880d681SAndroid Build Coastguard Worker  %Y = zext i8 %B to i32
30*9880d681SAndroid Build Coastguard Worker  invoke void @g(i32 0)
31*9880d681SAndroid Build Coastguard Worker    to label %unreachable
32*9880d681SAndroid Build Coastguard Worker    unwind label %catch
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Workercatch:
35*9880d681SAndroid Build Coastguard Worker  %phi = phi i32 [ %X, %bb ], [ %Y, %cont ]
36*9880d681SAndroid Build Coastguard Worker  %cs = catchswitch within none [label %doit] unwind to caller
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Workerdoit:
39*9880d681SAndroid Build Coastguard Worker  %cl = catchpad within %cs []
40*9880d681SAndroid Build Coastguard Worker  call void @g(i32 %phi)
41*9880d681SAndroid Build Coastguard Worker  unreachable
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Workerunreachable:
44*9880d681SAndroid Build Coastguard Worker  unreachable
45*9880d681SAndroid Build Coastguard Worker}
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @test2(
48*9880d681SAndroid Build Coastguard Worker; CHECK:  %X = zext i8 %A to i32
49*9880d681SAndroid Build Coastguard Worker; CHECK:  %Y = zext i8 %B to i32
50*9880d681SAndroid Build Coastguard Worker; CHECK:  %phi = phi i32 [ %X, %bb ], [ %Y, %cont ]
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Workerdefine void @test3(i8 %A, i8 %B) personality i32 (...)* @__CxxFrameHandler3 {
53*9880d681SAndroid Build Coastguard Workerbb:
54*9880d681SAndroid Build Coastguard Worker  %X = zext i8 %A to i32
55*9880d681SAndroid Build Coastguard Worker  invoke void @g(i32 0)
56*9880d681SAndroid Build Coastguard Worker    to label %cont
57*9880d681SAndroid Build Coastguard Worker    unwind label %catch
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workercont:
60*9880d681SAndroid Build Coastguard Worker  %Y = zext i8 %B to i32
61*9880d681SAndroid Build Coastguard Worker  invoke void @g(i32 0)
62*9880d681SAndroid Build Coastguard Worker    to label %cont2
63*9880d681SAndroid Build Coastguard Worker    unwind label %catch
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Workercont2:
66*9880d681SAndroid Build Coastguard Worker  invoke void @g(i32 0)
67*9880d681SAndroid Build Coastguard Worker    to label %unreachable
68*9880d681SAndroid Build Coastguard Worker    unwind label %catch
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Workercatch:
71*9880d681SAndroid Build Coastguard Worker  %phi = phi i32 [ %X, %bb ], [ %Y, %cont ], [ %Y, %cont2 ]
72*9880d681SAndroid Build Coastguard Worker  %cs = catchswitch within none [label %doit] unwind to caller
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Workerdoit:
75*9880d681SAndroid Build Coastguard Worker  %cl = catchpad within %cs []
76*9880d681SAndroid Build Coastguard Worker  call void @g(i32 %phi)
77*9880d681SAndroid Build Coastguard Worker  unreachable
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Workerunreachable:
80*9880d681SAndroid Build Coastguard Worker  unreachable
81*9880d681SAndroid Build Coastguard Worker}
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @test3(
84*9880d681SAndroid Build Coastguard Worker; CHECK:  %X = zext i8 %A to i32
85*9880d681SAndroid Build Coastguard Worker; CHECK:  %Y = zext i8 %B to i32
86*9880d681SAndroid Build Coastguard Worker; CHECK:  %phi = phi i32 [ %X, %bb ], [ %Y, %cont ], [ %Y, %cont2 ]
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Workerdeclare void @foo()
89*9880d681SAndroid Build Coastguard Workerdeclare token @llvm.experimental.gc.statepoint.p0f_isVoidf(i64, i32, void ()*, i32, i32, ...)
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Workerdefine void @test4(i8 addrspace(1)* %obj) gc "statepoint-example" {
92*9880d681SAndroid Build Coastguard Workerbb:
93*9880d681SAndroid Build Coastguard Worker  unreachable
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Workerunreachable:
96*9880d681SAndroid Build Coastguard Worker  call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 5, i32 0, i32 -1, i32 0, i32 0, i32 0)
97*9880d681SAndroid Build Coastguard Worker  ret void
98*9880d681SAndroid Build Coastguard Worker}
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @test4(
101*9880d681SAndroid Build Coastguard Worker; CHECK: unreachable:
102*9880d681SAndroid Build Coastguard Worker; CHECK:   call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 5, i32 0, i32 -1, i32 0, i32 0, i32 0)
103*9880d681SAndroid Build Coastguard Worker; CHECK:   ret void
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Workerdeclare void @g(i32)
107