[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.
This commit is contained in:
Pavel Samolysov 2022-05-18 10:05:13 +03:00
parent 573a5b5800
commit d81064949f
1 changed files with 65 additions and 0 deletions

View File

@ -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
}