xref: /llvm-project/llvm/test/Transforms/IROutliner/mismatched-phi-outputs-ordering.ll (revision f4b925ee7078f058602fd323e25f45f1ae91ca34)
1dcc3e728SAndrew Litteken; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --include-generated-funcs
29dd9575cSRoman Lebedev; RUN: opt -S -passes=verify,iroutliner -ir-outlining-no-cost < %s | FileCheck %s
3dcc3e728SAndrew Litteken
4dcc3e728SAndrew Litteken; Show that we do not extract similar regions that would involve the splitting
5dcc3e728SAndrew Litteken; of phi nodes on exit.
6dcc3e728SAndrew Litteken
7*f4b925eeSMatt Arsenaultdefine void @function1(ptr %a, ptr %b) {
8dcc3e728SAndrew Littekenentry:
9dcc3e728SAndrew Litteken  %0 = alloca i32, align 4
10*f4b925eeSMatt Arsenault  %c = load i32, ptr %0, align 4
11dcc3e728SAndrew Litteken  br label %test1
12dcc3e728SAndrew Littekentest1:
13*f4b925eeSMatt Arsenault  %e = load i32, ptr %0, align 4
14dcc3e728SAndrew Litteken  br i1 true, label %first, label %test
15dcc3e728SAndrew Littekentest:
16*f4b925eeSMatt Arsenault  %d = load i32, ptr %0, align 4
17dcc3e728SAndrew Litteken  br i1 true, label %first, label %next
18dcc3e728SAndrew Littekenfirst:
19dcc3e728SAndrew Litteken  %1 = phi i32 [ %c, %test ], [ %e, %test1 ]
20dcc3e728SAndrew Litteken  ret void
21dcc3e728SAndrew Littekennext:
22dcc3e728SAndrew Litteken  %2 = add i32 %d, 1
23dcc3e728SAndrew Litteken  %3 = add i32 %e, 1
24dcc3e728SAndrew Litteken  ret void
25dcc3e728SAndrew Litteken}
26dcc3e728SAndrew Litteken
27*f4b925eeSMatt Arsenaultdefine void @function2(ptr %a, ptr %b) {
28dcc3e728SAndrew Littekenentry:
29dcc3e728SAndrew Litteken  %0 = alloca i32, align 4
30*f4b925eeSMatt Arsenault  %c = load i32, ptr %0, align 4
31dcc3e728SAndrew Litteken  br label %test1
32dcc3e728SAndrew Littekentest1:
33*f4b925eeSMatt Arsenault  %e = load i32, ptr %0, align 4
34dcc3e728SAndrew Litteken  br i1 true, label %first, label %test
35dcc3e728SAndrew Littekentest:
36*f4b925eeSMatt Arsenault  %d = load i32, ptr %0, align 4
37dcc3e728SAndrew Litteken  br i1 true, label %first, label %next
38dcc3e728SAndrew Littekenfirst:
39dcc3e728SAndrew Litteken  ret void
40dcc3e728SAndrew Littekennext:
41dcc3e728SAndrew Litteken  %1 = add i32 %d, 1
42dcc3e728SAndrew Litteken  %2 = add i32 %e, 1
43dcc3e728SAndrew Litteken  ret void
44dcc3e728SAndrew Litteken}
45dcc3e728SAndrew Litteken; CHECK-LABEL: @function1(
46dcc3e728SAndrew Litteken; CHECK-NEXT:  entry:
47dcc3e728SAndrew Litteken; CHECK-NEXT:    [[DOTCE_LOC:%.*]] = alloca i32, align 4
48dcc3e728SAndrew Litteken; CHECK-NEXT:    [[D_LOC:%.*]] = alloca i32, align 4
49dcc3e728SAndrew Litteken; CHECK-NEXT:    [[E_LOC:%.*]] = alloca i32, align 4
50dcc3e728SAndrew Litteken; CHECK-NEXT:    [[TMP0:%.*]] = alloca i32, align 4
51*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[E_LOC]])
52*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[D_LOC]])
53*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[DOTCE_LOC]])
54*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call i1 @outlined_ir_func_0(ptr [[TMP0]], ptr [[E_LOC]], ptr [[D_LOC]], ptr [[DOTCE_LOC]], i32 0)
55*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[E_RELOAD:%.*]] = load i32, ptr [[E_LOC]], align 4
56*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[D_RELOAD:%.*]] = load i32, ptr [[D_LOC]], align 4
57*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[DOTCE_RELOAD:%.*]] = load i32, ptr [[DOTCE_LOC]], align 4
58*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[E_LOC]])
59*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[D_LOC]])
60*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[DOTCE_LOC]])
61dcc3e728SAndrew Litteken; CHECK-NEXT:    br i1 [[TMP1]], label [[FIRST:%.*]], label [[NEXT:%.*]]
62dcc3e728SAndrew Litteken; CHECK:       first:
63dcc3e728SAndrew Litteken; CHECK-NEXT:    [[TMP2:%.*]] = phi i32 [ [[DOTCE_RELOAD]], [[ENTRY:%.*]] ]
64dcc3e728SAndrew Litteken; CHECK-NEXT:    ret void
65dcc3e728SAndrew Litteken; CHECK:       next:
66dcc3e728SAndrew Litteken; CHECK-NEXT:    call void @outlined_ir_func_1(i32 [[D_RELOAD]], i32 [[E_RELOAD]])
67dcc3e728SAndrew Litteken; CHECK-NEXT:    ret void
68dcc3e728SAndrew Litteken;
69dcc3e728SAndrew Litteken;
70dcc3e728SAndrew Litteken; CHECK-LABEL: @function2(
71dcc3e728SAndrew Litteken; CHECK-NEXT:  entry:
72dcc3e728SAndrew Litteken; CHECK-NEXT:    [[D_LOC:%.*]] = alloca i32, align 4
73dcc3e728SAndrew Litteken; CHECK-NEXT:    [[E_LOC:%.*]] = alloca i32, align 4
74dcc3e728SAndrew Litteken; CHECK-NEXT:    [[TMP0:%.*]] = alloca i32, align 4
75*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[E_LOC]])
76*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[D_LOC]])
77*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call i1 @outlined_ir_func_0(ptr [[TMP0]], ptr [[E_LOC]], ptr [[D_LOC]], ptr null, i32 1)
78*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[E_RELOAD:%.*]] = load i32, ptr [[E_LOC]], align 4
79*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[D_RELOAD:%.*]] = load i32, ptr [[D_LOC]], align 4
80*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[E_LOC]])
81*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[D_LOC]])
82dcc3e728SAndrew Litteken; CHECK-NEXT:    br i1 [[TMP1]], label [[FIRST:%.*]], label [[NEXT:%.*]]
83dcc3e728SAndrew Litteken; CHECK:       first:
84dcc3e728SAndrew Litteken; CHECK-NEXT:    ret void
85dcc3e728SAndrew Litteken; CHECK:       next:
86dcc3e728SAndrew Litteken; CHECK-NEXT:    call void @outlined_ir_func_1(i32 [[D_RELOAD]], i32 [[E_RELOAD]])
87dcc3e728SAndrew Litteken; CHECK-NEXT:    ret void
88dcc3e728SAndrew Litteken;
89dcc3e728SAndrew Litteken;
90dcc3e728SAndrew Litteken; CHECK-LABEL: define internal i1 @outlined_ir_func_0(
91dcc3e728SAndrew Litteken; CHECK-NEXT:  newFuncRoot:
92dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[ENTRY_TO_OUTLINE:%.*]]
93dcc3e728SAndrew Litteken; CHECK:       entry_to_outline:
94*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[C:%.*]] = load i32, ptr [[TMP0:%.*]], align 4
95dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[TEST1:%.*]]
96dcc3e728SAndrew Litteken; CHECK:       test1:
97*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[E:%.*]] = load i32, ptr [[TMP0]], align 4
98dcc3e728SAndrew Litteken; CHECK-NEXT:    br i1 true, label [[FIRST_SPLIT:%.*]], label [[TEST:%.*]]
99dcc3e728SAndrew Litteken; CHECK:       test:
100*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[D:%.*]] = load i32, ptr [[TMP0]], align 4
101dcc3e728SAndrew Litteken; CHECK-NEXT:    br i1 true, label [[FIRST_SPLIT]], label [[NEXT_EXITSTUB:%.*]]
102dcc3e728SAndrew Litteken; CHECK:       first.split:
103dcc3e728SAndrew Litteken; CHECK-NEXT:    [[DOTCE:%.*]] = phi i32 [ [[C]], [[TEST]] ], [ [[E]], [[TEST1]] ]
104dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[FIRST_EXITSTUB:%.*]]
105dcc3e728SAndrew Litteken; CHECK:       first.exitStub:
106dcc3e728SAndrew Litteken; CHECK-NEXT:    switch i32 [[TMP4:%.*]], label [[FINAL_BLOCK_1:%.*]] [
107dcc3e728SAndrew Litteken; CHECK-NEXT:    i32 0, label [[OUTPUT_BLOCK_0_1:%.*]]
108dcc3e728SAndrew Litteken; CHECK-NEXT:    i32 1, label [[OUTPUT_BLOCK_1_1:%.*]]
109dcc3e728SAndrew Litteken; CHECK-NEXT:    ]
110dcc3e728SAndrew Litteken; CHECK:       next.exitStub:
111dcc3e728SAndrew Litteken; CHECK-NEXT:    switch i32 [[TMP4]], label [[FINAL_BLOCK_0:%.*]] [
112dcc3e728SAndrew Litteken; CHECK-NEXT:    i32 0, label [[OUTPUT_BLOCK_0_0:%.*]]
113dcc3e728SAndrew Litteken; CHECK-NEXT:    i32 1, label [[OUTPUT_BLOCK_1_0:%.*]]
114dcc3e728SAndrew Litteken; CHECK-NEXT:    ]
115dcc3e728SAndrew Litteken; CHECK:       output_block_0_0:
116*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[E]], ptr [[TMP1:%.*]], align 4
117*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[D]], ptr [[TMP2:%.*]], align 4
118dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[FINAL_BLOCK_0]]
119dcc3e728SAndrew Litteken; CHECK:       output_block_0_1:
120*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[E]], ptr [[TMP1]], align 4
121*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[DOTCE]], ptr [[TMP3:%.*]], align 4
122dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[FINAL_BLOCK_1]]
123dcc3e728SAndrew Litteken; CHECK:       output_block_1_0:
124*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[E]], ptr [[TMP1]], align 4
125*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[D]], ptr [[TMP2]], align 4
126dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[FINAL_BLOCK_0]]
127dcc3e728SAndrew Litteken; CHECK:       output_block_1_1:
128*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[E]], ptr [[TMP1]], align 4
129dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[FINAL_BLOCK_1]]
130dcc3e728SAndrew Litteken; CHECK:       final_block_0:
131dcc3e728SAndrew Litteken; CHECK-NEXT:    ret i1 false
132dcc3e728SAndrew Litteken; CHECK:       final_block_1:
133dcc3e728SAndrew Litteken; CHECK-NEXT:    ret i1 true
134dcc3e728SAndrew Litteken;
135dcc3e728SAndrew Litteken;
136dcc3e728SAndrew Litteken; CHECK-LABEL: @outlined_ir_func_1(
137dcc3e728SAndrew Litteken; CHECK-NEXT:  newFuncRoot:
138dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[NEXT_TO_OUTLINE:%.*]]
139dcc3e728SAndrew Litteken; CHECK:       next_to_outline:
140dcc3e728SAndrew Litteken; CHECK-NEXT:    [[TMP2:%.*]] = add i32 [[TMP0:%.*]], 1
141dcc3e728SAndrew Litteken; CHECK-NEXT:    [[TMP3:%.*]] = add i32 [[TMP1:%.*]], 1
142dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[NEXT_AFTER_OUTLINE_EXITSTUB:%.*]]
143dcc3e728SAndrew Litteken; CHECK:       next_after_outline.exitStub:
144dcc3e728SAndrew Litteken; CHECK-NEXT:    ret void
145dcc3e728SAndrew Litteken;
146