xref: /llvm-project/llvm/test/Transforms/IROutliner/mismatched-phi-exits-not-in-first-outlined.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 are able to extract blocks that contain PHINodes, and selectively
5dcc3e728SAndrew Litteken; store into it's respective block, creating a new block if needed.
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 label %first
15dcc3e728SAndrew Littekentest:
16*f4b925eeSMatt Arsenault  %d = load i32, ptr %0, align 4
17dcc3e728SAndrew Litteken  br label %first
18dcc3e728SAndrew Littekenfirst:
19dcc3e728SAndrew Litteken  ret void
20dcc3e728SAndrew Litteken}
21dcc3e728SAndrew Litteken
22*f4b925eeSMatt Arsenaultdefine void @function2(ptr %a, ptr %b) {
23dcc3e728SAndrew Littekenentry:
24dcc3e728SAndrew Litteken  %0 = alloca i32, align 4
25*f4b925eeSMatt Arsenault  %c = load i32, ptr %0, align 4
26dcc3e728SAndrew Litteken  br label %test1
27dcc3e728SAndrew Littekentest1:
28*f4b925eeSMatt Arsenault  %e = load i32, ptr %0, align 4
29dcc3e728SAndrew Litteken  br label %first
30dcc3e728SAndrew Littekentest:
31*f4b925eeSMatt Arsenault  %d = load i32, ptr %0, align 4
32dcc3e728SAndrew Litteken  br label %first
33dcc3e728SAndrew Littekenfirst:
34dcc3e728SAndrew Litteken  %1 = phi i32 [ %c, %test ], [ %e, %test1 ]
35dcc3e728SAndrew Litteken  ret void
36dcc3e728SAndrew Litteken}
37dcc3e728SAndrew Litteken; CHECK-LABEL: @function1(
38dcc3e728SAndrew Litteken; CHECK-NEXT:  entry:
39dcc3e728SAndrew Litteken; CHECK-NEXT:    [[TMP0:%.*]] = alloca i32, align 4
40*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @outlined_ir_func_0(ptr [[TMP0]], ptr null, i32 -1)
41dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[FIRST:%.*]]
42dcc3e728SAndrew Litteken; CHECK:       first:
43dcc3e728SAndrew Litteken; CHECK-NEXT:    ret void
44dcc3e728SAndrew Litteken;
45dcc3e728SAndrew Litteken;
46dcc3e728SAndrew Litteken; CHECK-LABEL: @function2(
47dcc3e728SAndrew Litteken; CHECK-NEXT:  entry:
48dcc3e728SAndrew Litteken; CHECK-NEXT:    [[DOTCE_LOC:%.*]] = alloca i32, align 4
49dcc3e728SAndrew Litteken; CHECK-NEXT:    [[TMP0:%.*]] = alloca i32, align 4
50*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[DOTCE_LOC]])
51*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @outlined_ir_func_0(ptr [[TMP0]], ptr [[DOTCE_LOC]], i32 0)
52*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[DOTCE_RELOAD:%.*]] = load i32, ptr [[DOTCE_LOC]], align 4
53*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[DOTCE_LOC]])
54dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[FIRST:%.*]]
55dcc3e728SAndrew Litteken; CHECK:       first:
56dcc3e728SAndrew Litteken; CHECK-NEXT:    [[TMP1:%.*]] = phi i32 [ [[DOTCE_RELOAD]], [[ENTRY:%.*]] ]
57dcc3e728SAndrew Litteken; CHECK-NEXT:    ret void
58dcc3e728SAndrew Litteken;
59dcc3e728SAndrew Litteken;
60dcc3e728SAndrew Litteken; CHECK-LABEL: define internal void @outlined_ir_func_0(
61dcc3e728SAndrew Litteken; CHECK-NEXT:  newFuncRoot:
62dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[ENTRY_TO_OUTLINE:%.*]]
63dcc3e728SAndrew Litteken; CHECK:       entry_to_outline:
64*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[C:%.*]] = load i32, ptr [[TMP0:%.*]], align 4
65dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[TEST1:%.*]]
66dcc3e728SAndrew Litteken; CHECK:       test1:
67*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[E:%.*]] = load i32, ptr [[TMP0]], align 4
68dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[PHI_BLOCK:%.*]]
69dcc3e728SAndrew Litteken; CHECK:       test:
70*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[D:%.*]] = load i32, ptr [[TMP0]], align 4
71dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[PHI_BLOCK]]
72dcc3e728SAndrew Litteken; CHECK:       first.exitStub:
73dcc3e728SAndrew Litteken; CHECK-NEXT:    switch i32 [[TMP2:%.*]], label [[FINAL_BLOCK_0:%.*]] [
74dcc3e728SAndrew Litteken; CHECK-NEXT:    i32 0, label [[OUTPUT_BLOCK_1_0:%.*]]
75dcc3e728SAndrew Litteken; CHECK-NEXT:    ]
76dcc3e728SAndrew Litteken; CHECK:       output_block_1_0:
77*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[TMP3:%.*]], ptr [[TMP1:%.*]], align 4
78dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[FINAL_BLOCK_0]]
79dcc3e728SAndrew Litteken; CHECK:       phi_block:
80dcc3e728SAndrew Litteken; CHECK-NEXT:    [[TMP3]] = phi i32 [ [[C]], [[TEST:%.*]] ], [ [[E]], [[TEST1]] ]
81dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[FIRST_EXITSTUB:%.*]]
82dcc3e728SAndrew Litteken; CHECK:       final_block_0:
83dcc3e728SAndrew Litteken; CHECK-NEXT:    ret void
84dcc3e728SAndrew Litteken;
85