xref: /llvm-project/llvm/test/Transforms/IROutliner/outlining-cost-model.ll (revision f4b925ee7078f058602fd323e25f45f1ae91ca34)
16df161a2SAndrew Litteken; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
29dd9575cSRoman Lebedev; RUN: opt -S -passes=verify,iroutliner < %s | FileCheck %s
39dd9575cSRoman Lebedev; RUN: opt -S -passes=verify,iroutliner -ir-outlining-no-cost < %s | FileCheck %s -check-prefix=NOCOST
46df161a2SAndrew Litteken
56df161a2SAndrew Litteken; This test checks that we have different results from when the cost model
66df161a2SAndrew Litteken; is on versus when it is off.  That is, if the number of instructions needed to
76df161a2SAndrew Litteken; handle the arguments is greater than the number of instructions being added,
86df161a2SAndrew Litteken; we do not outline.
96df161a2SAndrew Litteken
106df161a2SAndrew Littekendefine void @function1() #0 {
116df161a2SAndrew Litteken; CHECK-LABEL: @function1(
126df161a2SAndrew Litteken; CHECK-NEXT:  entry:
136df161a2SAndrew Litteken; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4
146df161a2SAndrew Litteken; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
15*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @outlined_ir_func_0(ptr [[A]], ptr [[B]])
166df161a2SAndrew Litteken; CHECK-NEXT:    ret void
176df161a2SAndrew Litteken;
186df161a2SAndrew Litteken; NOCOST-LABEL: @function1(
196df161a2SAndrew Litteken; NOCOST-NEXT:  entry:
206df161a2SAndrew Litteken; NOCOST-NEXT:    [[A:%.*]] = alloca i32, align 4
216df161a2SAndrew Litteken; NOCOST-NEXT:    [[B:%.*]] = alloca i32, align 4
22*f4b925eeSMatt Arsenault; NOCOST-NEXT:    call void @outlined_ir_func_0(ptr [[A]], ptr [[B]])
236df161a2SAndrew Litteken; NOCOST-NEXT:    ret void
246df161a2SAndrew Litteken;
256df161a2SAndrew Littekenentry:
266df161a2SAndrew Litteken  %a = alloca i32, align 4
276df161a2SAndrew Litteken  %b = alloca i32, align 4
28*f4b925eeSMatt Arsenault  %0 = load i32, ptr %a, align 4
29*f4b925eeSMatt Arsenault  %1 = load i32, ptr %b, align 4
306df161a2SAndrew Litteken  %add = add i32 %0, %1
316df161a2SAndrew Litteken  %mul = mul i32 %0, %1
326df161a2SAndrew Litteken  %sub = sub i32 %0, %1
336df161a2SAndrew Litteken  %div = sdiv i32 %0, %1
345c951623SAndrew Litteken  %add1 = add i32 %0, %1
355c951623SAndrew Litteken  %mul1 = mul i32 %0, %1
365c951623SAndrew Litteken  %sub1 = sub i32 %0, %1
375c951623SAndrew Litteken  %div1 = sdiv i32 %0, %1
386df161a2SAndrew Litteken  %add2 = add i32 %0, %1
396df161a2SAndrew Litteken  %mul2 = mul i32 %0, %1
406df161a2SAndrew Litteken  %sub2 = sub i32 %0, %1
416df161a2SAndrew Litteken  %div2 = sdiv i32 %0, %1
426df161a2SAndrew Litteken  ret void
436df161a2SAndrew Litteken}
446df161a2SAndrew Litteken
456df161a2SAndrew Littekendefine void @function2() #0 {
466df161a2SAndrew Litteken; CHECK-LABEL: @function2(
476df161a2SAndrew Litteken; CHECK-NEXT:  entry:
486df161a2SAndrew Litteken; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4
496df161a2SAndrew Litteken; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
50*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @outlined_ir_func_0(ptr [[A]], ptr [[B]])
516df161a2SAndrew Litteken; CHECK-NEXT:    ret void
526df161a2SAndrew Litteken;
536df161a2SAndrew Litteken; NOCOST-LABEL: @function2(
546df161a2SAndrew Litteken; NOCOST-NEXT:  entry:
556df161a2SAndrew Litteken; NOCOST-NEXT:    [[A:%.*]] = alloca i32, align 4
566df161a2SAndrew Litteken; NOCOST-NEXT:    [[B:%.*]] = alloca i32, align 4
57*f4b925eeSMatt Arsenault; NOCOST-NEXT:    call void @outlined_ir_func_0(ptr [[A]], ptr [[B]])
586df161a2SAndrew Litteken; NOCOST-NEXT:    ret void
596df161a2SAndrew Litteken;
606df161a2SAndrew Littekenentry:
616df161a2SAndrew Litteken  %a = alloca i32, align 4
626df161a2SAndrew Litteken  %b = alloca i32, align 4
63*f4b925eeSMatt Arsenault  %0 = load i32, ptr %a, align 4
64*f4b925eeSMatt Arsenault  %1 = load i32, ptr %b, align 4
656df161a2SAndrew Litteken  %add = add i32 %0, %1
666df161a2SAndrew Litteken  %mul = mul i32 %0, %1
676df161a2SAndrew Litteken  %sub = sub i32 %0, %1
686df161a2SAndrew Litteken  %div = sdiv i32 %0, %1
695c951623SAndrew Litteken  %add1 = add i32 %0, %1
705c951623SAndrew Litteken  %mul1 = mul i32 %0, %1
715c951623SAndrew Litteken  %sub1 = sub i32 %0, %1
725c951623SAndrew Litteken  %div1 = sdiv i32 %0, %1
736df161a2SAndrew Litteken  %add2 = add i32 %0, %1
746df161a2SAndrew Litteken  %mul2 = mul i32 %0, %1
756df161a2SAndrew Litteken  %sub2 = sub i32 %0, %1
766df161a2SAndrew Litteken  %div2 = sdiv i32 %0, %1
776df161a2SAndrew Litteken  ret void
786df161a2SAndrew Litteken}
796df161a2SAndrew Litteken
806df161a2SAndrew Littekendefine void @function3() #0 {
816df161a2SAndrew Litteken; CHECK-LABEL: @function3(
826df161a2SAndrew Litteken; CHECK-NEXT:  entry:
836df161a2SAndrew Litteken; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4
846df161a2SAndrew Litteken; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
856df161a2SAndrew Litteken; CHECK-NEXT:    [[OUTPUT:%.*]] = alloca i32, align 4
866df161a2SAndrew Litteken; CHECK-NEXT:    [[RESULT:%.*]] = alloca i32, align 4
87*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 2, ptr [[A]], align 4
88*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 3, ptr [[B]], align 4
89*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
90*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[B]], align 4
916df161a2SAndrew Litteken; CHECK-NEXT:    [[ADD:%.*]] = add i32 [[TMP0]], [[TMP1]]
92*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[ADD]], ptr [[OUTPUT]], align 4
93*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[OUTPUT]], align 4
94*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[OUTPUT]], align 4
956df161a2SAndrew Litteken; CHECK-NEXT:    [[MUL:%.*]] = mul i32 [[TMP2]], [[ADD]]
96*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[MUL]], ptr [[RESULT]], align 4
976df161a2SAndrew Litteken; CHECK-NEXT:    ret void
986df161a2SAndrew Litteken;
996df161a2SAndrew Litteken; NOCOST-LABEL: @function3(
1006df161a2SAndrew Litteken; NOCOST-NEXT:  entry:
1016df161a2SAndrew Litteken; NOCOST-NEXT:    [[DOTLOC:%.*]] = alloca i32, align 4
1026df161a2SAndrew Litteken; NOCOST-NEXT:    [[ADD_LOC:%.*]] = alloca i32, align 4
1036df161a2SAndrew Litteken; NOCOST-NEXT:    [[A:%.*]] = alloca i32, align 4
1046df161a2SAndrew Litteken; NOCOST-NEXT:    [[B:%.*]] = alloca i32, align 4
1056df161a2SAndrew Litteken; NOCOST-NEXT:    [[OUTPUT:%.*]] = alloca i32, align 4
1066df161a2SAndrew Litteken; NOCOST-NEXT:    [[RESULT:%.*]] = alloca i32, align 4
107*f4b925eeSMatt Arsenault; NOCOST-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[ADD_LOC]])
108*f4b925eeSMatt Arsenault; NOCOST-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[DOTLOC]])
109*f4b925eeSMatt Arsenault; NOCOST-NEXT:    call void @outlined_ir_func_1(ptr [[A]], ptr [[B]], ptr [[OUTPUT]], ptr [[ADD_LOC]], ptr [[DOTLOC]])
110*f4b925eeSMatt Arsenault; NOCOST-NEXT:    [[ADD_RELOAD:%.*]] = load i32, ptr [[ADD_LOC]], align 4
111*f4b925eeSMatt Arsenault; NOCOST-NEXT:    [[DOTRELOAD:%.*]] = load i32, ptr [[DOTLOC]], align 4
112*f4b925eeSMatt Arsenault; NOCOST-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[ADD_LOC]])
113*f4b925eeSMatt Arsenault; NOCOST-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[DOTLOC]])
114*f4b925eeSMatt Arsenault; NOCOST-NEXT:    [[TMP0:%.*]] = load i32, ptr [[OUTPUT]], align 4
115*f4b925eeSMatt Arsenault; NOCOST-NEXT:    call void @outlined_ir_func_2(i32 [[DOTRELOAD]], i32 [[ADD_RELOAD]], ptr [[RESULT]])
1166df161a2SAndrew Litteken; NOCOST-NEXT:    ret void
1176df161a2SAndrew Litteken;
1186df161a2SAndrew Littekenentry:
1196df161a2SAndrew Litteken  %a = alloca i32, align 4
1206df161a2SAndrew Litteken  %b = alloca i32, align 4
1216df161a2SAndrew Litteken  %output = alloca i32, align 4
1226df161a2SAndrew Litteken  %result = alloca i32, align 4
123*f4b925eeSMatt Arsenault  store i32 2, ptr %a, align 4
124*f4b925eeSMatt Arsenault  store i32 3, ptr %b, align 4
125*f4b925eeSMatt Arsenault  %0 = load i32, ptr %a, align 4
126*f4b925eeSMatt Arsenault  %1 = load i32, ptr %b, align 4
1276df161a2SAndrew Litteken  %add = add i32 %0, %1
128*f4b925eeSMatt Arsenault  store i32 %add, ptr %output, align 4
129*f4b925eeSMatt Arsenault  %2 = load i32, ptr %output, align 4
130*f4b925eeSMatt Arsenault  %3 = load i32, ptr %output, align 4
1316df161a2SAndrew Litteken  %mul = mul i32 %2, %add
132*f4b925eeSMatt Arsenault  store i32 %mul, ptr %result, align 4
1336df161a2SAndrew Litteken  ret void
1346df161a2SAndrew Litteken}
1356df161a2SAndrew Litteken
1366df161a2SAndrew Littekendefine void @function4() #0 {
1376df161a2SAndrew Litteken; CHECK-LABEL: @function4(
1386df161a2SAndrew Litteken; CHECK-NEXT:  entry:
1396df161a2SAndrew Litteken; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4
1406df161a2SAndrew Litteken; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
1416df161a2SAndrew Litteken; CHECK-NEXT:    [[OUTPUT:%.*]] = alloca i32, align 4
1426df161a2SAndrew Litteken; CHECK-NEXT:    [[RESULT:%.*]] = alloca i32, align 4
143*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 2, ptr [[A]], align 4
144*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 3, ptr [[B]], align 4
145*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
146*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[B]], align 4
1476df161a2SAndrew Litteken; CHECK-NEXT:    [[ADD:%.*]] = add i32 [[TMP0]], [[TMP1]]
148*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[ADD]], ptr [[OUTPUT]], align 4
149*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[OUTPUT]], align 4
1506df161a2SAndrew Litteken; CHECK-NEXT:    [[MUL:%.*]] = mul i32 [[TMP2]], [[ADD]]
151*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[MUL]], ptr [[RESULT]], align 4
1526df161a2SAndrew Litteken; CHECK-NEXT:    ret void
1536df161a2SAndrew Litteken;
1546df161a2SAndrew Litteken; NOCOST-LABEL: @function4(
1556df161a2SAndrew Litteken; NOCOST-NEXT:  entry:
1566df161a2SAndrew Litteken; NOCOST-NEXT:    [[DOTLOC:%.*]] = alloca i32, align 4
1576df161a2SAndrew Litteken; NOCOST-NEXT:    [[ADD_LOC:%.*]] = alloca i32, align 4
1586df161a2SAndrew Litteken; NOCOST-NEXT:    [[A:%.*]] = alloca i32, align 4
1596df161a2SAndrew Litteken; NOCOST-NEXT:    [[B:%.*]] = alloca i32, align 4
1606df161a2SAndrew Litteken; NOCOST-NEXT:    [[OUTPUT:%.*]] = alloca i32, align 4
1616df161a2SAndrew Litteken; NOCOST-NEXT:    [[RESULT:%.*]] = alloca i32, align 4
162*f4b925eeSMatt Arsenault; NOCOST-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[ADD_LOC]])
163*f4b925eeSMatt Arsenault; NOCOST-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[DOTLOC]])
164*f4b925eeSMatt Arsenault; NOCOST-NEXT:    call void @outlined_ir_func_1(ptr [[A]], ptr [[B]], ptr [[OUTPUT]], ptr [[ADD_LOC]], ptr [[DOTLOC]])
165*f4b925eeSMatt Arsenault; NOCOST-NEXT:    [[ADD_RELOAD:%.*]] = load i32, ptr [[ADD_LOC]], align 4
166*f4b925eeSMatt Arsenault; NOCOST-NEXT:    [[DOTRELOAD:%.*]] = load i32, ptr [[DOTLOC]], align 4
167*f4b925eeSMatt Arsenault; NOCOST-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[ADD_LOC]])
168*f4b925eeSMatt Arsenault; NOCOST-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[DOTLOC]])
169*f4b925eeSMatt Arsenault; NOCOST-NEXT:    call void @outlined_ir_func_2(i32 [[DOTRELOAD]], i32 [[ADD_RELOAD]], ptr [[RESULT]])
1706df161a2SAndrew Litteken; NOCOST-NEXT:    ret void
1716df161a2SAndrew Litteken;
1726df161a2SAndrew Littekenentry:
1736df161a2SAndrew Litteken  %a = alloca i32, align 4
1746df161a2SAndrew Litteken  %b = alloca i32, align 4
1756df161a2SAndrew Litteken  %output = alloca i32, align 4
1766df161a2SAndrew Litteken  %result = alloca i32, align 4
177*f4b925eeSMatt Arsenault  store i32 2, ptr %a, align 4
178*f4b925eeSMatt Arsenault  store i32 3, ptr %b, align 4
179*f4b925eeSMatt Arsenault  %0 = load i32, ptr %a, align 4
180*f4b925eeSMatt Arsenault  %1 = load i32, ptr %b, align 4
1816df161a2SAndrew Litteken  %add = add i32 %0, %1
182*f4b925eeSMatt Arsenault  store i32 %add, ptr %output, align 4
183*f4b925eeSMatt Arsenault  %2 = load i32, ptr %output, align 4
1846df161a2SAndrew Litteken  %mul = mul i32 %2, %add
185*f4b925eeSMatt Arsenault  store i32 %mul, ptr %result, align 4
1866df161a2SAndrew Litteken  ret void
1876df161a2SAndrew Litteken}
188