xref: /llvm-project/llvm/test/Transforms/IROutliner/region-inputs-in-phi-nodes.ll (revision f8559751fc2b15b45ac417be9abe865085af45ad)
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
4*f8559751SJay Foad; Show that we are able to propagate inputs to the region into the split PHINode
5dcc3e728SAndrew Litteken; outside of the region if necessary.
6dcc3e728SAndrew Litteken
7f4b925eeSMatt Arsenaultdefine void @function1(ptr %a, ptr %b) {
8dcc3e728SAndrew Littekenentry:
9dcc3e728SAndrew Litteken  %0 = alloca i32, align 4
10f4b925eeSMatt Arsenault  %c = load i32, ptr %0, align 4
11dcc3e728SAndrew Litteken  %z = add i32 %c, %c
12dcc3e728SAndrew Litteken  br i1 true, label %test1, label %first
13dcc3e728SAndrew Littekentest1:
14f4b925eeSMatt Arsenault  %e = load i32, ptr %0, align 4
15dcc3e728SAndrew Litteken  %1 = add i32 %c, %c
16dcc3e728SAndrew Litteken  br i1 true, label %first, label %test
17dcc3e728SAndrew Littekentest:
18f4b925eeSMatt Arsenault  %d = load i32, ptr %0, align 4
19dcc3e728SAndrew Litteken  br i1 true, label %first, label %next
20e8f4e41bSAndrew Littekendummy:
21e8f4e41bSAndrew Litteken  ret void
22dcc3e728SAndrew Littekenfirst:
23dcc3e728SAndrew Litteken  %2 = phi i32 [ %d, %test ], [ %e, %test1 ], [ %c, %entry ]
24dcc3e728SAndrew Litteken  ret void
25dcc3e728SAndrew Littekennext:
26dcc3e728SAndrew Litteken  ret void
27dcc3e728SAndrew Litteken}
28dcc3e728SAndrew Litteken
29f4b925eeSMatt Arsenaultdefine void @function2(ptr %a, ptr %b) {
30dcc3e728SAndrew Littekenentry:
31dcc3e728SAndrew Litteken  %0 = alloca i32, align 4
32f4b925eeSMatt Arsenault  %c = load i32, ptr %0, align 4
33dcc3e728SAndrew Litteken  %z = mul i32 %c, %c
34dcc3e728SAndrew Litteken  br i1 true, label %test1, label %first
35dcc3e728SAndrew Littekentest1:
36f4b925eeSMatt Arsenault  %e = load i32, ptr %0, align 4
37dcc3e728SAndrew Litteken  %1 = add i32 %c, %c
38dcc3e728SAndrew Litteken  br i1 true, label %first, label %test
39dcc3e728SAndrew Littekentest:
40f4b925eeSMatt Arsenault  %d = load i32, ptr %0, align 4
41dcc3e728SAndrew Litteken  br i1 true, label %first, label %next
42e8f4e41bSAndrew Littekendummy:
43e8f4e41bSAndrew Litteken  ret void
44dcc3e728SAndrew Littekenfirst:
45dcc3e728SAndrew Litteken  %2 = phi i32 [ %d, %test ], [ %e, %test1 ], [ %c, %entry ]
46dcc3e728SAndrew Litteken  ret void
47dcc3e728SAndrew Littekennext:
48dcc3e728SAndrew Litteken  ret void
49dcc3e728SAndrew Litteken}
50dcc3e728SAndrew Litteken; CHECK-LABEL: @function1(
51dcc3e728SAndrew Litteken; CHECK-NEXT:  entry:
52dcc3e728SAndrew Litteken; CHECK-NEXT:    [[DOTCE_LOC:%.*]] = alloca i32, align 4
53dcc3e728SAndrew Litteken; CHECK-NEXT:    [[TMP0:%.*]] = alloca i32, align 4
54f4b925eeSMatt Arsenault; CHECK-NEXT:    [[C:%.*]] = load i32, ptr [[TMP0]], align 4
55dcc3e728SAndrew Litteken; CHECK-NEXT:    [[Z:%.*]] = add i32 [[C]], [[C]]
56f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[DOTCE_LOC]])
57f4b925eeSMatt Arsenault; CHECK-NEXT:    [[TARGETBLOCK:%.*]] = call i1 @outlined_ir_func_0(ptr [[TMP0]], i32 [[C]], ptr [[DOTCE_LOC]])
58f4b925eeSMatt Arsenault; CHECK-NEXT:    [[DOTCE_RELOAD:%.*]] = load i32, ptr [[DOTCE_LOC]], align 4
59f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[DOTCE_LOC]])
60dcc3e728SAndrew Litteken; CHECK-NEXT:    br i1 [[TARGETBLOCK]], label [[FIRST:%.*]], label [[NEXT:%.*]]
61e8f4e41bSAndrew Litteken; CHECK: dummy:
62e8f4e41bSAndrew Litteken; CHECK-NEXT:  ret void
63dcc3e728SAndrew Litteken; CHECK:       first:
64dcc3e728SAndrew Litteken; CHECK-NEXT:    [[TMP1:%.*]] = phi i32 [ [[DOTCE_RELOAD]], [[ENTRY:%.*]] ]
65dcc3e728SAndrew Litteken; CHECK-NEXT:    ret void
66dcc3e728SAndrew Litteken; CHECK:       next:
67dcc3e728SAndrew Litteken; CHECK-NEXT:    ret void
68dcc3e728SAndrew Litteken;
69dcc3e728SAndrew Litteken;
70dcc3e728SAndrew Litteken; CHECK-LABEL: @function2(
71dcc3e728SAndrew Litteken; CHECK-NEXT:  entry:
72dcc3e728SAndrew Litteken; CHECK-NEXT:    [[DOTCE_LOC:%.*]] = alloca i32, align 4
73dcc3e728SAndrew Litteken; CHECK-NEXT:    [[TMP0:%.*]] = alloca i32, align 4
74f4b925eeSMatt Arsenault; CHECK-NEXT:    [[C:%.*]] = load i32, ptr [[TMP0]], align 4
75dcc3e728SAndrew Litteken; CHECK-NEXT:    [[Z:%.*]] = mul i32 [[C]], [[C]]
76f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[DOTCE_LOC]])
77f4b925eeSMatt Arsenault; CHECK-NEXT:    [[TARGETBLOCK:%.*]] = call i1 @outlined_ir_func_0(ptr [[TMP0]], i32 [[C]], ptr [[DOTCE_LOC]])
78f4b925eeSMatt Arsenault; CHECK-NEXT:    [[DOTCE_RELOAD:%.*]] = load i32, ptr [[DOTCE_LOC]], align 4
79f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[DOTCE_LOC]])
80dcc3e728SAndrew Litteken; CHECK-NEXT:    br i1 [[TARGETBLOCK]], label [[FIRST:%.*]], label [[NEXT:%.*]]
81e8f4e41bSAndrew Litteken; CHECK: dummy:
82e8f4e41bSAndrew Litteken; CHECK-NEXT:  ret void
83dcc3e728SAndrew Litteken; CHECK:       first:
84dcc3e728SAndrew Litteken; CHECK-NEXT:    [[TMP1:%.*]] = phi i32 [ [[DOTCE_RELOAD]], [[ENTRY:%.*]] ]
85dcc3e728SAndrew Litteken; CHECK-NEXT:    ret void
86dcc3e728SAndrew Litteken; CHECK:       next:
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:
94dcc3e728SAndrew Litteken; CHECK-NEXT:    br i1 true, label [[TEST1:%.*]], label [[FIRST_SPLIT:%.*]]
95dcc3e728SAndrew Litteken; CHECK:       test1:
96f4b925eeSMatt Arsenault; CHECK-NEXT:    [[E:%.*]] = load i32, ptr [[TMP0:%.*]], align 4
97dcc3e728SAndrew Litteken; CHECK-NEXT:    [[TMP3:%.*]] = add i32 [[TMP1:%.*]], [[TMP1]]
98dcc3e728SAndrew Litteken; CHECK-NEXT:    br i1 true, label [[FIRST_SPLIT]], label [[TEST:%.*]]
99dcc3e728SAndrew Litteken; CHECK:       test:
100f4b925eeSMatt 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 [ [[D]], [[TEST]] ], [ [[E]], [[TEST1]] ], [ [[TMP1]], [[ENTRY_TO_OUTLINE]] ]
104dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[FIRST_EXITSTUB:%.*]]
105dcc3e728SAndrew Litteken; CHECK:       first.exitStub:
106f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[DOTCE]], ptr [[TMP2:%.*]], align 4
107dcc3e728SAndrew Litteken; CHECK-NEXT:    ret i1 true
108dcc3e728SAndrew Litteken; CHECK:       next.exitStub:
109dcc3e728SAndrew Litteken; CHECK-NEXT:    ret i1 false
110dcc3e728SAndrew Litteken;
111