xref: /llvm-project/llvm/test/Transforms/IROutliner/outlining-compatible-and-attribute-transfer.ll (revision f4b925ee7078f058602fd323e25f45f1ae91ca34)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -S -passes=verify,iroutliner -ir-outlining-no-cost < %s | FileCheck %s
3
4; This has two compatible regions based on function attributes.  We have
5; attributes that should be transferred only if it is on all of the regions.
6
7; This includes the attributes, no-nans-fp-math,
8; no-signed-zeros-fp-math, less-precise-fpmad, unsafe-fp-math, and
9; no-infs-fp-math.  Only when each instance of similarity has these attributes
10; can we say that the outlined function can have these attributes since that
11; is the more general case for these attributes.
12
13define void @outline_attrs1() #0 {
14; CHECK-LABEL: @outline_attrs1(
15; CHECK-NEXT:  entry:
16; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4
17; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
18; CHECK-NEXT:    [[C:%.*]] = alloca i32, align 4
19; CHECK-NEXT:    call void @outlined_ir_func_1(ptr [[A]], ptr [[B]], ptr [[C]])
20; CHECK-NEXT:    ret void
21;
22entry:
23  %a = alloca i32, align 4
24  %b = alloca i32, align 4
25  %c = alloca i32, align 4
26  store i32 2, ptr %a, align 4
27  store i32 3, ptr %b, align 4
28  store i32 4, ptr %c, align 4
29  %al = load i32, ptr %a
30  %bl = load i32, ptr %b
31  %cl = load i32, ptr %c
32  ret void
33}
34
35define void @outline_attrs2() #0 {
36; CHECK-LABEL: @outline_attrs2(
37; CHECK-NEXT:  entry:
38; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4
39; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
40; CHECK-NEXT:    [[C:%.*]] = alloca i32, align 4
41; CHECK-NEXT:    call void @outlined_ir_func_1(ptr [[A]], ptr [[B]], ptr [[C]])
42; CHECK-NEXT:    ret void
43;
44entry:
45  %a = alloca i32, align 4
46  %b = alloca i32, align 4
47  %c = alloca i32, align 4
48  store i32 2, ptr %a, align 4
49  store i32 3, ptr %b, align 4
50  store i32 4, ptr %c, align 4
51  %al = load i32, ptr %a
52  %bl = load i32, ptr %b
53  %cl = load i32, ptr %c
54  ret void
55}
56
57define void @outline_attrs3() #0 {
58; CHECK-LABEL: @outline_attrs3(
59; CHECK-NEXT:  entry:
60; CHECK-NEXT:    [[A:%.*]] = alloca float, align 4
61; CHECK-NEXT:    [[B:%.*]] = alloca float, align 4
62; CHECK-NEXT:    [[C:%.*]] = alloca float, align 4
63; CHECK-NEXT:    call void @outlined_ir_func_0(ptr [[A]], ptr [[B]], ptr [[C]])
64; CHECK-NEXT:    ret void
65;
66entry:
67  %a = alloca float, align 4
68  %b = alloca float, align 4
69  %c = alloca float, align 4
70  store float 2.0, ptr %a, align 4
71  store float 3.0, ptr %b, align 4
72  store float 4.0, ptr %c, align 4
73  %al = load float, ptr %a
74  %bl = load float, ptr %b
75  %cl = load float, ptr %c
76  %0 = fmul float %al, %bl
77  ret void
78}
79
80define void @outline_attrs4() {
81; CHECK-LABEL: @outline_attrs4(
82; CHECK-NEXT:  entry:
83; CHECK-NEXT:    [[A:%.*]] = alloca float, align 4
84; CHECK-NEXT:    [[B:%.*]] = alloca float, align 4
85; CHECK-NEXT:    [[C:%.*]] = alloca float, align 4
86; CHECK-NEXT:    call void @outlined_ir_func_0(ptr [[A]], ptr [[B]], ptr [[C]])
87; CHECK-NEXT:    ret void
88;
89entry:
90  %a = alloca float, align 4
91  %b = alloca float, align 4
92  %c = alloca float, align 4
93  store float 2.0, ptr %a, align 4
94  store float 3.0, ptr %b, align 4
95  store float 4.0, ptr %c, align 4
96  %al = load float, ptr %a
97  %bl = load float, ptr %b
98  %cl = load float, ptr %c
99  %0 = fmul float %al, %bl
100  ret void
101}
102
103attributes #0 = { "no-nans-fp-math"="true" "no-signed-zeros-fp-math"="true" "less-precise-fpmad"="true"
104"unsafe-fp-math"="true" "no-infs-fp-math"="true"}
105
106; CHECK: define internal void @outlined_ir_func_0(ptr [[ARG0:%.*]], ptr [[ARG1:%.*]], ptr [[ARG2:%.*]]) [[ATTR1:#[0-9]+]] {
107; CHECK: entry_to_outline:
108; CHECK-NEXT:    store float 2.000000e+00, ptr [[ARG0]], align 4
109; CHECK-NEXT:    store float 3.000000e+00, ptr [[ARG1]], align 4
110; CHECK-NEXT:    store float 4.000000e+00, ptr [[ARG2]], align 4
111; CHECK-NEXT:    [[AL:%.*]] = load float, ptr [[ARG0]], align 4
112; CHECK-NEXT:    [[BL:%.*]] = load float, ptr [[ARG1]], align 4
113; CHECK-NEXT:    [[CL:%.*]] = load float, ptr [[ARG2]], align 4
114
115; CHECK: define internal void @outlined_ir_func_1(ptr [[ARG0:%.*]], ptr [[ARG1:%.*]], ptr [[ARG2:%.*]]) [[ATTR:#[0-9]+]] {
116; CHECK: entry_to_outline:
117; CHECK-NEXT:    store i32 2, ptr [[ARG0]], align 4
118; CHECK-NEXT:    store i32 3, ptr [[ARG1]], align 4
119; CHECK-NEXT:    store i32 4, ptr [[ARG2]], align 4
120; CHECK-NEXT:    [[AL:%.*]] = load i32, ptr [[ARG0]], align 4
121; CHECK-NEXT:    [[BL:%.*]] = load i32, ptr [[ARG1]], align 4
122; CHECK-NEXT:    [[CL:%.*]] = load i32, ptr [[ARG2]], align 4
123
124
125; CHECK: attributes [[ATTR1]] =   { minsize optsize "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "unsafe-fp-math"="false" }
126; CHECK: attributes [[ATTR]] = { minsize optsize "less-precise-fpmad"="true" "no-infs-fp-math"="true" "no-nans-fp-math"="true" "no-signed-zeros-fp-math"="true" "unsafe-fp-math"="true" }
127