xref: /llvm-project/llvm/test/Transforms/IROutliner/gvn-output-set-overload.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 differentiate between outputs of the region stored in PHINodes
5dcc3e728SAndrew Litteken; versus those stored outside of PHINodes.
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  ret void
23dcc3e728SAndrew Litteken}
24dcc3e728SAndrew Litteken
25*f4b925eeSMatt Arsenaultdefine void @function2(ptr %a, ptr %b) {
26dcc3e728SAndrew Littekenentry:
27dcc3e728SAndrew Litteken  %0 = alloca i32, align 4
28*f4b925eeSMatt Arsenault  %c = load i32, ptr %0, align 4
29dcc3e728SAndrew Litteken  br label %test1
30dcc3e728SAndrew Littekentest1:
31*f4b925eeSMatt Arsenault  %e = load i32, ptr %0, align 4
32dcc3e728SAndrew Litteken  br i1 true, label %first, label %test
33dcc3e728SAndrew Littekentest:
34*f4b925eeSMatt Arsenault  %d = load i32, ptr %0, align 4
35dcc3e728SAndrew Litteken  br i1 true, label %first, label %next
36dcc3e728SAndrew Littekenfirst:
37dcc3e728SAndrew Litteken  ret void
38dcc3e728SAndrew Littekennext:
39dcc3e728SAndrew Litteken  %1 = add i32 %c, 1
40dcc3e728SAndrew Litteken  %2 = add i32 %e, 1
41dcc3e728SAndrew Litteken  ret void
42dcc3e728SAndrew Litteken}
43dcc3e728SAndrew Litteken; CHECK-LABEL: @function1(
44dcc3e728SAndrew Litteken; CHECK-NEXT:  entry:
45dcc3e728SAndrew Litteken; CHECK-NEXT:    [[DOTCE_LOC:%.*]] = alloca i32, align 4
46dcc3e728SAndrew Litteken; CHECK-NEXT:    [[TMP0:%.*]] = alloca i32, align 4
47*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[DOTCE_LOC]])
48*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call i1 @outlined_ir_func_0(ptr [[TMP0]], ptr [[DOTCE_LOC]], ptr null, i32 0)
49*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[DOTCE_RELOAD:%.*]] = load i32, ptr [[DOTCE_LOC]], align 4
50*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[DOTCE_LOC]])
51dcc3e728SAndrew Litteken; CHECK-NEXT:    br i1 [[TMP1]], label [[FIRST:%.*]], label [[NEXT:%.*]]
52dcc3e728SAndrew Litteken; CHECK:       first:
53dcc3e728SAndrew Litteken; CHECK-NEXT:    [[TMP2:%.*]] = phi i32 [ [[DOTCE_RELOAD]], [[ENTRY:%.*]] ]
54dcc3e728SAndrew Litteken; CHECK-NEXT:    ret void
55dcc3e728SAndrew Litteken; CHECK:       next:
56dcc3e728SAndrew Litteken; CHECK-NEXT:    ret void
57dcc3e728SAndrew Litteken;
58dcc3e728SAndrew Litteken;
59dcc3e728SAndrew Litteken; CHECK-LABEL: @function2(
60dcc3e728SAndrew Litteken; CHECK-NEXT:  entry:
61dcc3e728SAndrew Litteken; CHECK-NEXT:    [[E_LOC:%.*]] = alloca i32, align 4
62dcc3e728SAndrew Litteken; CHECK-NEXT:    [[C_LOC:%.*]] = alloca i32, align 4
63dcc3e728SAndrew Litteken; CHECK-NEXT:    [[TMP0:%.*]] = alloca i32, align 4
64*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[C_LOC]])
65*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[E_LOC]])
66*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = call i1 @outlined_ir_func_0(ptr [[TMP0]], ptr [[C_LOC]], ptr [[E_LOC]], i32 1)
67*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[C_RELOAD:%.*]] = load i32, ptr [[C_LOC]], align 4
68*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[E_RELOAD:%.*]] = load i32, ptr [[E_LOC]], align 4
69*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[C_LOC]])
70*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[E_LOC]])
71dcc3e728SAndrew Litteken; CHECK-NEXT:    br i1 [[TMP1]], label [[FIRST:%.*]], label [[NEXT:%.*]]
72dcc3e728SAndrew Litteken; CHECK:       first:
73dcc3e728SAndrew Litteken; CHECK-NEXT:    ret void
74dcc3e728SAndrew Litteken; CHECK:       next:
75dcc3e728SAndrew Litteken; CHECK-NEXT:    [[TMP2:%.*]] = add i32 [[C_RELOAD]], 1
76dcc3e728SAndrew Litteken; CHECK-NEXT:    [[TMP3:%.*]] = add i32 [[E_RELOAD]], 1
77dcc3e728SAndrew Litteken; CHECK-NEXT:    ret void
78dcc3e728SAndrew Litteken;
79dcc3e728SAndrew Litteken;
80dcc3e728SAndrew Litteken; CHECK-LABEL: define internal i1 @outlined_ir_func_0(
81dcc3e728SAndrew Litteken; CHECK-NEXT:  newFuncRoot:
82dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[ENTRY_TO_OUTLINE:%.*]]
83dcc3e728SAndrew Litteken; CHECK:       entry_to_outline:
84*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[C:%.*]] = load i32, ptr [[TMP0:%.*]], align 4
85dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[TEST1:%.*]]
86dcc3e728SAndrew Litteken; CHECK:       test1:
87*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[E:%.*]] = load i32, ptr [[TMP0]], align 4
88dcc3e728SAndrew Litteken; CHECK-NEXT:    br i1 true, label [[FIRST_SPLIT:%.*]], label [[TEST:%.*]]
89dcc3e728SAndrew Litteken; CHECK:       test:
90*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[D:%.*]] = load i32, ptr [[TMP0]], align 4
91dcc3e728SAndrew Litteken; CHECK-NEXT:    br i1 true, label [[FIRST_SPLIT]], label [[NEXT_EXITSTUB:%.*]]
92dcc3e728SAndrew Litteken; CHECK:       first.split:
93dcc3e728SAndrew Litteken; CHECK-NEXT:    [[DOTCE:%.*]] = phi i32 [ [[C]], [[TEST]] ], [ [[E]], [[TEST1]] ]
94dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[FIRST_EXITSTUB:%.*]]
95dcc3e728SAndrew Litteken; CHECK:       first.exitStub:
96dcc3e728SAndrew Litteken; CHECK-NEXT:    switch i32 [[TMP3:%.*]], label [[FINAL_BLOCK_1:%.*]] [
97dcc3e728SAndrew Litteken; CHECK-NEXT:    i32 0, label [[OUTPUT_BLOCK_0_1:%.*]]
98dcc3e728SAndrew Litteken; CHECK-NEXT:    i32 1, label [[OUTPUT_BLOCK_1_1:%.*]]
99dcc3e728SAndrew Litteken; CHECK-NEXT:    ]
100dcc3e728SAndrew Litteken; CHECK:       next.exitStub:
101dcc3e728SAndrew Litteken; CHECK-NEXT:    switch i32 [[TMP3]], label [[FINAL_BLOCK_0:%.*]] [
102dcc3e728SAndrew Litteken; CHECK-NEXT:    i32 0, label [[OUTPUT_BLOCK_1_0:%.*]]
103dcc3e728SAndrew Litteken; CHECK-NEXT:    ]
104dcc3e728SAndrew Litteken; CHECK:       output_block_0_1:
105*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[DOTCE]], ptr [[TMP1:%.*]], align 4
106dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[FINAL_BLOCK_1]]
107dcc3e728SAndrew Litteken; CHECK:       output_block_1_0:
108*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[C]], ptr [[TMP1]], align 4
109*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[E]], ptr [[TMP2:%.*]], align 4
110dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[FINAL_BLOCK_0]]
111dcc3e728SAndrew Litteken; CHECK:       output_block_1_1:
112*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[C]], ptr [[TMP1]], align 4
113*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[E]], ptr [[TMP2]], align 4
114dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[FINAL_BLOCK_1]]
115dcc3e728SAndrew Litteken; CHECK:       final_block_0:
116dcc3e728SAndrew Litteken; CHECK-NEXT:    ret i1 false
117dcc3e728SAndrew Litteken; CHECK:       final_block_1:
118dcc3e728SAndrew Litteken; CHECK-NEXT:    ret i1 true
119dcc3e728SAndrew Litteken;
120