[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / Transforms / Attributor / IPConstantProp / arg-count-mismatch.ll
blob485cf2865fe6cf67f31b30482dfbf695933e2ea5
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes --check-globals
2 ; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal  -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
3 ; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal  -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
4 ; RUN: opt -attributor-cgscc -enable-new-pm=0 -attributor-manifest-internal  -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM
5 ; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal  -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM
7 ; The original C source looked like this:
9 ;   long long a101, b101, e101;
10 ;   volatile long c101;
11 ;   int d101;
13 ;   static inline int bar(p1, p2)
14 ;   {
15 ;       return 0;
16 ;   }
18 ;   void foo(unsigned p1)
19 ;   {
20 ;       long long *f = &b101, *g = &e101;
21 ;       c101 = 0;
22 ;       (void)((*f |= a101) - (*g = bar(d101)));
23 ;       c101 = (*f |= a101 &= p1) == d101;
24 ;   }
26 ; When compiled with Clang it gives a warning
27 ;   warning: too few arguments in call to 'bar'
29 ; This ll reproducer has been reduced to only include tha call.
31 ; Note that -lint will report this as UB, but it passes -verify.
33 ; This test is just to verify that we do not crash/assert due to mismatch in
34 ; argument count between the caller and callee.
36 ; FIXME we should recognize this as UB and make it an unreachable.
38 define dso_local i16 @foo(i16 %a) {
39 ; CHECK-LABEL: define {{[^@]+}}@foo
40 ; CHECK-SAME: (i16 [[A:%.*]]) {
41 ; CHECK-NEXT:    [[CALL:%.*]] = call i16 bitcast (i16 (i16, i16)* @bar to i16 (i16)*)(i16 [[A]])
42 ; CHECK-NEXT:    ret i16 [[CALL]]
44   %call = call i16 bitcast (i16 (i16, i16) * @bar to i16 (i16) *)(i16 %a)
45   ret i16 %call
48 define internal i16 @bar(i16 %p1, i16 %p2) {
49 ; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
50 ; IS__TUNIT____-LABEL: define {{[^@]+}}@bar
51 ; IS__TUNIT____-SAME: (i16 [[P1:%.*]], i16 [[P2:%.*]]) #[[ATTR0:[0-9]+]] {
52 ; IS__TUNIT____-NEXT:    ret i16 0
54 ; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
55 ; IS__CGSCC____-LABEL: define {{[^@]+}}@bar
56 ; IS__CGSCC____-SAME: (i16 [[P1:%.*]], i16 [[P2:%.*]]) #[[ATTR0:[0-9]+]] {
57 ; IS__CGSCC____-NEXT:    ret i16 0
59   ret i16 0
62 define dso_local i16 @foo2(i16 %a) {
63 ; CHECK-LABEL: define {{[^@]+}}@foo2
64 ; CHECK-SAME: (i16 [[A:%.*]]) {
65 ; CHECK-NEXT:    [[CALL:%.*]] = call i16 bitcast (i16 (i16, i16)* @bar2 to i16 (i16)*)(i16 [[A]])
66 ; CHECK-NEXT:    ret i16 [[CALL]]
68   %call = call i16 bitcast (i16 (i16, i16) * @bar2 to i16 (i16) *)(i16 %a)
69   ret i16 %call
72 define internal i16 @bar2(i16 %p1, i16 %p2) {
73 ; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
74 ; IS__TUNIT____-LABEL: define {{[^@]+}}@bar2
75 ; IS__TUNIT____-SAME: (i16 [[P1:%.*]], i16 [[P2:%.*]]) #[[ATTR0]] {
76 ; IS__TUNIT____-NEXT:    [[A:%.*]] = add i16 [[P1]], [[P2]]
77 ; IS__TUNIT____-NEXT:    ret i16 [[A]]
79 ; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
80 ; IS__CGSCC____-LABEL: define {{[^@]+}}@bar2
81 ; IS__CGSCC____-SAME: (i16 [[P1:%.*]], i16 [[P2:%.*]]) #[[ATTR0]] {
82 ; IS__CGSCC____-NEXT:    [[A:%.*]] = add i16 [[P1]], [[P2]]
83 ; IS__CGSCC____-NEXT:    ret i16 [[A]]
85   %a = add i16 %p1, %p2
86   ret i16 %a
90 ;-------------------------------------------------------------------------------
91 ; Additional tests to verify that we still optimize when having a mismatch
92 ; in argument count due to varargs (as long as all non-variadic arguments have
93 ; been provided),
95 define dso_local i16 @vararg_tests(i16 %a) {
96 ; CHECK-LABEL: define {{[^@]+}}@vararg_tests
97 ; CHECK-SAME: (i16 [[A:%.*]]) {
98 ; CHECK-NEXT:    [[CALL2:%.*]] = call i16 bitcast (i16 (i16, i16, ...)* @vararg_no_prop to i16 (i16)*)(i16 noundef 7)
99 ; CHECK-NEXT:    [[ADD:%.*]] = add i16 7, [[CALL2]]
100 ; CHECK-NEXT:    ret i16 [[ADD]]
102   %call1 = call i16 (i16, ...) @vararg_prop(i16 7, i16 8, i16 %a)
103   %call2 = call i16 bitcast (i16 (i16, i16, ...) * @vararg_no_prop to i16 (i16) *) (i16 7)
104   %add = add i16 %call1, %call2
105   ret i16 %add
108 define internal i16 @vararg_prop(i16 %p1, ...) {
109 ; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
110 ; IS__CGSCC____-LABEL: define {{[^@]+}}@vararg_prop
111 ; IS__CGSCC____-SAME: (i16 [[P1:%.*]], ...) #[[ATTR0]] {
112 ; IS__CGSCC____-NEXT:    ret i16 undef
114   ret i16 %p1
117 define internal i16 @vararg_no_prop(i16 %p1, i16 %p2, ...) {
118 ; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
119 ; IS__TUNIT____-LABEL: define {{[^@]+}}@vararg_no_prop
120 ; IS__TUNIT____-SAME: (i16 [[P1:%.*]], i16 [[P2:%.*]], ...) #[[ATTR0]] {
121 ; IS__TUNIT____-NEXT:    ret i16 7
123 ; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
124 ; IS__CGSCC____-LABEL: define {{[^@]+}}@vararg_no_prop
125 ; IS__CGSCC____-SAME: (i16 [[P1:%.*]], i16 [[P2:%.*]], ...) #[[ATTR0]] {
126 ; IS__CGSCC____-NEXT:    ret i16 7
128   ret i16 %p1
132 ; IS__TUNIT____: attributes #[[ATTR0]] = { nofree nosync nounwind readnone willreturn }
134 ; IS__CGSCC____: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind readnone willreturn }