[llvm] [FuncSpec] Consider literal constants of recursive functions (PR #111162)
Alexandros Lamprineas via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 7 05:21:35 PDT 2024
================
@@ -117,3 +117,45 @@ entry:
; CHECK-NEXT: [[MUL:%.*]] = mul i64 [[SUB]], 2
; CHECK-NEXT: ret i64 [[MUL]]
;
+;
+; CHECK-LABEL: define internal i64 @compute.specialized.4(
+; CHECK-SAME: i64 [[X:%.*]], i64 [[Y:%.*]], ptr [[BINOP1:%.*]], ptr [[BINOP2:%.*]]) {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[OP0:%.*]] = call i64 @plus(i64 [[X]], i64 42)
+; CHECK-NEXT: [[OP1:%.*]] = call i64 @plus(i64 [[X]], i64 42)
+; CHECK-NEXT: [[OP2:%.*]] = call i64 @compute.specialized.4(i64 [[X]], i64 42, ptr @plus, ptr @plus)
+; CHECK-NEXT: [[ADD0:%.*]] = add i64 [[OP0]], [[OP1]]
+; CHECK-NEXT: [[ADD1:%.*]] = add i64 [[ADD0]], [[OP2]]
+; CHECK-NEXT: [[DIV:%.*]] = sdiv i64 [[ADD1]], [[X]]
+; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[DIV]], 42
+; CHECK-NEXT: [[MUL:%.*]] = mul i64 [[SUB]], 2
+; CHECK-NEXT: ret i64 [[MUL]]
+;
+;
+; CHECK-LABEL: define internal i64 @compute.specialized.5(
+; CHECK-SAME: i64 [[X:%.*]], i64 [[Y:%.*]], ptr [[BINOP1:%.*]], ptr [[BINOP2:%.*]]) {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[OP0:%.*]] = call i64 @plus(i64 [[X]], i64 [[Y]])
+; CHECK-NEXT: [[OP1:%.*]] = call i64 @plus(i64 [[X]], i64 [[Y]])
+; CHECK-NEXT: [[OP2:%.*]] = call i64 @compute.specialized.5(i64 [[X]], i64 [[Y]], ptr @plus, ptr @plus)
+; CHECK-NEXT: [[ADD0:%.*]] = add i64 [[OP0]], [[OP1]]
+; CHECK-NEXT: [[ADD1:%.*]] = add i64 [[ADD0]], [[OP2]]
+; CHECK-NEXT: [[DIV:%.*]] = sdiv i64 [[ADD1]], [[X]]
+; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[DIV]], [[Y]]
+; CHECK-NEXT: [[MUL:%.*]] = mul i64 [[SUB]], 2
+; CHECK-NEXT: ret i64 [[MUL]]
+;
+;
+; CHECK-LABEL: define internal i64 @compute.specialized.6(
+; CHECK-SAME: i64 [[X:%.*]], i64 [[Y:%.*]], ptr [[BINOP1:%.*]], ptr [[BINOP2:%.*]]) {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[OP0:%.*]] = call i64 [[BINOP1]](i64 [[X]], i64 [[Y]])
+; CHECK-NEXT: [[OP1:%.*]] = call i64 @plus(i64 [[X]], i64 [[Y]])
+; CHECK-NEXT: [[OP2:%.*]] = call i64 @compute.specialized.6(i64 [[X]], i64 [[Y]], ptr [[BINOP1]], ptr @plus)
+; CHECK-NEXT: [[ADD0:%.*]] = add i64 [[OP0]], [[OP1]]
+; CHECK-NEXT: [[ADD1:%.*]] = add i64 [[ADD0]], [[OP2]]
+; CHECK-NEXT: [[DIV:%.*]] = sdiv i64 [[ADD1]], [[X]]
+; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[DIV]], [[Y]]
+; CHECK-NEXT: [[MUL:%.*]] = mul i64 [[SUB]], 2
+; CHECK-NEXT: ret i64 [[MUL]]
----------------
labrinea wrote:
Any new tests should be moved to a new file named accordingly based on what the test is trying to check. In this case something like `recursive-literal-const-args.ll` or similar.
https://github.com/llvm/llvm-project/pull/111162
More information about the llvm-commits
mailing list