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