[llvm] d810649 - [ArgPromotion] Add unused-argument.ll test (NFC)

Pavel Samolysov via llvm-commits llvm-commits at lists.llvm.org
Wed May 18 00:08:46 PDT 2022


Author: Pavel Samolysov
Date: 2022-05-18T10:05:13+03:00
New Revision: d81064949f41b95a5a2122889f07c9ffcc875834

URL: https://github.com/llvm/llvm-project/commit/d81064949f41b95a5a2122889f07c9ffcc875834
DIFF: https://github.com/llvm/llvm-project/commit/d81064949f41b95a5a2122889f07c9ffcc875834.diff

LOG: [ArgPromotion] Add unused-argument.ll test (NFC)

If a pointer argument is unused within the callee, this argument should
be removed from the function's signature while all used pointer
arguments should be promoted as it is expected. The ArgumentPromotion
pass doesn't touch unused non-pointer arguments at all.

Added: 
    llvm/test/Transforms/ArgumentPromotion/unused-argument.ll

Modified: 
    

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/ArgumentPromotion/unused-argument.ll b/llvm/test/Transforms/ArgumentPromotion/unused-argument.ll
new file mode 100644
index 0000000000000..f12b4bd99ee7b
--- /dev/null
+++ b/llvm/test/Transforms/ArgumentPromotion/unused-argument.ll
@@ -0,0 +1,65 @@
+; RUN: opt < %s -passes=argpromotion -S | FileCheck %s
+
+; Unused pointer argument should be removed from the function's signature
+; while the used arguments should be promoted if they are pointers.
+; The pass should not touch any unused non-pointer arguments.
+define internal i32 @callee(i1 %c, i1 %d, i32* %used, i32* %unused) nounwind {
+; CHECK-LABEL: define {{[^@]+}}@callee
+; CHECK-SAME: (i1 [[C:%.*]], i1 [[D:%.*]], i32 [[USED_VAL:%.*]]) #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 [[C]], label %if, label %else
+; CHECK:       if:
+; CHECK-NEXT:    ret i32 [[USED_VAL]]
+; CHECK:       else:
+; CHECK-NEXT:    ret i32 -1
+;
+entry:
+  %x = load i32, i32* %used, align 4
+  br i1 %c, label %if, label %else
+
+if:
+  ret i32 %x
+
+else:
+  ret i32 -1
+}
+
+; Unused byval argument should be removed from the function's signature
+; while the used arguments should be promoted if they are pointers.
+; The pass should not touch any unused non-pointer arguments.
+define internal i32 @callee_byval(i1 %c, i1 %d, i32* byval(i32) align 4 %used, i32* byval(i32) align 4 %unused) nounwind {
+; CHECK-LABEL: define {{[^@]+}}@callee_byval
+; CHECK-SAME: (i1 [[C:%.*]], i1 [[D:%.*]], i32 [[USED_VAL:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 [[C]], label %if, label %else
+; CHECK:       if:
+; CHECK-NEXT:    ret i32 [[USED_VAL]]
+; CHECK:       else:
+; CHECK-NEXT:    ret i32 -1
+;
+entry:
+  %x = load i32, i32* %used, align 4
+  br i1 %c, label %if, label %else
+
+if:
+  ret i32 %x
+
+else:
+  ret i32 -1
+}
+
+define i32 @caller(i1 %c, i1 %d, i32* %arg) nounwind {
+; CHECK-LABEL: define {{[^@]+}}@caller
+; CHECK-SAME: (i1 [[C:%.*]], i1 [[D:%.*]], i32* [[ARG:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[ARG_VAL_0:%.*]] = load i32, i32* [[ARG]], align 4
+; CHECK-NEXT:    [[RES_0:%.*]] = call i32 @callee_byval(i1 [[C]], i1 [[D]], i32 [[ARG_VAL_0]]) #[[ATTR0]]
+; CHECK-NEXT:    [[ARG_VAL_1:%.*]] = load i32, i32* [[ARG]], align 4
+; CHECK-NEXT:    [[RES_1:%.*]] = call i32 @callee(i1 [[C]], i1 [[D]], i32 [[ARG_VAL_1]]) #[[ATTR0]]
+; CHECK-NEXT:  ret i32 1
+;
+entry:
+  call i32 @callee_byval(i1 %c, i1 %d, i32* byval(i32) align 4 %arg, i32* byval(i32) align 4 %arg) nounwind
+  call i32 @callee(i1 %c, i1 %d, i32* %arg, i32* %arg) nounwind
+  ret i32 1
+}


        


More information about the llvm-commits mailing list