xref: /llvm-project/llvm/test/Transforms/Attributor/IPConstantProp/musttail-call.ll (revision 369930bc20ec247775646d73d493416774d1944e)
19c2074dcSJohannes Doerfert; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes --check-globals
223dafbb1SJohannes Doerfert; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal  -attributor-annotate-decl-cs  -S < %s | FileCheck %s --check-prefixes=CHECK,TUNIT
3846709b2SNikita Popov; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal  -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,CGSCC
43da7efedSJohannes Doerfert; PR36485
53da7efedSJohannes Doerfert; musttail call result can't be replaced with a constant, unless the call can be removed
63da7efedSJohannes Doerfert
73da7efedSJohannes Doerfertdeclare i32 @external()
83da7efedSJohannes Doerfert
94f4787e3SNikita Popovdefine ptr @start(i8 %v) {
101ba2929bSJohannes Doerfert;
11846709b2SNikita Popov; TUNIT-LABEL: define {{[^@]+}}@start
12846709b2SNikita Popov; TUNIT-SAME: (i8 [[V:%.*]]) {
13846709b2SNikita Popov; TUNIT-NEXT:    [[C1:%.*]] = icmp eq i8 [[V]], 0
14846709b2SNikita Popov; TUNIT-NEXT:    br i1 [[C1]], label [[TRUE:%.*]], label [[FALSE:%.*]]
15846709b2SNikita Popov; TUNIT:       true:
164f4787e3SNikita Popov; TUNIT-NEXT:    [[CA:%.*]] = musttail call noalias noundef align 4294967296 ptr @side_effects(i8 [[V]])
174f4787e3SNikita Popov; TUNIT-NEXT:    ret ptr [[CA]]
18846709b2SNikita Popov; TUNIT:       false:
19846709b2SNikita Popov; TUNIT-NEXT:    [[C2:%.*]] = icmp eq i8 [[V]], 1
20846709b2SNikita Popov; TUNIT-NEXT:    br i1 [[C2]], label [[C2_TRUE:%.*]], label [[C2_FALSE:%.*]]
21846709b2SNikita Popov; TUNIT:       c2_true:
224f4787e3SNikita Popov; TUNIT-NEXT:    ret ptr null
23846709b2SNikita Popov; TUNIT:       c2_false:
244f4787e3SNikita Popov; TUNIT-NEXT:    [[CA2:%.*]] = musttail call noalias noundef align 4294967296 ptr @dont_zap_me(i8 undef)
254f4787e3SNikita Popov; TUNIT-NEXT:    ret ptr [[CA2]]
263ca54f45SJohannes Doerfert;
27846709b2SNikita Popov; CGSCC-LABEL: define {{[^@]+}}@start
28846709b2SNikita Popov; CGSCC-SAME: (i8 [[V:%.*]]) {
29846709b2SNikita Popov; CGSCC-NEXT:    [[C1:%.*]] = icmp eq i8 [[V]], 0
30846709b2SNikita Popov; CGSCC-NEXT:    br i1 [[C1]], label [[TRUE:%.*]], label [[FALSE:%.*]]
31846709b2SNikita Popov; CGSCC:       true:
324f4787e3SNikita Popov; CGSCC-NEXT:    [[CA:%.*]] = musttail call noalias noundef align 4294967296 ptr @side_effects(i8 [[V]])
334f4787e3SNikita Popov; CGSCC-NEXT:    ret ptr [[CA]]
34846709b2SNikita Popov; CGSCC:       false:
35846709b2SNikita Popov; CGSCC-NEXT:    [[C2:%.*]] = icmp eq i8 [[V]], 1
36846709b2SNikita Popov; CGSCC-NEXT:    br i1 [[C2]], label [[C2_TRUE:%.*]], label [[C2_FALSE:%.*]]
37846709b2SNikita Popov; CGSCC:       c2_true:
38*369930bcSJohannes Doerfert; CGSCC-NEXT:    [[CA1:%.*]] = musttail call noalias noundef align 4294967296 ptr @no_side_effects(i8 [[V]])
394f4787e3SNikita Popov; CGSCC-NEXT:    ret ptr [[CA1]]
40846709b2SNikita Popov; CGSCC:       c2_false:
41*369930bcSJohannes Doerfert; CGSCC-NEXT:    [[CA2:%.*]] = musttail call noalias noundef align 4294967296 ptr @dont_zap_me(i8 [[V]])
424f4787e3SNikita Popov; CGSCC-NEXT:    ret ptr [[CA2]]
433da7efedSJohannes Doerfert;
443da7efedSJohannes Doerfert  %c1 = icmp eq i8 %v, 0
453da7efedSJohannes Doerfert  br i1 %c1, label %true, label %false
463da7efedSJohannes Doerferttrue:
473da7efedSJohannes Doerfert  ; FIXME: propagate the value information for %v
484f4787e3SNikita Popov  %ca = musttail call ptr @side_effects(i8 %v)
494f4787e3SNikita Popov  ret ptr %ca
503da7efedSJohannes Doerfertfalse:
513da7efedSJohannes Doerfert  %c2 = icmp eq i8 %v, 1
523da7efedSJohannes Doerfert  br i1 %c2, label %c2_true, label %c2_false
533da7efedSJohannes Doerfertc2_true:
544f4787e3SNikita Popov  %ca1 = musttail call ptr @no_side_effects(i8 %v)
554f4787e3SNikita Popov  ret ptr %ca1
563da7efedSJohannes Doerfertc2_false:
574f4787e3SNikita Popov  %ca2 = musttail call ptr @dont_zap_me(i8 %v)
584f4787e3SNikita Popov  ret ptr %ca2
593da7efedSJohannes Doerfert}
603da7efedSJohannes Doerfert
614f4787e3SNikita Popovdefine internal ptr @side_effects(i8 %v) {
62846709b2SNikita Popov; CHECK-LABEL: define {{[^@]+}}@side_effects
63846709b2SNikita Popov; CHECK-SAME: (i8 [[V:%.*]]) {
64846709b2SNikita Popov; CHECK-NEXT:    [[I1:%.*]] = call i32 @external()
654f4787e3SNikita Popov; CHECK-NEXT:    [[CA:%.*]] = musttail call noalias noundef align 4294967296 ptr @start(i8 0)
664f4787e3SNikita Popov; CHECK-NEXT:    ret ptr [[CA]]
673da7efedSJohannes Doerfert;
683da7efedSJohannes Doerfert  %i1 = call i32 @external()
693da7efedSJohannes Doerfert
703da7efedSJohannes Doerfert  ; since this goes back to `start` the SCPP should be see that the return value
713da7efedSJohannes Doerfert  ; is always `null`.
723da7efedSJohannes Doerfert  ; The call can't be removed due to `external` call above, though.
733da7efedSJohannes Doerfert
744f4787e3SNikita Popov  %ca = musttail call ptr @start(i8 %v)
753da7efedSJohannes Doerfert
763da7efedSJohannes Doerfert  ; Thus the result must be returned anyway
774f4787e3SNikita Popov  ret ptr %ca
783da7efedSJohannes Doerfert}
793da7efedSJohannes Doerfert
804f4787e3SNikita Popovdefine internal ptr @no_side_effects(i8 %v) readonly nounwind {
81dbbe9b37SJohannes Doerfert; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
82846709b2SNikita Popov; CGSCC-LABEL: define {{[^@]+}}@no_side_effects
83846709b2SNikita Popov; CGSCC-SAME: (i8 [[V:%.*]]) #[[ATTR0:[0-9]+]] {
844f4787e3SNikita Popov; CGSCC-NEXT:    ret ptr null
853ca54f45SJohannes Doerfert;
864f4787e3SNikita Popov  ret ptr null
873da7efedSJohannes Doerfert}
883da7efedSJohannes Doerfert
894f4787e3SNikita Popovdefine internal ptr @dont_zap_me(i8 %v) {
90bf789b19SJohannes Doerfert; CHECK-LABEL: define {{[^@]+}}@dont_zap_me
91bf789b19SJohannes Doerfert; CHECK-SAME: (i8 [[V:%.*]]) {
92bf789b19SJohannes Doerfert; CHECK-NEXT:    [[I1:%.*]] = call i32 @external()
934f4787e3SNikita Popov; CHECK-NEXT:    ret ptr null
943da7efedSJohannes Doerfert;
953da7efedSJohannes Doerfert  %i1 = call i32 @external()
964f4787e3SNikita Popov  ret ptr null
973da7efedSJohannes Doerfert}
989c2074dcSJohannes Doerfert;.
99dbbe9b37SJohannes Doerfert; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) }
1009c2074dcSJohannes Doerfert;.
101