xref: /llvm-project/llvm/test/Transforms/IROutliner/outlining-compatible-and-attribute-transfer.ll (revision f4b925ee7078f058602fd323e25f45f1ae91ca34)
11a9eb19aSAndrew Litteken; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
29dd9575cSRoman Lebedev; RUN: opt -S -passes=verify,iroutliner -ir-outlining-no-cost < %s | FileCheck %s
31a9eb19aSAndrew Litteken
41a9eb19aSAndrew Litteken; This has two compatible regions based on function attributes.  We have
51a9eb19aSAndrew Litteken; attributes that should be transferred only if it is on all of the regions.
61a9eb19aSAndrew Litteken
71a9eb19aSAndrew Litteken; This includes the attributes, no-nans-fp-math,
81a9eb19aSAndrew Litteken; no-signed-zeros-fp-math, less-precise-fpmad, unsafe-fp-math, and
91a9eb19aSAndrew Litteken; no-infs-fp-math.  Only when each instance of similarity has these attributes
101a9eb19aSAndrew Litteken; can we say that the outlined function can have these attributes since that
111a9eb19aSAndrew Litteken; is the more general case for these attributes.
121a9eb19aSAndrew Litteken
131a9eb19aSAndrew Littekendefine void @outline_attrs1() #0 {
141a9eb19aSAndrew Litteken; CHECK-LABEL: @outline_attrs1(
151a9eb19aSAndrew Litteken; CHECK-NEXT:  entry:
161a9eb19aSAndrew Litteken; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4
171a9eb19aSAndrew Litteken; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
181a9eb19aSAndrew Litteken; CHECK-NEXT:    [[C:%.*]] = alloca i32, align 4
19*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @outlined_ir_func_1(ptr [[A]], ptr [[B]], ptr [[C]])
201a9eb19aSAndrew Litteken; CHECK-NEXT:    ret void
211a9eb19aSAndrew Litteken;
221a9eb19aSAndrew Littekenentry:
231a9eb19aSAndrew Litteken  %a = alloca i32, align 4
241a9eb19aSAndrew Litteken  %b = alloca i32, align 4
251a9eb19aSAndrew Litteken  %c = alloca i32, align 4
26*f4b925eeSMatt Arsenault  store i32 2, ptr %a, align 4
27*f4b925eeSMatt Arsenault  store i32 3, ptr %b, align 4
28*f4b925eeSMatt Arsenault  store i32 4, ptr %c, align 4
29*f4b925eeSMatt Arsenault  %al = load i32, ptr %a
30*f4b925eeSMatt Arsenault  %bl = load i32, ptr %b
31*f4b925eeSMatt Arsenault  %cl = load i32, ptr %c
321a9eb19aSAndrew Litteken  ret void
331a9eb19aSAndrew Litteken}
341a9eb19aSAndrew Litteken
351a9eb19aSAndrew Littekendefine void @outline_attrs2() #0 {
361a9eb19aSAndrew Litteken; CHECK-LABEL: @outline_attrs2(
371a9eb19aSAndrew Litteken; CHECK-NEXT:  entry:
381a9eb19aSAndrew Litteken; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4
391a9eb19aSAndrew Litteken; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
401a9eb19aSAndrew Litteken; CHECK-NEXT:    [[C:%.*]] = alloca i32, align 4
41*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @outlined_ir_func_1(ptr [[A]], ptr [[B]], ptr [[C]])
421a9eb19aSAndrew Litteken; CHECK-NEXT:    ret void
431a9eb19aSAndrew Litteken;
441a9eb19aSAndrew Littekenentry:
451a9eb19aSAndrew Litteken  %a = alloca i32, align 4
461a9eb19aSAndrew Litteken  %b = alloca i32, align 4
471a9eb19aSAndrew Litteken  %c = alloca i32, align 4
48*f4b925eeSMatt Arsenault  store i32 2, ptr %a, align 4
49*f4b925eeSMatt Arsenault  store i32 3, ptr %b, align 4
50*f4b925eeSMatt Arsenault  store i32 4, ptr %c, align 4
51*f4b925eeSMatt Arsenault  %al = load i32, ptr %a
52*f4b925eeSMatt Arsenault  %bl = load i32, ptr %b
53*f4b925eeSMatt Arsenault  %cl = load i32, ptr %c
541a9eb19aSAndrew Litteken  ret void
551a9eb19aSAndrew Litteken}
561a9eb19aSAndrew Litteken
571a9eb19aSAndrew Littekendefine void @outline_attrs3() #0 {
581a9eb19aSAndrew Litteken; CHECK-LABEL: @outline_attrs3(
591a9eb19aSAndrew Litteken; CHECK-NEXT:  entry:
601a9eb19aSAndrew Litteken; CHECK-NEXT:    [[A:%.*]] = alloca float, align 4
611a9eb19aSAndrew Litteken; CHECK-NEXT:    [[B:%.*]] = alloca float, align 4
621a9eb19aSAndrew Litteken; CHECK-NEXT:    [[C:%.*]] = alloca float, align 4
63*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @outlined_ir_func_0(ptr [[A]], ptr [[B]], ptr [[C]])
641a9eb19aSAndrew Litteken; CHECK-NEXT:    ret void
651a9eb19aSAndrew Litteken;
661a9eb19aSAndrew Littekenentry:
671a9eb19aSAndrew Litteken  %a = alloca float, align 4
681a9eb19aSAndrew Litteken  %b = alloca float, align 4
691a9eb19aSAndrew Litteken  %c = alloca float, align 4
70*f4b925eeSMatt Arsenault  store float 2.0, ptr %a, align 4
71*f4b925eeSMatt Arsenault  store float 3.0, ptr %b, align 4
72*f4b925eeSMatt Arsenault  store float 4.0, ptr %c, align 4
73*f4b925eeSMatt Arsenault  %al = load float, ptr %a
74*f4b925eeSMatt Arsenault  %bl = load float, ptr %b
75*f4b925eeSMatt Arsenault  %cl = load float, ptr %c
761a9eb19aSAndrew Litteken  %0 = fmul float %al, %bl
771a9eb19aSAndrew Litteken  ret void
781a9eb19aSAndrew Litteken}
791a9eb19aSAndrew Litteken
801a9eb19aSAndrew Littekendefine void @outline_attrs4() {
811a9eb19aSAndrew Litteken; CHECK-LABEL: @outline_attrs4(
821a9eb19aSAndrew Litteken; CHECK-NEXT:  entry:
831a9eb19aSAndrew Litteken; CHECK-NEXT:    [[A:%.*]] = alloca float, align 4
841a9eb19aSAndrew Litteken; CHECK-NEXT:    [[B:%.*]] = alloca float, align 4
851a9eb19aSAndrew Litteken; CHECK-NEXT:    [[C:%.*]] = alloca float, align 4
86*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @outlined_ir_func_0(ptr [[A]], ptr [[B]], ptr [[C]])
871a9eb19aSAndrew Litteken; CHECK-NEXT:    ret void
881a9eb19aSAndrew Litteken;
891a9eb19aSAndrew Littekenentry:
901a9eb19aSAndrew Litteken  %a = alloca float, align 4
911a9eb19aSAndrew Litteken  %b = alloca float, align 4
921a9eb19aSAndrew Litteken  %c = alloca float, align 4
93*f4b925eeSMatt Arsenault  store float 2.0, ptr %a, align 4
94*f4b925eeSMatt Arsenault  store float 3.0, ptr %b, align 4
95*f4b925eeSMatt Arsenault  store float 4.0, ptr %c, align 4
96*f4b925eeSMatt Arsenault  %al = load float, ptr %a
97*f4b925eeSMatt Arsenault  %bl = load float, ptr %b
98*f4b925eeSMatt Arsenault  %cl = load float, ptr %c
991a9eb19aSAndrew Litteken  %0 = fmul float %al, %bl
1001a9eb19aSAndrew Litteken  ret void
1011a9eb19aSAndrew Litteken}
1021a9eb19aSAndrew Litteken
1031a9eb19aSAndrew Littekenattributes #0 = { "no-nans-fp-math"="true" "no-signed-zeros-fp-math"="true" "less-precise-fpmad"="true"
1041a9eb19aSAndrew Litteken"unsafe-fp-math"="true" "no-infs-fp-math"="true"}
1051a9eb19aSAndrew Litteken
106*f4b925eeSMatt Arsenault; CHECK: define internal void @outlined_ir_func_0(ptr [[ARG0:%.*]], ptr [[ARG1:%.*]], ptr [[ARG2:%.*]]) [[ATTR1:#[0-9]+]] {
1071a9eb19aSAndrew Litteken; CHECK: entry_to_outline:
108*f4b925eeSMatt Arsenault; CHECK-NEXT:    store float 2.000000e+00, ptr [[ARG0]], align 4
109*f4b925eeSMatt Arsenault; CHECK-NEXT:    store float 3.000000e+00, ptr [[ARG1]], align 4
110*f4b925eeSMatt Arsenault; CHECK-NEXT:    store float 4.000000e+00, ptr [[ARG2]], align 4
111*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[AL:%.*]] = load float, ptr [[ARG0]], align 4
112*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[BL:%.*]] = load float, ptr [[ARG1]], align 4
113*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[CL:%.*]] = load float, ptr [[ARG2]], align 4
1141a9eb19aSAndrew Litteken
115*f4b925eeSMatt Arsenault; CHECK: define internal void @outlined_ir_func_1(ptr [[ARG0:%.*]], ptr [[ARG1:%.*]], ptr [[ARG2:%.*]]) [[ATTR:#[0-9]+]] {
1161a9eb19aSAndrew Litteken; CHECK: entry_to_outline:
117*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 2, ptr [[ARG0]], align 4
118*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 3, ptr [[ARG1]], align 4
119*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 4, ptr [[ARG2]], align 4
120*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[AL:%.*]] = load i32, ptr [[ARG0]], align 4
121*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[BL:%.*]] = load i32, ptr [[ARG1]], align 4
122*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[CL:%.*]] = load i32, ptr [[ARG2]], align 4
1231a9eb19aSAndrew Litteken
1241a9eb19aSAndrew Litteken
1251a9eb19aSAndrew Litteken; 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" }
1261a9eb19aSAndrew Litteken; 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