xref: /llvm-project/llvm/test/Transforms/IROutliner/outlining-different-output-blocks.ll (revision f4b925ee7078f058602fd323e25f45f1ae91ca34)
1e6ae6233SAndrew Litteken; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
29dd9575cSRoman Lebedev; RUN: opt -S -passes=iroutliner -ir-outlining-no-cost < %s | FileCheck %s
3e6ae6233SAndrew Litteken
4e6ae6233SAndrew Litteken; These functions are constructed slightly differently so that they require
5e6ae6233SAndrew Litteken; different output blocks for the values used outside of the region. We are
6e6ae6233SAndrew Litteken; checking that two output blocks are created with different values.
7e6ae6233SAndrew Litteken
8e6ae6233SAndrew Littekendefine void @outline_outputs1() #0 {
9e6ae6233SAndrew Litteken; CHECK-LABEL: @outline_outputs1(
10e6ae6233SAndrew Litteken; CHECK-NEXT:  entry:
11e6ae6233SAndrew Litteken; CHECK-NEXT:    [[DOTLOC:%.*]] = alloca i32, align 4
12e6ae6233SAndrew Litteken; CHECK-NEXT:    [[ADD_LOC:%.*]] = alloca i32, align 4
13e6ae6233SAndrew Litteken; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4
14e6ae6233SAndrew Litteken; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
15e6ae6233SAndrew Litteken; CHECK-NEXT:    [[OUTPUT:%.*]] = alloca i32, align 4
16e6ae6233SAndrew Litteken; CHECK-NEXT:    [[RESULT:%.*]] = alloca i32, align 4
17*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[ADD_LOC]])
18*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[DOTLOC]])
19*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @outlined_ir_func_0(ptr [[A]], ptr [[B]], ptr [[OUTPUT]], ptr [[ADD_LOC]], ptr [[DOTLOC]], i32 0)
20*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[ADD_RELOAD:%.*]] = load i32, ptr [[ADD_LOC]], align 4
21*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[DOTRELOAD:%.*]] = load i32, ptr [[DOTLOC]], align 4
22*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[ADD_LOC]])
23*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[DOTLOC]])
24*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[OUTPUT]], align 4
25*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @outlined_ir_func_1(i32 [[DOTRELOAD]], i32 [[ADD_RELOAD]], ptr [[RESULT]])
26e6ae6233SAndrew Litteken; CHECK-NEXT:    ret void
27e6ae6233SAndrew Litteken;
28e6ae6233SAndrew Littekenentry:
29e6ae6233SAndrew Litteken  %a = alloca i32, align 4
30e6ae6233SAndrew Litteken  %b = alloca i32, align 4
31e6ae6233SAndrew Litteken  %output = alloca i32, align 4
32e6ae6233SAndrew Litteken  %result = alloca i32, align 4
33*f4b925eeSMatt Arsenault  store i32 2, ptr %a, align 4
34*f4b925eeSMatt Arsenault  store i32 3, ptr %b, align 4
35*f4b925eeSMatt Arsenault  %0 = load i32, ptr %a, align 4
36*f4b925eeSMatt Arsenault  %1 = load i32, ptr %b, align 4
37e6ae6233SAndrew Litteken  %add = add i32 %0, %1
38e6ae6233SAndrew Litteken  %sub = sub i32 %0, %1
39*f4b925eeSMatt Arsenault  store i32 %add, ptr %output, align 4
40*f4b925eeSMatt Arsenault  %2 = load i32, ptr %output, align 4
41*f4b925eeSMatt Arsenault  %3 = load i32, ptr %output, align 4
42e6ae6233SAndrew Litteken  %mul = mul i32 %2, %add
43*f4b925eeSMatt Arsenault  store i32 %mul, ptr %result, align 4
44e6ae6233SAndrew Litteken  ret void
45e6ae6233SAndrew Litteken}
46e6ae6233SAndrew Litteken
47e6ae6233SAndrew Littekendefine void @outline_outputs2() #0 {
48e6ae6233SAndrew Litteken; CHECK-LABEL: @outline_outputs2(
49e6ae6233SAndrew Litteken; CHECK-NEXT:  entry:
50e6ae6233SAndrew Litteken; CHECK-NEXT:    [[DOTLOC:%.*]] = alloca i32, align 4
51e6ae6233SAndrew Litteken; CHECK-NEXT:    [[SUB_LOC:%.*]] = alloca i32, align 4
52e6ae6233SAndrew Litteken; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4
53e6ae6233SAndrew Litteken; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
54e6ae6233SAndrew Litteken; CHECK-NEXT:    [[OUTPUT:%.*]] = alloca i32, align 4
55e6ae6233SAndrew Litteken; CHECK-NEXT:    [[RESULT:%.*]] = alloca i32, align 4
56*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[SUB_LOC]])
57*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[DOTLOC]])
58*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @outlined_ir_func_0(ptr [[A]], ptr [[B]], ptr [[OUTPUT]], ptr [[SUB_LOC]], ptr [[DOTLOC]], i32 1)
59*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[SUB_RELOAD:%.*]] = load i32, ptr [[SUB_LOC]], align 4
60*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[DOTRELOAD:%.*]] = load i32, ptr [[DOTLOC]], align 4
61*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[SUB_LOC]])
62*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[DOTLOC]])
63*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @outlined_ir_func_1(i32 [[DOTRELOAD]], i32 [[SUB_RELOAD]], ptr [[RESULT]])
64e6ae6233SAndrew Litteken; CHECK-NEXT:    ret void
65e6ae6233SAndrew Litteken;
66e6ae6233SAndrew Littekenentry:
67e6ae6233SAndrew Litteken  %a = alloca i32, align 4
68e6ae6233SAndrew Litteken  %b = alloca i32, align 4
69e6ae6233SAndrew Litteken  %output = alloca i32, align 4
70e6ae6233SAndrew Litteken  %result = alloca i32, align 4
71*f4b925eeSMatt Arsenault  store i32 2, ptr %a, align 4
72*f4b925eeSMatt Arsenault  store i32 3, ptr %b, align 4
73*f4b925eeSMatt Arsenault  %0 = load i32, ptr %a, align 4
74*f4b925eeSMatt Arsenault  %1 = load i32, ptr %b, align 4
75e6ae6233SAndrew Litteken  %add = add i32 %0, %1
76e6ae6233SAndrew Litteken  %sub = sub i32 %0, %1
77*f4b925eeSMatt Arsenault  store i32 %add, ptr %output, align 4
78*f4b925eeSMatt Arsenault  %2 = load i32, ptr %output, align 4
79e6ae6233SAndrew Litteken  %mul = mul i32 %2, %sub
80*f4b925eeSMatt Arsenault  store i32 %mul, ptr %result, align 4
81e6ae6233SAndrew Litteken  ret void
82e6ae6233SAndrew Litteken}
83e6ae6233SAndrew Litteken
84*f4b925eeSMatt Arsenault; CHECK: define internal void @outlined_ir_func_0(ptr [[ARG0:%.*]], ptr [[ARG1:%.*]], ptr [[ARG2:%.*]], ptr [[ARG3:%.*]], ptr [[ARG4:%.*]], i32 [[ARG5:%.*]]) #1 {
85e6ae6233SAndrew Litteken; CHECK: entry_to_outline:
86*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 2, ptr [[ARG0]], align 4
87*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 3, ptr [[ARG1]], align 4
88*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARG0]], align 4
89*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[ARG1]], align 4
90e6ae6233SAndrew Litteken; CHECK-NEXT:    [[ADD:%.*]] = add i32 [[TMP0]], [[TMP1]]
91e6ae6233SAndrew Litteken; CHECK-NEXT:    [[SUB:%.*]] = sub i32 [[TMP0]], [[TMP1]]
92*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[ADD]], ptr [[ARG2]], align 4
93*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[ARG2]], align 4
94e6ae6233SAndrew Litteken
952e192ab1SVyacheslav Zakharin; CHECK: _after_outline.exitStub:
962e192ab1SVyacheslav Zakharin; CHECK-NEXT:    switch i32 [[ARG5]], label [[BLOCK:%.*]] [
972e192ab1SVyacheslav Zakharin; CHECK-NEXT:      i32 0, label %[[BLOCK_0:.*]]
982e192ab1SVyacheslav Zakharin; CHECK-NEXT:      i32 1, label %[[BLOCK_1:.*]]
992e192ab1SVyacheslav Zakharin
100e6ae6233SAndrew Litteken; CHECK: [[BLOCK_0]]:
101*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[ADD]], ptr [[ARG3]], align 4
102*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[TMP2]], ptr [[ARG4]], align 4
103e6ae6233SAndrew Litteken
104e6ae6233SAndrew Litteken; CHECK: [[BLOCK_1]]:
105*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[SUB]], ptr [[ARG3]], align 4
106*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[TMP2]], ptr [[ARG4]], align 4
107