; Check that when removing arguments, existing callsite attributes are preserved ; RUN: llvm-reduce --abort-on-invalid-reduction --delta-passes=arguments --test FileCheck --test-arg --check-prefixes=INTERESTING --test-arg %s --test-arg --input-file %s -o %t ; RUN: FileCheck --check-prefixes=RESULT %s < %t ; INTERESTING-LABEL: define void @callee0( define void @callee0(ptr %interesting0, ptr %interesting1, i32 %uninteresting2) { ret void } ; INTERESTING-LABEL: define void @callee1( define void @callee1(ptr byval(i64) %interesting0, ptr %interesting1, i32 %uninteresting2) { ret void } ; INTERESTING-LABEL: define void @caller0( ; INTERESTING: byval ; INTERESTING-SAME: "some-attr" ; INTERESTING: byval ; INTERESTING-SAME: "more-attr" ; RESULT-LABEL: define void @caller0(ptr %val0) { ; RESULT: call void @callee0(ptr byval(i32) %val0, ptr "some-attr" %alloca0) #0 ; RESULT: call void @callee1(ptr byval(i64) %alloca1, ptr "more-attr" %alloca1) #1 define void @caller0(ptr %val0, i32 %val1) { %alloca0 = alloca i32 %alloca1 = alloca i64 call void @callee0(ptr byval(i32) %val0, ptr "some-attr" %alloca0, i32 %val1) nounwind memory(none) "a-func-attr" call void @callee1(ptr byval(i64) %alloca1, ptr "more-attr" %alloca1, i32 9) "val-func-attr="="something" ret void } ; RESULT-LABEL: define ptr @callee2() { ; RESULT-NEXT: ret ptr null define ptr @callee2(ptr %val0, i32 %b) { store i32 %b, ptr %val0 ret ptr %val0 } ; Make sure ret attributes are preserved ; INTERESTING: define ptr @caller1( ; INTERESTING: call ; RESULT-LABEL: define ptr @caller1() { ; RESULT: %ret = call align 4 "ret-attr" ptr @callee2() define ptr @caller1(ptr %val0, i32 %val1) { %ret = call align 4 "ret-attr" ptr @callee2(ptr %val0, i32 %val1) ret ptr %ret } ; RESULT: attributes #0 = { nounwind memory(none) "a-func-attr" } ; RESULT: attributes #1 = { "val-func-attr="="something" }