diff --git a/llvm/lib/Transforms/IPO/Attributor.cpp b/llvm/lib/Transforms/IPO/Attributor.cpp index 3b59ebbbb9322..6dc7568e51fa8 100644 --- a/llvm/lib/Transforms/IPO/Attributor.cpp +++ b/llvm/lib/Transforms/IPO/Attributor.cpp @@ -3931,7 +3931,8 @@ static bool runAttributorLightOnFunctions(InformationCache &InfoCache, &AANoFree::ID, &AANoReturn::ID, &AAMemoryLocation::ID, &AAMemoryBehavior::ID, &AAUnderlyingObjects::ID, &AANoCapture::ID, &AAInterFnReachability::ID, &AAIntraFnReachability::ID, &AACallEdges::ID, - &AANoFPClass::ID, &AAMustProgress::ID, &AANonNull::ID}); + &AANoFPClass::ID, &AAMustProgress::ID, &AANonNull::ID, + &AADenormalFPMath::ID, &AAIsDead::ID}); AC.Allowed = &Allowed; AC.UseLiveness = false; diff --git a/llvm/test/Transforms/Attributor/denormal-fp-math.ll b/llvm/test/Transforms/Attributor/denormal-fp-math.ll index 558d2bb074ff2..573a05041bff1 100644 --- a/llvm/test/Transforms/Attributor/denormal-fp-math.ll +++ b/llvm/test/Transforms/Attributor/denormal-fp-math.ll @@ -1,5 +1,6 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-attributes --check-globals --version 2 ; RUN: opt -S -passes=attributor < %s | FileCheck %s +; RUN: opt -S -passes=attributor-light < %s | FileCheck %s ; Keep the attribute checks clean by disabling inference of anything else. declare void @call_of_mystery() diff --git a/llvm/test/Transforms/FunctionAttrs/argmemonly.ll b/llvm/test/Transforms/FunctionAttrs/argmemonly.ll index 42e0e94c1cee3..26db47bc40f6a 100644 --- a/llvm/test/Transforms/FunctionAttrs/argmemonly.ll +++ b/llvm/test/Transforms/FunctionAttrs/argmemonly.ll @@ -399,7 +399,6 @@ define void @test_recursive_argmem_read(ptr %p) { ; ATTRIBUTOR-LABEL: define void @test_recursive_argmem_read ; ATTRIBUTOR-SAME: (ptr nofree nonnull readonly captures(none) [[P:%.*]]) #[[ATTR15:[0-9]+]] { ; ATTRIBUTOR-NEXT: [[PVAL:%.*]] = load ptr, ptr [[P]], align 8 -; ATTRIBUTOR-NEXT: call void @test_recursive_argmem_read(ptr nofree readonly captures(none) [[PVAL]]) #[[ATTR15]] ; ATTRIBUTOR-NEXT: ret void ; %pval = load ptr, ptr %p @@ -444,7 +443,6 @@ define void @test_recursive_argmem_read_alloca(ptr %p) { ; ATTRIBUTOR-SAME: (ptr nofree nonnull readonly captures(none) [[P:%.*]]) #[[ATTR17:[0-9]+]] { ; ATTRIBUTOR-NEXT: [[A:%.*]] = alloca ptr, align 8 ; ATTRIBUTOR-NEXT: [[TMP1:%.*]] = load i32, ptr [[P]], align 4 -; ATTRIBUTOR-NEXT: call void @test_recursive_argmem_read_alloca(ptr nofree nonnull readonly captures(none) [[A]]) #[[ATTR15]] ; ATTRIBUTOR-NEXT: ret void ; %a = alloca ptr @@ -465,7 +463,6 @@ define void @test_scc_argmem_read_1(ptr %p) { ; ATTRIBUTOR-LABEL: define void @test_scc_argmem_read_1 ; ATTRIBUTOR-SAME: (ptr nofree nonnull readonly captures(none) [[P:%.*]]) #[[ATTR15]] { ; ATTRIBUTOR-NEXT: [[PVAL:%.*]] = load ptr, ptr [[P]], align 8 -; ATTRIBUTOR-NEXT: call void @test_scc_argmem_read_2(ptr nofree readonly captures(none) [[PVAL]]) #[[ATTR15]] ; ATTRIBUTOR-NEXT: ret void ; %pval = load ptr, ptr %p @@ -483,7 +480,6 @@ define void @test_scc_argmem_read_2(ptr %p) { ; ATTRIBUTOR: Function Attrs: nofree nosync nounwind memory(read) ; ATTRIBUTOR-LABEL: define void @test_scc_argmem_read_2 ; ATTRIBUTOR-SAME: (ptr nofree readonly captures(none) [[P:%.*]]) #[[ATTR15]] { -; ATTRIBUTOR-NEXT: call void @test_scc_argmem_read_1(ptr nofree readonly captures(none) [[P]]) #[[ATTR15]] ; ATTRIBUTOR-NEXT: ret void ; call void @test_scc_argmem_read_1(ptr %p) diff --git a/llvm/test/Transforms/FunctionAttrs/nocapture.ll b/llvm/test/Transforms/FunctionAttrs/nocapture.ll index 8113ba65fe422..6ef1acd085eee 100644 --- a/llvm/test/Transforms/FunctionAttrs/nocapture.ll +++ b/llvm/test/Transforms/FunctionAttrs/nocapture.ll @@ -371,7 +371,6 @@ define void @readonly_nounwind_not_willreturn(ptr %p) { ; ATTRIBUTOR: Function Attrs: nosync nounwind memory(read) ; ATTRIBUTOR-LABEL: define void @readonly_nounwind_not_willreturn ; ATTRIBUTOR-SAME: (ptr readonly captures(none) [[P:%.*]]) #[[ATTR7:[0-9]+]] { -; ATTRIBUTOR-NEXT: call void @external_not_willreturn(ptr readonly captures(none) [[P]]) #[[ATTR4]] ; ATTRIBUTOR-NEXT: ret void ; call void @external_not_willreturn(ptr %p) @@ -389,7 +388,6 @@ define void @readonly_nounwind_willreturn(ptr %p) { ; ATTRIBUTOR: Function Attrs: mustprogress nosync nounwind willreturn memory(read) ; ATTRIBUTOR-LABEL: define void @readonly_nounwind_willreturn ; ATTRIBUTOR-SAME: (ptr readonly captures(none) [[P:%.*]]) #[[ATTR9:[0-9]+]] { -; ATTRIBUTOR-NEXT: call void @external_willreturn(ptr readonly captures(none) [[P]]) #[[ATTR24:[0-9]+]] ; ATTRIBUTOR-NEXT: ret void ; call void @external_willreturn(ptr %p) @@ -405,7 +403,6 @@ define void @callsite_readonly_nounwind_not_willreturn(ptr %f, ptr %p) { ; ; ATTRIBUTOR-LABEL: define void @callsite_readonly_nounwind_not_willreturn ; ATTRIBUTOR-SAME: (ptr nofree nonnull captures(none) [[F:%.*]], ptr [[P:%.*]]) { -; ATTRIBUTOR-NEXT: call void [[F]](ptr [[P]]) #[[ATTR6:[0-9]+]] ; ATTRIBUTOR-NEXT: call void [[F]](ptr captures(none) [[P]]) ; ATTRIBUTOR-NEXT: ret void ; @@ -423,7 +420,6 @@ define void @callsite_readonly_nounwind_willreturn(ptr %f, ptr %p) { ; ; ATTRIBUTOR-LABEL: define void @callsite_readonly_nounwind_willreturn ; ATTRIBUTOR-SAME: (ptr nofree nonnull captures(none) [[F:%.*]], ptr [[P:%.*]]) { -; ATTRIBUTOR-NEXT: call void [[F]](ptr [[P]]) #[[ATTR8:[0-9]+]] ; ATTRIBUTOR-NEXT: call void [[F]](ptr captures(none) [[P]]) ; ATTRIBUTOR-NEXT: ret void ; @@ -570,7 +566,7 @@ define void @test4_1(ptr %x4_1, i1 %c) { ; ATTRIBUTOR: Function Attrs: nofree nosync nounwind memory(write) ; ATTRIBUTOR-LABEL: define void @test4_1 ; ATTRIBUTOR-SAME: (ptr nofree readnone captures(none) [[X4_1:%.*]], i1 [[C:%.*]]) #[[ATTR10]] { -; ATTRIBUTOR-NEXT: [[TMP1:%.*]] = call ptr @test4_2(ptr nofree readnone captures(none) [[X4_1]], ptr nofree readnone [[X4_1]], ptr nofree readnone captures(none) [[X4_1]], i1 [[C]]) #[[ATTR10]] +; ATTRIBUTOR-NEXT: [[TMP1:%.*]] = call ptr @test4_2(ptr nofree readnone captures(none) undef, ptr nofree readnone [[X4_1]], ptr nofree readnone captures(none) undef, i1 [[C]]) #[[ATTR10]] ; ATTRIBUTOR-NEXT: store ptr null, ptr @g, align 8 ; ATTRIBUTOR-NEXT: ret void ; @@ -732,7 +728,7 @@ define void @nocaptureLaunder(ptr %p) { ; ATTRIBUTOR-LABEL: define void @nocaptureLaunder ; ATTRIBUTOR-SAME: (ptr nofree captures(none) [[P:%.*]]) #[[ATTR12:[0-9]+]] { ; ATTRIBUTOR-NEXT: entry: -; ATTRIBUTOR-NEXT: [[B:%.*]] = call ptr @llvm.launder.invariant.group.p0(ptr [[P]]) #[[ATTR25:[0-9]+]] +; ATTRIBUTOR-NEXT: [[B:%.*]] = call ptr @llvm.launder.invariant.group.p0(ptr [[P]]) #[[ATTR24:[0-9]+]] ; ATTRIBUTOR-NEXT: store i8 42, ptr [[B]], align 1 ; ATTRIBUTOR-NEXT: ret void ; @@ -754,7 +750,7 @@ define void @captureLaunder(ptr %p) { ; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; ATTRIBUTOR-LABEL: define void @captureLaunder ; ATTRIBUTOR-SAME: (ptr nofree [[P:%.*]]) #[[ATTR5]] { -; ATTRIBUTOR-NEXT: [[B:%.*]] = call ptr @llvm.launder.invariant.group.p0(ptr [[P]]) #[[ATTR25]] +; ATTRIBUTOR-NEXT: [[B:%.*]] = call ptr @llvm.launder.invariant.group.p0(ptr [[P]]) #[[ATTR24]] ; ATTRIBUTOR-NEXT: store ptr [[B]], ptr @g2, align 8 ; ATTRIBUTOR-NEXT: ret void ; @@ -776,7 +772,7 @@ define void @nocaptureStrip(ptr %p) { ; ATTRIBUTOR-LABEL: define void @nocaptureStrip ; ATTRIBUTOR-SAME: (ptr nofree writeonly captures(none) [[P:%.*]]) #[[ATTR13:[0-9]+]] { ; ATTRIBUTOR-NEXT: entry: -; ATTRIBUTOR-NEXT: [[B:%.*]] = call ptr @llvm.strip.invariant.group.p0(ptr [[P]]) #[[ATTR22]] +; ATTRIBUTOR-NEXT: [[B:%.*]] = call ptr @llvm.strip.invariant.group.p0(ptr [[P]]) #[[ATTR25:[0-9]+]] ; ATTRIBUTOR-NEXT: store i8 42, ptr [[B]], align 1 ; ATTRIBUTOR-NEXT: ret void ; @@ -798,7 +794,7 @@ define void @captureStrip(ptr %p) { ; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; ATTRIBUTOR-LABEL: define void @captureStrip ; ATTRIBUTOR-SAME: (ptr nofree writeonly [[P:%.*]]) #[[ATTR1]] { -; ATTRIBUTOR-NEXT: [[B:%.*]] = call ptr @llvm.strip.invariant.group.p0(ptr [[P]]) #[[ATTR22]] +; ATTRIBUTOR-NEXT: [[B:%.*]] = call ptr @llvm.strip.invariant.group.p0(ptr [[P]]) #[[ATTR25]] ; ATTRIBUTOR-NEXT: store ptr [[B]], ptr @g3, align 8 ; ATTRIBUTOR-NEXT: ret void ; diff --git a/llvm/test/Transforms/FunctionAttrs/nonnull.ll b/llvm/test/Transforms/FunctionAttrs/nonnull.ll index 9d5ae1606f2e3..2c3e2e0cc0c9f 100644 --- a/llvm/test/Transforms/FunctionAttrs/nonnull.ll +++ b/llvm/test/Transforms/FunctionAttrs/nonnull.ll @@ -119,7 +119,6 @@ define ptr @test5_helper(i1 %c) { ; ATTRIBUTOR-SAME: i1 [[C:%.*]]) #[[ATTR1]] { ; ATTRIBUTOR-NEXT: br i1 [[C]], label [[REC:%.*]], label [[END:%.*]] ; ATTRIBUTOR: rec: -; ATTRIBUTOR-NEXT: [[RET:%.*]] = call ptr @test5(i1 [[C]]) #[[ATTR1]] ; ATTRIBUTOR-NEXT: br label [[END]] ; ATTRIBUTOR: end: ; ATTRIBUTOR-NEXT: ret ptr null @@ -323,8 +322,6 @@ define void @test13_helper() { ; ATTRIBUTOR-LABEL: define void @test13_helper() { ; ATTRIBUTOR-NEXT: [[NONNULLPTR:%.*]] = tail call ptr @ret_nonnull() ; ATTRIBUTOR-NEXT: [[MAYBENULLPTR:%.*]] = tail call ptr @unknown() -; ATTRIBUTOR-NEXT: tail call void @test13(ptr nofree nonnull readnone captures(none) [[NONNULLPTR]], ptr nofree nonnull readnone captures(none) [[NONNULLPTR]], ptr nofree readnone captures(none) [[MAYBENULLPTR]]) -; ATTRIBUTOR-NEXT: tail call void @test13(ptr nofree nonnull readnone captures(none) [[NONNULLPTR]], ptr nofree readnone captures(none) [[MAYBENULLPTR]], ptr nofree nonnull readnone captures(none) [[NONNULLPTR]]) ; ATTRIBUTOR-NEXT: ret void ; %nonnullptr = tail call ptr @ret_nonnull() @@ -339,7 +336,7 @@ define internal void @test13(ptr %a, ptr %b, ptr %c) { ; FNATTRS-NEXT: ret void ; ; ATTRIBUTOR-LABEL: define internal void @test13( -; ATTRIBUTOR-SAME: ptr nofree nonnull readnone captures(none) [[A:%.*]], ptr nofree readnone captures(none) [[B:%.*]], ptr nofree readnone captures(none) [[C:%.*]]) #[[ATTR0]] { +; ATTRIBUTOR-SAME: ) #[[ATTR0]] { ; ATTRIBUTOR-NEXT: ret void ; ret void @@ -513,10 +510,10 @@ define void @f16(ptr %a, ptr %b, i8 %c) { ; ATTRIBUTOR-NEXT: [[CMP:%.*]] = icmp eq i8 [[C]], 0 ; ATTRIBUTOR-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] ; ATTRIBUTOR: if.then: -; ATTRIBUTOR-NEXT: tail call void @fun2(ptr nonnull [[A]], ptr nonnull [[B]]) #[[ATTR15:[0-9]+]] +; ATTRIBUTOR-NEXT: tail call void @fun2(ptr nonnull [[A]], ptr nonnull [[B]]) #[[ATTR5:[0-9]+]] ; ATTRIBUTOR-NEXT: ret void ; ATTRIBUTOR: if.else: -; ATTRIBUTOR-NEXT: tail call void @fun2(ptr nonnull [[A]], ptr [[B]]) #[[ATTR15]] +; ATTRIBUTOR-NEXT: tail call void @fun2(ptr nonnull [[A]], ptr [[B]]) #[[ATTR5]] ; ATTRIBUTOR-NEXT: ret void ; %cmp = icmp eq i8 %c, 0 @@ -555,13 +552,13 @@ define void @f17(ptr %a, i8 %c) { ; ATTRIBUTOR-NEXT: [[CMP:%.*]] = icmp eq i8 [[C]], 0 ; ATTRIBUTOR-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] ; ATTRIBUTOR: if.then: -; ATTRIBUTOR-NEXT: tail call void @fun0() #[[ATTR15]] +; ATTRIBUTOR-NEXT: tail call void @fun0() #[[ATTR5]] ; ATTRIBUTOR-NEXT: br label [[CONT:%.*]] ; ATTRIBUTOR: if.else: -; ATTRIBUTOR-NEXT: tail call void @fun0() #[[ATTR15]] +; ATTRIBUTOR-NEXT: tail call void @fun0() #[[ATTR5]] ; ATTRIBUTOR-NEXT: br label [[CONT]] ; ATTRIBUTOR: cont: -; ATTRIBUTOR-NEXT: tail call void @fun1(ptr nonnull [[A]]) #[[ATTR15]] +; ATTRIBUTOR-NEXT: tail call void @fun1(ptr nonnull [[A]]) #[[ATTR5]] ; ATTRIBUTOR-NEXT: ret void ; %cmp = icmp eq i8 %c, 0 @@ -616,22 +613,22 @@ define void @f18(ptr %a, ptr %b, i8 %c) { ; ATTRIBUTOR-NEXT: [[CMP1:%.*]] = icmp eq i8 [[C]], 0 ; ATTRIBUTOR-NEXT: br i1 [[CMP1]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] ; ATTRIBUTOR: if.then: -; ATTRIBUTOR-NEXT: tail call void @fun0() #[[ATTR15]] +; ATTRIBUTOR-NEXT: tail call void @fun0() #[[ATTR5]] ; ATTRIBUTOR-NEXT: br label [[CONT:%.*]] ; ATTRIBUTOR: if.else: -; ATTRIBUTOR-NEXT: tail call void @fun0() #[[ATTR15]] +; ATTRIBUTOR-NEXT: tail call void @fun0() #[[ATTR5]] ; ATTRIBUTOR-NEXT: br label [[CONT]] ; ATTRIBUTOR: cont: ; ATTRIBUTOR-NEXT: [[CMP2:%.*]] = icmp eq i8 [[C]], 1 ; ATTRIBUTOR-NEXT: br i1 [[CMP2]], label [[CONT_THEN:%.*]], label [[CONT_ELSE:%.*]] ; ATTRIBUTOR: cont.then: -; ATTRIBUTOR-NEXT: tail call void @fun1(ptr nonnull [[B]]) #[[ATTR15]] +; ATTRIBUTOR-NEXT: tail call void @fun1(ptr nonnull [[B]]) #[[ATTR5]] ; ATTRIBUTOR-NEXT: br label [[CONT2:%.*]] ; ATTRIBUTOR: cont.else: -; ATTRIBUTOR-NEXT: tail call void @fun0() #[[ATTR15]] +; ATTRIBUTOR-NEXT: tail call void @fun0() #[[ATTR5]] ; ATTRIBUTOR-NEXT: br label [[CONT2]] ; ATTRIBUTOR: cont2: -; ATTRIBUTOR-NEXT: tail call void @fun1(ptr nonnull [[A]]) #[[ATTR15]] +; ATTRIBUTOR-NEXT: tail call void @fun1(ptr nonnull [[A]]) #[[ATTR5]] ; ATTRIBUTOR-NEXT: ret void ; %cmp1 = icmp eq i8 %c, 0 @@ -681,11 +678,11 @@ define void @f19(ptr %a, ptr %b, i8 %c) { ; ATTRIBUTOR-NEXT: [[CMP2:%.*]] = icmp eq i8 [[C]], 0 ; ATTRIBUTOR-NEXT: br i1 [[CMP2]], label [[LOOP_BODY:%.*]], label [[LOOP_EXIT:%.*]] ; ATTRIBUTOR: loop.body: -; ATTRIBUTOR-NEXT: tail call void @fun1(ptr nonnull [[B]]) -; ATTRIBUTOR-NEXT: tail call void @fun1(ptr nonnull [[A]]) +; ATTRIBUTOR-NEXT: tail call void @fun1(ptr nonnull [[B]]) #[[ATTR7]] +; ATTRIBUTOR-NEXT: tail call void @fun1(ptr nonnull [[A]]) #[[ATTR7]] ; ATTRIBUTOR-NEXT: br label [[LOOP_HEADER]] ; ATTRIBUTOR: loop.exit: -; ATTRIBUTOR-NEXT: tail call void @fun1(ptr nonnull [[B]]) +; ATTRIBUTOR-NEXT: tail call void @fun1(ptr nonnull [[B]]) #[[ATTR7]] ; ATTRIBUTOR-NEXT: ret void ; br label %loop.header @@ -884,7 +881,7 @@ define i8 @parent7(ptr %a) { ; ; ATTRIBUTOR-LABEL: define i8 @parent7( ; ATTRIBUTOR-SAME: ptr nonnull [[A:%.*]]) { -; ATTRIBUTOR-NEXT: [[RET:%.*]] = call i8 @use1safecall(ptr nonnull [[A]]) #[[ATTR15]] +; ATTRIBUTOR-NEXT: [[RET:%.*]] = call i8 @use1safecall(ptr nonnull [[A]]) #[[ATTR5]] ; ATTRIBUTOR-NEXT: call void @use1nonnull(ptr nonnull [[A]]) ; ATTRIBUTOR-NEXT: ret i8 [[RET]] ; @@ -1022,7 +1019,7 @@ define ptr @g1() { ; ; ATTRIBUTOR-LABEL: define ptr @g1( ; ATTRIBUTOR-SAME: ) #[[ATTR0]] { -; ATTRIBUTOR-NEXT: [[C:%.*]] = call ptr @g2() #[[ATTR16:[0-9]+]] +; ATTRIBUTOR-NEXT: [[C:%.*]] = call ptr @g2() #[[ATTR15:[0-9]+]] ; ATTRIBUTOR-NEXT: ret ptr [[C]] ; %c = call ptr @g2() @@ -1038,7 +1035,6 @@ define internal void @called_by_weak(ptr %a) { ; ; ATTRIBUTOR-LABEL: define internal void @called_by_weak( ; ATTRIBUTOR-SAME: ptr nonnull readnone captures(none) [[A:%.*]]) #[[ATTR10:[0-9]+]] { -; ATTRIBUTOR-NEXT: call void @use_i32_ptr(ptr nonnull [[A]]) #[[ATTR17:[0-9]+]] ; ATTRIBUTOR-NEXT: ret void ; call void @use_i32_ptr(ptr %a) @@ -1054,7 +1050,6 @@ define weak_odr void @weak_caller(ptr nonnull %a) { ; ; ATTRIBUTOR-LABEL: define weak_odr void @weak_caller( ; ATTRIBUTOR-SAME: ptr nonnull [[A:%.*]]) { -; ATTRIBUTOR-NEXT: call void @called_by_weak(ptr nonnull readnone captures(none) [[A]]) ; ATTRIBUTOR-NEXT: ret void ; call void @called_by_weak(ptr %a) @@ -1070,7 +1065,6 @@ define internal void @control(ptr dereferenceable(4) %a) { ; ; ATTRIBUTOR-LABEL: define internal void @control( ; ATTRIBUTOR-SAME: ptr nonnull readnone captures(none) dereferenceable(4) [[A:%.*]]) #[[ATTR10]] { -; ATTRIBUTOR-NEXT: call void @use_i32_ptr(ptr [[A]]) #[[ATTR17]] ; ATTRIBUTOR-NEXT: ret void ; call void @use_i32_ptr(ptr %a) @@ -1114,7 +1108,6 @@ define void @make_live(ptr nonnull dereferenceable(8) %a) { ; ATTRIBUTOR-LABEL: define void @make_live( ; ATTRIBUTOR-SAME: ptr nonnull dereferenceable(8) [[A:%.*]]) { ; ATTRIBUTOR-NEXT: call void @naked(ptr nonnull align 16 dereferenceable(8) [[A]]) -; ATTRIBUTOR-NEXT: call void @control(ptr nonnull readnone align 16 captures(none) dereferenceable(8) [[A]]) ; ATTRIBUTOR-NEXT: call void @optnone(ptr nonnull align 16 dereferenceable(8) [[A]]) ; ATTRIBUTOR-NEXT: ret void ; @@ -1133,20 +1126,35 @@ define void @make_live(ptr nonnull dereferenceable(8) %a) { declare void @h(ptr) willreturn nounwind declare i32 @g(ptr) willreturn nounwind define i32 @nonnull_exec_ctx_1(ptr %a, i32 %b) { -; COMMON-LABEL: define i32 @nonnull_exec_ctx_1( -; COMMON-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR7:[0-9]+]] { -; COMMON-NEXT: en: -; COMMON-NEXT: [[TMP3:%.*]] = icmp eq i32 [[B]], 0 -; COMMON-NEXT: br i1 [[TMP3]], label [[EX:%.*]], label [[HD:%.*]] -; COMMON: ex: -; COMMON-NEXT: [[TMP5:%.*]] = tail call i32 @g(ptr nonnull [[A]]) -; COMMON-NEXT: ret i32 [[TMP5]] -; COMMON: hd: -; COMMON-NEXT: [[TMP7:%.*]] = phi i32 [ [[TMP8:%.*]], [[HD]] ], [ 0, [[EN:%.*]] ] -; COMMON-NEXT: tail call void @h(ptr [[A]]) -; COMMON-NEXT: [[TMP8]] = add nuw i32 [[TMP7]], 1 -; COMMON-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], [[B]] -; COMMON-NEXT: br i1 [[TMP9]], label [[EX]], label [[HD]] +; FNATTRS-LABEL: define i32 @nonnull_exec_ctx_1( +; FNATTRS-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR7]] { +; FNATTRS-NEXT: en: +; FNATTRS-NEXT: [[TMP3:%.*]] = icmp eq i32 [[B]], 0 +; FNATTRS-NEXT: br i1 [[TMP3]], label [[EX:%.*]], label [[HD:%.*]] +; FNATTRS: ex: +; FNATTRS-NEXT: [[TMP5:%.*]] = tail call i32 @g(ptr nonnull [[A]]) +; FNATTRS-NEXT: ret i32 [[TMP5]] +; FNATTRS: hd: +; FNATTRS-NEXT: [[TMP7:%.*]] = phi i32 [ [[TMP8:%.*]], [[HD]] ], [ 0, [[EN:%.*]] ] +; FNATTRS-NEXT: tail call void @h(ptr [[A]]) +; FNATTRS-NEXT: [[TMP8]] = add nuw i32 [[TMP7]], 1 +; FNATTRS-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], [[B]] +; FNATTRS-NEXT: br i1 [[TMP9]], label [[EX]], label [[HD]] +; +; ATTRIBUTOR-LABEL: define i32 @nonnull_exec_ctx_1( +; ATTRIBUTOR-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR7]] { +; ATTRIBUTOR-NEXT: en: +; ATTRIBUTOR-NEXT: [[TMP3:%.*]] = icmp eq i32 [[B]], 0 +; ATTRIBUTOR-NEXT: br i1 [[TMP3]], label [[EX:%.*]], label [[HD:%.*]] +; ATTRIBUTOR: ex: +; ATTRIBUTOR-NEXT: [[TMP5:%.*]] = tail call i32 @g(ptr nonnull [[A]]) #[[ATTR7]] +; ATTRIBUTOR-NEXT: ret i32 [[TMP5]] +; ATTRIBUTOR: hd: +; ATTRIBUTOR-NEXT: [[TMP7:%.*]] = phi i32 [ [[TMP8:%.*]], [[HD]] ], [ 0, [[EN:%.*]] ] +; ATTRIBUTOR-NEXT: tail call void @h(ptr [[A]]) #[[ATTR7]] +; ATTRIBUTOR-NEXT: [[TMP8]] = add nuw i32 [[TMP7]], 1 +; ATTRIBUTOR-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], [[B]] +; ATTRIBUTOR-NEXT: br i1 [[TMP9]], label [[EX]], label [[HD]] ; en: %tmp3 = icmp eq i32 %b, 0 @@ -1165,22 +1173,39 @@ hd: } define i32 @nonnull_exec_ctx_1b(ptr %a, i32 %b) { -; COMMON-LABEL: define i32 @nonnull_exec_ctx_1b( -; COMMON-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR7]] { -; COMMON-NEXT: en: -; COMMON-NEXT: [[TMP3:%.*]] = icmp eq i32 [[B]], 0 -; COMMON-NEXT: br i1 [[TMP3]], label [[EX:%.*]], label [[HD:%.*]] -; COMMON: ex: -; COMMON-NEXT: [[TMP5:%.*]] = tail call i32 @g(ptr nonnull [[A]]) -; COMMON-NEXT: ret i32 [[TMP5]] -; COMMON: hd: -; COMMON-NEXT: [[TMP7:%.*]] = phi i32 [ [[TMP8:%.*]], [[HD2:%.*]] ], [ 0, [[EN:%.*]] ] -; COMMON-NEXT: tail call void @h(ptr [[A]]) -; COMMON-NEXT: br label [[HD2]] -; COMMON: hd2: -; COMMON-NEXT: [[TMP8]] = add nuw i32 [[TMP7]], 1 -; COMMON-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], [[B]] -; COMMON-NEXT: br i1 [[TMP9]], label [[EX]], label [[HD]] +; FNATTRS-LABEL: define i32 @nonnull_exec_ctx_1b( +; FNATTRS-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR7]] { +; FNATTRS-NEXT: en: +; FNATTRS-NEXT: [[TMP3:%.*]] = icmp eq i32 [[B]], 0 +; FNATTRS-NEXT: br i1 [[TMP3]], label [[EX:%.*]], label [[HD:%.*]] +; FNATTRS: ex: +; FNATTRS-NEXT: [[TMP5:%.*]] = tail call i32 @g(ptr nonnull [[A]]) +; FNATTRS-NEXT: ret i32 [[TMP5]] +; FNATTRS: hd: +; FNATTRS-NEXT: [[TMP7:%.*]] = phi i32 [ [[TMP8:%.*]], [[HD2:%.*]] ], [ 0, [[EN:%.*]] ] +; FNATTRS-NEXT: tail call void @h(ptr [[A]]) +; FNATTRS-NEXT: br label [[HD2]] +; FNATTRS: hd2: +; FNATTRS-NEXT: [[TMP8]] = add nuw i32 [[TMP7]], 1 +; FNATTRS-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], [[B]] +; FNATTRS-NEXT: br i1 [[TMP9]], label [[EX]], label [[HD]] +; +; ATTRIBUTOR-LABEL: define i32 @nonnull_exec_ctx_1b( +; ATTRIBUTOR-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR7]] { +; ATTRIBUTOR-NEXT: en: +; ATTRIBUTOR-NEXT: [[TMP3:%.*]] = icmp eq i32 [[B]], 0 +; ATTRIBUTOR-NEXT: br i1 [[TMP3]], label [[EX:%.*]], label [[HD:%.*]] +; ATTRIBUTOR: ex: +; ATTRIBUTOR-NEXT: [[TMP5:%.*]] = tail call i32 @g(ptr nonnull [[A]]) #[[ATTR7]] +; ATTRIBUTOR-NEXT: ret i32 [[TMP5]] +; ATTRIBUTOR: hd: +; ATTRIBUTOR-NEXT: [[TMP7:%.*]] = phi i32 [ [[TMP8:%.*]], [[HD2:%.*]] ], [ 0, [[EN:%.*]] ] +; ATTRIBUTOR-NEXT: tail call void @h(ptr [[A]]) #[[ATTR7]] +; ATTRIBUTOR-NEXT: br label [[HD2]] +; ATTRIBUTOR: hd2: +; ATTRIBUTOR-NEXT: [[TMP8]] = add nuw i32 [[TMP7]], 1 +; ATTRIBUTOR-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], [[B]] +; ATTRIBUTOR-NEXT: br i1 [[TMP9]], label [[EX]], label [[HD]] ; en: %tmp3 = icmp eq i32 %b, 0 @@ -1223,11 +1248,11 @@ define i32 @nonnull_exec_ctx_2(ptr %a, i32 %b) willreturn nounwind { ; ATTRIBUTOR-NEXT: [[TMP3:%.*]] = icmp eq i32 [[B]], 0 ; ATTRIBUTOR-NEXT: br i1 [[TMP3]], label [[EX:%.*]], label [[HD:%.*]] ; ATTRIBUTOR: ex: -; ATTRIBUTOR-NEXT: [[TMP5:%.*]] = tail call i32 @g(ptr nonnull [[A]]) +; ATTRIBUTOR-NEXT: [[TMP5:%.*]] = tail call i32 @g(ptr nonnull [[A]]) #[[ATTR7]] ; ATTRIBUTOR-NEXT: ret i32 [[TMP5]] ; ATTRIBUTOR: hd: ; ATTRIBUTOR-NEXT: [[TMP7:%.*]] = phi i32 [ [[TMP8:%.*]], [[HD]] ], [ 0, [[EN:%.*]] ] -; ATTRIBUTOR-NEXT: tail call void @h(ptr nonnull [[A]]) +; ATTRIBUTOR-NEXT: tail call void @h(ptr nonnull [[A]]) #[[ATTR7]] ; ATTRIBUTOR-NEXT: [[TMP8]] = add nuw i32 [[TMP7]], 1 ; ATTRIBUTOR-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], [[B]] ; ATTRIBUTOR-NEXT: br i1 [[TMP9]], label [[EX]], label [[HD]] @@ -1272,11 +1297,11 @@ define i32 @nonnull_exec_ctx_2b(ptr %a, i32 %b) willreturn nounwind { ; ATTRIBUTOR-NEXT: [[TMP3:%.*]] = icmp eq i32 [[B]], 0 ; ATTRIBUTOR-NEXT: br i1 [[TMP3]], label [[EX:%.*]], label [[HD:%.*]] ; ATTRIBUTOR: ex: -; ATTRIBUTOR-NEXT: [[TMP5:%.*]] = tail call i32 @g(ptr nonnull [[A]]) +; ATTRIBUTOR-NEXT: [[TMP5:%.*]] = tail call i32 @g(ptr nonnull [[A]]) #[[ATTR7]] ; ATTRIBUTOR-NEXT: ret i32 [[TMP5]] ; ATTRIBUTOR: hd: ; ATTRIBUTOR-NEXT: [[TMP7:%.*]] = phi i32 [ [[TMP8:%.*]], [[HD2:%.*]] ], [ 0, [[EN:%.*]] ] -; ATTRIBUTOR-NEXT: tail call void @h(ptr nonnull [[A]]) +; ATTRIBUTOR-NEXT: tail call void @h(ptr nonnull [[A]]) #[[ATTR7]] ; ATTRIBUTOR-NEXT: br label [[HD2]] ; ATTRIBUTOR: hd2: ; ATTRIBUTOR-NEXT: [[TMP8]] = add nuw i32 [[TMP7]], 1 diff --git a/llvm/test/Transforms/FunctionAttrs/norecurse.ll b/llvm/test/Transforms/FunctionAttrs/norecurse.ll index 5cb8ac05847aa..239fb1016903b 100644 --- a/llvm/test/Transforms/FunctionAttrs/norecurse.ll +++ b/llvm/test/Transforms/FunctionAttrs/norecurse.ll @@ -27,7 +27,6 @@ define i32 @self_rec() { ; ATTRIBUTOR: Function Attrs: nofree nosync nounwind memory(none) ; ATTRIBUTOR-LABEL: define {{[^@]+}}@self_rec ; ATTRIBUTOR-SAME: () #[[ATTR1:[0-9]+]] { -; ATTRIBUTOR-NEXT: [[A:%.*]] = call i32 @self_rec() #[[ATTR1]] ; ATTRIBUTOR-NEXT: ret i32 4 ; %a = call i32 @self_rec() @@ -117,7 +116,7 @@ define internal i32 @called_by_norecurse() { ; ATTRIBUTOR-LABEL: define {{[^@]+}}@called_by_norecurse ; ATTRIBUTOR-SAME: () #[[ATTR6:[0-9]+]] { ; ATTRIBUTOR-NEXT: [[A:%.*]] = call i32 @k() #[[ATTR7]] -; ATTRIBUTOR-NEXT: ret i32 [[A]] +; ATTRIBUTOR-NEXT: ret i32 undef ; %a = call i32 @k() ret i32 %a @@ -151,7 +150,7 @@ define internal i32 @called_by_norecurse_indirectly() { ; ATTRIBUTOR-LABEL: define {{[^@]+}}@called_by_norecurse_indirectly ; ATTRIBUTOR-SAME: () #[[ATTR6]] { ; ATTRIBUTOR-NEXT: [[A:%.*]] = call i32 @k() #[[ATTR7]] -; ATTRIBUTOR-NEXT: ret i32 [[A]] +; ATTRIBUTOR-NEXT: ret i32 undef ; %a = call i32 @k() ret i32 %a @@ -218,7 +217,7 @@ define internal void @q() { ; ATTRIBUTOR: Function Attrs: norecurse nosync memory(none) ; ATTRIBUTOR-LABEL: define {{[^@]+}}@q ; ATTRIBUTOR-SAME: () #[[ATTR6]] { -; ATTRIBUTOR-NEXT: [[A:%.*]] = call i32 @escapes_as_parameter(ptr nofree nonnull readnone captures(none) @escapes_as_parameter) #[[ATTR2]] +; ATTRIBUTOR-NEXT: [[A:%.*]] = call i32 @escapes_as_parameter(ptr nofree nonnull readnone captures(none) undef) #[[ATTR2]] ; ATTRIBUTOR-NEXT: ret void ; %a = call i32 @escapes_as_parameter(ptr @escapes_as_parameter) diff --git a/llvm/test/Transforms/FunctionAttrs/nosync.ll b/llvm/test/Transforms/FunctionAttrs/nosync.ll index 9abfbb21a71a0..bd53879a24e24 100644 --- a/llvm/test/Transforms/FunctionAttrs/nosync.ll +++ b/llvm/test/Transforms/FunctionAttrs/nosync.ll @@ -204,7 +204,6 @@ define i32 @volatile_load(ptr %0) norecurse nounwind uwtable { } ; CHECK: Function Attrs: noinline nosync nounwind uwtable -; CHECK-NEXT: declare void @nosync_function() declare void @nosync_function() noinline nounwind uwtable nosync define void @call_nosync_function() nounwind uwtable noinline { @@ -218,7 +217,6 @@ define void @call_nosync_function() nounwind uwtable noinline { } ; CHECK: Function Attrs: noinline nounwind uwtable -; CHECK-NEXT: declare void @might_sync() declare void @might_sync() noinline nounwind uwtable define void @call_might_sync() nounwind uwtable noinline { @@ -280,7 +278,6 @@ define void @convergent_readnone(){ } ; CHECK: Function Attrs: nounwind -; CHECK-NEXT: declare void @llvm.x86.sse2.clflush(ptr) declare void @llvm.x86.sse2.clflush(ptr) @a = common global i32 0, align 4 diff --git a/llvm/test/Transforms/FunctionAttrs/nounwind.ll b/llvm/test/Transforms/FunctionAttrs/nounwind.ll index 076a7df2781ce..565305daea4bc 100644 --- a/llvm/test/Transforms/FunctionAttrs/nounwind.ll +++ b/llvm/test/Transforms/FunctionAttrs/nounwind.ll @@ -28,7 +28,6 @@ define i32 @scc1_foo() { ; ATTRIBUTOR: Function Attrs: nofree nosync nounwind memory(none) ; ATTRIBUTOR-LABEL: define {{[^@]+}}@scc1_foo ; ATTRIBUTOR-SAME: () #[[ATTR1:[0-9]+]] { -; ATTRIBUTOR-NEXT: [[TMP1:%.*]] = call i32 @scc1_bar() #[[ATTR1]] ; ATTRIBUTOR-NEXT: ret i32 1 ; %1 = call i32 @scc1_bar() @@ -47,7 +46,6 @@ define i32 @scc1_bar() { ; ATTRIBUTOR: Function Attrs: nofree nosync nounwind memory(none) ; ATTRIBUTOR-LABEL: define {{[^@]+}}@scc1_bar ; ATTRIBUTOR-SAME: () #[[ATTR1]] { -; ATTRIBUTOR-NEXT: [[TMP1:%.*]] = call i32 @scc1_foo() #[[ATTR1]] ; ATTRIBUTOR-NEXT: ret i32 1 ; %1 = call i32 @scc1_foo() @@ -174,18 +172,31 @@ declare void @abort() nounwind @catch_ty = external global ptr define void @catch_specific_landingpad() personality ptr @__gxx_personality_v0 { -; COMMON: Function Attrs: noreturn -; COMMON-LABEL: define {{[^@]+}}@catch_specific_landingpad -; COMMON-SAME: () #[[ATTR3:[0-9]+]] personality ptr @__gxx_personality_v0 { -; COMMON-NEXT: invoke void @do_throw() -; COMMON-NEXT: to label [[UNREACHABLE:%.*]] unwind label [[LPAD:%.*]] -; COMMON: lpad: -; COMMON-NEXT: [[LP:%.*]] = landingpad { ptr, i32 } -; COMMON-NEXT: catch ptr @catch_ty -; COMMON-NEXT: call void @abort() -; COMMON-NEXT: unreachable -; COMMON: unreachable: -; COMMON-NEXT: unreachable +; FNATTRS: Function Attrs: noreturn +; FNATTRS-LABEL: define {{[^@]+}}@catch_specific_landingpad +; FNATTRS-SAME: () #[[ATTR3:[0-9]+]] personality ptr @__gxx_personality_v0 { +; FNATTRS-NEXT: invoke void @do_throw() +; FNATTRS-NEXT: to label [[UNREACHABLE:%.*]] unwind label [[LPAD:%.*]] +; FNATTRS: lpad: +; FNATTRS-NEXT: [[LP:%.*]] = landingpad { ptr, i32 } +; FNATTRS-NEXT: catch ptr @catch_ty +; FNATTRS-NEXT: call void @abort() +; FNATTRS-NEXT: unreachable +; FNATTRS: unreachable: +; FNATTRS-NEXT: unreachable +; +; ATTRIBUTOR: Function Attrs: noreturn +; ATTRIBUTOR-LABEL: define {{[^@]+}}@catch_specific_landingpad +; ATTRIBUTOR-SAME: () #[[ATTR3:[0-9]+]] personality ptr @__gxx_personality_v0 { +; ATTRIBUTOR-NEXT: invoke void @do_throw() +; ATTRIBUTOR-NEXT: to label [[UNREACHABLE:%.*]] unwind label [[LPAD:%.*]] +; ATTRIBUTOR: lpad: +; ATTRIBUTOR-NEXT: [[LP:%.*]] = landingpad { ptr, i32 } +; ATTRIBUTOR-NEXT: catch ptr @catch_ty +; ATTRIBUTOR-NEXT: call void @abort() #[[ATTR2:[0-9]+]] +; ATTRIBUTOR-NEXT: unreachable +; ATTRIBUTOR: unreachable: +; ATTRIBUTOR-NEXT: unreachable ; invoke void @do_throw() to label %unreachable unwind label %lpad @@ -201,18 +212,31 @@ unreachable: } define void @catch_all_landingpad() personality ptr @__gxx_personality_v0 { -; COMMON: Function Attrs: noreturn nounwind -; COMMON-LABEL: define {{[^@]+}}@catch_all_landingpad -; COMMON-SAME: () #[[ATTR4:[0-9]+]] personality ptr @__gxx_personality_v0 { -; COMMON-NEXT: invoke void @do_throw() -; COMMON-NEXT: to label [[UNREACHABLE:%.*]] unwind label [[LPAD:%.*]] -; COMMON: lpad: -; COMMON-NEXT: [[LP:%.*]] = landingpad { ptr, i32 } -; COMMON-NEXT: catch ptr null -; COMMON-NEXT: call void @abort() -; COMMON-NEXT: unreachable -; COMMON: unreachable: -; COMMON-NEXT: unreachable +; FNATTRS: Function Attrs: noreturn nounwind +; FNATTRS-LABEL: define {{[^@]+}}@catch_all_landingpad +; FNATTRS-SAME: () #[[ATTR4:[0-9]+]] personality ptr @__gxx_personality_v0 { +; FNATTRS-NEXT: invoke void @do_throw() +; FNATTRS-NEXT: to label [[UNREACHABLE:%.*]] unwind label [[LPAD:%.*]] +; FNATTRS: lpad: +; FNATTRS-NEXT: [[LP:%.*]] = landingpad { ptr, i32 } +; FNATTRS-NEXT: catch ptr null +; FNATTRS-NEXT: call void @abort() +; FNATTRS-NEXT: unreachable +; FNATTRS: unreachable: +; FNATTRS-NEXT: unreachable +; +; ATTRIBUTOR: Function Attrs: noreturn nounwind +; ATTRIBUTOR-LABEL: define {{[^@]+}}@catch_all_landingpad +; ATTRIBUTOR-SAME: () #[[ATTR4:[0-9]+]] personality ptr @__gxx_personality_v0 { +; ATTRIBUTOR-NEXT: invoke void @do_throw() +; ATTRIBUTOR-NEXT: to label [[UNREACHABLE:%.*]] unwind label [[LPAD:%.*]] +; ATTRIBUTOR: lpad: +; ATTRIBUTOR-NEXT: [[LP:%.*]] = landingpad { ptr, i32 } +; ATTRIBUTOR-NEXT: catch ptr null +; ATTRIBUTOR-NEXT: call void @abort() #[[ATTR2]] +; ATTRIBUTOR-NEXT: unreachable +; ATTRIBUTOR: unreachable: +; ATTRIBUTOR-NEXT: unreachable ; invoke void @do_throw() to label %unreachable unwind label %lpad @@ -228,18 +252,31 @@ unreachable: } define void @filter_specific_landingpad() personality ptr @__gxx_personality_v0 { -; COMMON: Function Attrs: noreturn -; COMMON-LABEL: define {{[^@]+}}@filter_specific_landingpad -; COMMON-SAME: () #[[ATTR3]] personality ptr @__gxx_personality_v0 { -; COMMON-NEXT: invoke void @do_throw() -; COMMON-NEXT: to label [[UNREACHABLE:%.*]] unwind label [[LPAD:%.*]] -; COMMON: lpad: -; COMMON-NEXT: [[LP:%.*]] = landingpad { ptr, i32 } -; COMMON-NEXT: filter [1 x ptr] [ptr @catch_ty] -; COMMON-NEXT: call void @abort() -; COMMON-NEXT: unreachable -; COMMON: unreachable: -; COMMON-NEXT: unreachable +; FNATTRS: Function Attrs: noreturn +; FNATTRS-LABEL: define {{[^@]+}}@filter_specific_landingpad +; FNATTRS-SAME: () #[[ATTR3]] personality ptr @__gxx_personality_v0 { +; FNATTRS-NEXT: invoke void @do_throw() +; FNATTRS-NEXT: to label [[UNREACHABLE:%.*]] unwind label [[LPAD:%.*]] +; FNATTRS: lpad: +; FNATTRS-NEXT: [[LP:%.*]] = landingpad { ptr, i32 } +; FNATTRS-NEXT: filter [1 x ptr] [ptr @catch_ty] +; FNATTRS-NEXT: call void @abort() +; FNATTRS-NEXT: unreachable +; FNATTRS: unreachable: +; FNATTRS-NEXT: unreachable +; +; ATTRIBUTOR: Function Attrs: noreturn +; ATTRIBUTOR-LABEL: define {{[^@]+}}@filter_specific_landingpad +; ATTRIBUTOR-SAME: () #[[ATTR3]] personality ptr @__gxx_personality_v0 { +; ATTRIBUTOR-NEXT: invoke void @do_throw() +; ATTRIBUTOR-NEXT: to label [[UNREACHABLE:%.*]] unwind label [[LPAD:%.*]] +; ATTRIBUTOR: lpad: +; ATTRIBUTOR-NEXT: [[LP:%.*]] = landingpad { ptr, i32 } +; ATTRIBUTOR-NEXT: filter [1 x ptr] [ptr @catch_ty] +; ATTRIBUTOR-NEXT: call void @abort() #[[ATTR2]] +; ATTRIBUTOR-NEXT: unreachable +; ATTRIBUTOR: unreachable: +; ATTRIBUTOR-NEXT: unreachable ; invoke void @do_throw() to label %unreachable unwind label %lpad @@ -255,18 +292,31 @@ unreachable: } define void @filter_none_landingpad() personality ptr @__gxx_personality_v0 { -; COMMON: Function Attrs: noreturn nounwind -; COMMON-LABEL: define {{[^@]+}}@filter_none_landingpad -; COMMON-SAME: () #[[ATTR4]] personality ptr @__gxx_personality_v0 { -; COMMON-NEXT: invoke void @do_throw() -; COMMON-NEXT: to label [[UNREACHABLE:%.*]] unwind label [[LPAD:%.*]] -; COMMON: lpad: -; COMMON-NEXT: [[LP:%.*]] = landingpad { ptr, i32 } -; COMMON-NEXT: filter [0 x ptr] zeroinitializer -; COMMON-NEXT: call void @abort() -; COMMON-NEXT: unreachable -; COMMON: unreachable: -; COMMON-NEXT: unreachable +; FNATTRS: Function Attrs: noreturn nounwind +; FNATTRS-LABEL: define {{[^@]+}}@filter_none_landingpad +; FNATTRS-SAME: () #[[ATTR4]] personality ptr @__gxx_personality_v0 { +; FNATTRS-NEXT: invoke void @do_throw() +; FNATTRS-NEXT: to label [[UNREACHABLE:%.*]] unwind label [[LPAD:%.*]] +; FNATTRS: lpad: +; FNATTRS-NEXT: [[LP:%.*]] = landingpad { ptr, i32 } +; FNATTRS-NEXT: filter [0 x ptr] zeroinitializer +; FNATTRS-NEXT: call void @abort() +; FNATTRS-NEXT: unreachable +; FNATTRS: unreachable: +; FNATTRS-NEXT: unreachable +; +; ATTRIBUTOR: Function Attrs: noreturn nounwind +; ATTRIBUTOR-LABEL: define {{[^@]+}}@filter_none_landingpad +; ATTRIBUTOR-SAME: () #[[ATTR4]] personality ptr @__gxx_personality_v0 { +; ATTRIBUTOR-NEXT: invoke void @do_throw() +; ATTRIBUTOR-NEXT: to label [[UNREACHABLE:%.*]] unwind label [[LPAD:%.*]] +; ATTRIBUTOR: lpad: +; ATTRIBUTOR-NEXT: [[LP:%.*]] = landingpad { ptr, i32 } +; ATTRIBUTOR-NEXT: filter [0 x ptr] zeroinitializer +; ATTRIBUTOR-NEXT: call void @abort() #[[ATTR2]] +; ATTRIBUTOR-NEXT: unreachable +; ATTRIBUTOR: unreachable: +; ATTRIBUTOR-NEXT: unreachable ; invoke void @do_throw() to label %unreachable unwind label %lpad @@ -282,18 +332,31 @@ unreachable: } define void @cleanup_landingpad() personality ptr @__gxx_personality_v0 { -; COMMON: Function Attrs: noreturn -; COMMON-LABEL: define {{[^@]+}}@cleanup_landingpad -; COMMON-SAME: () #[[ATTR3]] personality ptr @__gxx_personality_v0 { -; COMMON-NEXT: invoke void @do_throw() -; COMMON-NEXT: to label [[UNREACHABLE:%.*]] unwind label [[LPAD:%.*]] -; COMMON: lpad: -; COMMON-NEXT: [[LP:%.*]] = landingpad { ptr, i32 } -; COMMON-NEXT: cleanup -; COMMON-NEXT: call void @abort() -; COMMON-NEXT: unreachable -; COMMON: unreachable: -; COMMON-NEXT: unreachable +; FNATTRS: Function Attrs: noreturn +; FNATTRS-LABEL: define {{[^@]+}}@cleanup_landingpad +; FNATTRS-SAME: () #[[ATTR3]] personality ptr @__gxx_personality_v0 { +; FNATTRS-NEXT: invoke void @do_throw() +; FNATTRS-NEXT: to label [[UNREACHABLE:%.*]] unwind label [[LPAD:%.*]] +; FNATTRS: lpad: +; FNATTRS-NEXT: [[LP:%.*]] = landingpad { ptr, i32 } +; FNATTRS-NEXT: cleanup +; FNATTRS-NEXT: call void @abort() +; FNATTRS-NEXT: unreachable +; FNATTRS: unreachable: +; FNATTRS-NEXT: unreachable +; +; ATTRIBUTOR: Function Attrs: noreturn +; ATTRIBUTOR-LABEL: define {{[^@]+}}@cleanup_landingpad +; ATTRIBUTOR-SAME: () #[[ATTR3]] personality ptr @__gxx_personality_v0 { +; ATTRIBUTOR-NEXT: invoke void @do_throw() +; ATTRIBUTOR-NEXT: to label [[UNREACHABLE:%.*]] unwind label [[LPAD:%.*]] +; ATTRIBUTOR: lpad: +; ATTRIBUTOR-NEXT: [[LP:%.*]] = landingpad { ptr, i32 } +; ATTRIBUTOR-NEXT: cleanup +; ATTRIBUTOR-NEXT: call void @abort() #[[ATTR2]] +; ATTRIBUTOR-NEXT: unreachable +; ATTRIBUTOR: unreachable: +; ATTRIBUTOR-NEXT: unreachable ; invoke void @do_throw() to label %unreachable unwind label %lpad @@ -328,7 +391,7 @@ define void @cleanuppad() personality ptr @__gxx_personality_v0 { ; ATTRIBUTOR-NEXT: to label [[UNREACHABLE:%.*]] unwind label [[CPAD:%.*]] ; ATTRIBUTOR: cpad: ; ATTRIBUTOR-NEXT: [[CP:%.*]] = cleanuppad within none [] -; ATTRIBUTOR-NEXT: call void @abort() +; ATTRIBUTOR-NEXT: call void @abort() #[[ATTR2]] ; ATTRIBUTOR-NEXT: unreachable ; ATTRIBUTOR: unreachable: ; ATTRIBUTOR-NEXT: unreachable @@ -352,7 +415,7 @@ define void @catchswitch_cleanuppad() personality ptr @__gxx_personality_v0 { ; FNATTRS-NEXT: invoke void @do_throw() ; FNATTRS-NEXT: to label [[UNREACHABLE:%.*]] unwind label [[CS:%.*]] ; FNATTRS: cs: -; FNATTRS-NEXT: [[TOK:%.*]] = catchswitch within none [label %catch] unwind label [[CPAD:%.*]] +; FNATTRS-NEXT: [[TOK:%.*]] = catchswitch within none [label [[CATCH:%.*]]] unwind label [[CPAD:%.*]] ; FNATTRS: catch: ; FNATTRS-NEXT: [[C:%.*]] = catchpad within [[TOK]] [ptr @catch_ty, i32 0, ptr null] ; FNATTRS-NEXT: call void @abort() @@ -370,14 +433,14 @@ define void @catchswitch_cleanuppad() personality ptr @__gxx_personality_v0 { ; ATTRIBUTOR-NEXT: invoke void @do_throw() ; ATTRIBUTOR-NEXT: to label [[UNREACHABLE:%.*]] unwind label [[CS:%.*]] ; ATTRIBUTOR: cs: -; ATTRIBUTOR-NEXT: [[TOK:%.*]] = catchswitch within none [label %catch] unwind label [[CPAD:%.*]] +; ATTRIBUTOR-NEXT: [[TOK:%.*]] = catchswitch within none [label [[CATCH:%.*]]] unwind label [[CPAD:%.*]] ; ATTRIBUTOR: catch: ; ATTRIBUTOR-NEXT: [[C:%.*]] = catchpad within [[TOK]] [ptr @catch_ty, i32 0, ptr null] -; ATTRIBUTOR-NEXT: call void @abort() +; ATTRIBUTOR-NEXT: call void @abort() #[[ATTR2]] ; ATTRIBUTOR-NEXT: unreachable ; ATTRIBUTOR: cpad: ; ATTRIBUTOR-NEXT: [[CP:%.*]] = cleanuppad within none [] -; ATTRIBUTOR-NEXT: call void @abort() +; ATTRIBUTOR-NEXT: call void @abort() #[[ATTR2]] ; ATTRIBUTOR-NEXT: unreachable ; ATTRIBUTOR: unreachable: ; ATTRIBUTOR-NEXT: unreachable @@ -426,7 +489,7 @@ define void @unknown_nounwind_call(ptr %fn) { ; ; ATTRIBUTOR: Function Attrs: nounwind ; ATTRIBUTOR-LABEL: define {{[^@]+}}@unknown_nounwind_call -; ATTRIBUTOR-SAME: (ptr nofree nonnull captures(none) [[FN:%.*]]) #[[ATTR2:[0-9]+]] { +; ATTRIBUTOR-SAME: (ptr nofree nonnull captures(none) [[FN:%.*]]) #[[ATTR2]] { ; ATTRIBUTOR-NEXT: call void [[FN]]() #[[ATTR2]] ; ATTRIBUTOR-NEXT: ret void ; diff --git a/llvm/test/Transforms/FunctionAttrs/readattrs.ll b/llvm/test/Transforms/FunctionAttrs/readattrs.ll index 87f64ed3c63bc..c532f7b3f3f81 100644 --- a/llvm/test/Transforms/FunctionAttrs/readattrs.ll +++ b/llvm/test/Transforms/FunctionAttrs/readattrs.ll @@ -308,13 +308,13 @@ define <4 x i32> @test11_2(<4 x ptr> %ptrs) { ; ATTRIBUTOR: Function Attrs: nosync nounwind memory(argmem: read) ; ATTRIBUTOR-LABEL: define {{[^@]+}}@test11_2 ; ATTRIBUTOR-SAME: (<4 x ptr> [[PTRS:%.*]]) #[[ATTR7:[0-9]+]] { -; ATTRIBUTOR-NEXT: [[RES:%.*]] = call <4 x i32> @test11_1(<4 x ptr> [[PTRS]]) #[[ATTR3]] +; ATTRIBUTOR-NEXT: [[RES:%.*]] = call <4 x i32> @test11_1(<4 x ptr> [[PTRS]]) #[[ATTR17:[0-9]+]] ; ATTRIBUTOR-NEXT: ret <4 x i32> [[RES]] ; ; ATTRIBUTOR-CGSCC: Function Attrs: nosync nounwind memory(argmem: read) ; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@test11_2 ; ATTRIBUTOR-CGSCC-SAME: (<4 x ptr> [[PTRS:%.*]]) #[[ATTR8:[0-9]+]] { -; ATTRIBUTOR-CGSCC-NEXT: [[RES:%.*]] = call <4 x i32> @test11_1(<4 x ptr> [[PTRS]]) #[[ATTR3]] +; ATTRIBUTOR-CGSCC-NEXT: [[RES:%.*]] = call <4 x i32> @test11_1(<4 x ptr> [[PTRS]]) #[[ATTR17:[0-9]+]] ; ATTRIBUTOR-CGSCC-NEXT: ret <4 x i32> [[RES]] ; %res = call <4 x i32> @test11_1(<4 x ptr> %ptrs) @@ -332,13 +332,13 @@ define <4 x i32> @test12_2(<4 x ptr> %ptrs) { ; ATTRIBUTOR: Function Attrs: nounwind memory(argmem: readwrite) ; ATTRIBUTOR-LABEL: define {{[^@]+}}@test12_2 ; ATTRIBUTOR-SAME: (<4 x ptr> [[PTRS:%.*]]) #[[ATTR8:[0-9]+]] { -; ATTRIBUTOR-NEXT: [[RES:%.*]] = call <4 x i32> @test12_1(<4 x ptr> [[PTRS]]) +; ATTRIBUTOR-NEXT: [[RES:%.*]] = call <4 x i32> @test12_1(<4 x ptr> [[PTRS]]) #[[ATTR18:[0-9]+]] ; ATTRIBUTOR-NEXT: ret <4 x i32> [[RES]] ; ; ATTRIBUTOR-CGSCC: Function Attrs: nounwind memory(argmem: readwrite) ; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@test12_2 ; ATTRIBUTOR-CGSCC-SAME: (<4 x ptr> [[PTRS:%.*]]) #[[ATTR9:[0-9]+]] { -; ATTRIBUTOR-CGSCC-NEXT: [[RES:%.*]] = call <4 x i32> @test12_1(<4 x ptr> [[PTRS]]) +; ATTRIBUTOR-CGSCC-NEXT: [[RES:%.*]] = call <4 x i32> @test12_1(<4 x ptr> [[PTRS]]) #[[ATTR18:[0-9]+]] ; ATTRIBUTOR-CGSCC-NEXT: ret <4 x i32> [[RES]] ; %res = call <4 x i32> @test12_1(<4 x ptr> %ptrs) diff --git a/llvm/test/Transforms/FunctionAttrs/readnone.ll b/llvm/test/Transforms/FunctionAttrs/readnone.ll index 74361b7486fcc..4b11f804eb2fb 100644 --- a/llvm/test/Transforms/FunctionAttrs/readnone.ll +++ b/llvm/test/Transforms/FunctionAttrs/readnone.ll @@ -10,7 +10,6 @@ define void @bar(ptr readonly %0) { ; ; ATTRIBUTOR-LABEL: define void @bar( ; ATTRIBUTOR-SAME: ptr nofree readnone captures(none) [[TMP0:%.*]]) #[[ATTR0:[0-9]+]] { -; ATTRIBUTOR-NEXT: call void @foo(ptr nofree readnone captures(none) [[TMP0]]) #[[ATTR0]] ; ATTRIBUTOR-NEXT: ret void ; call void @foo(ptr %0) @@ -25,7 +24,6 @@ define void @foo(ptr readonly %0) { ; ; ATTRIBUTOR-LABEL: define void @foo( ; ATTRIBUTOR-SAME: ptr nofree readnone captures(none) [[TMP0:%.*]]) #[[ATTR0]] { -; ATTRIBUTOR-NEXT: call void @bar(ptr nofree readnone captures(none) [[TMP0]]) #[[ATTR0]] ; ATTRIBUTOR-NEXT: ret void ; call void @bar(ptr %0) diff --git a/llvm/test/Transforms/FunctionAttrs/sendmsg-nocallback.ll b/llvm/test/Transforms/FunctionAttrs/sendmsg-nocallback.ll index 04575e4cc940b..409435b7931b1 100644 --- a/llvm/test/Transforms/FunctionAttrs/sendmsg-nocallback.ll +++ b/llvm/test/Transforms/FunctionAttrs/sendmsg-nocallback.ll @@ -43,7 +43,7 @@ define internal i32 @sendmsg_rtn_is_norecurse() { ; ATTRIBUTOR-LABEL: define internal i32 @sendmsg_rtn_is_norecurse( ; ATTRIBUTOR-SAME: ) #[[ATTR0]] { ; ATTRIBUTOR-NEXT: [[RES:%.*]] = call i32 @llvm.amdgcn.s.sendmsg.rtn.i32(i32 1) #[[ATTR4]] -; ATTRIBUTOR-NEXT: ret i32 [[RES]] +; ATTRIBUTOR-NEXT: ret i32 undef ; %res = call i32 @llvm.amdgcn.s.sendmsg.rtn(i32 1) ret i32 %res diff --git a/llvm/test/Transforms/FunctionAttrs/willreturn.ll b/llvm/test/Transforms/FunctionAttrs/willreturn.ll index dc0280288b4fe..7c09836acca02 100644 --- a/llvm/test/Transforms/FunctionAttrs/willreturn.ll +++ b/llvm/test/Transforms/FunctionAttrs/willreturn.ll @@ -87,9 +87,7 @@ define i32 @mustprogress_call_known_functions(ptr %ptr) mustprogress { ; ; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; ATTRIBUTOR-LABEL: @mustprogress_call_known_functions( -; ATTRIBUTOR-NEXT: call void @mustprogress_readnone() #[[ATTR9:[0-9]+]] -; ATTRIBUTOR-NEXT: [[R:%.*]] = call i32 @mustprogress_load(ptr nofree readonly captures(none) [[PTR:%.*]]) #[[ATTR12:[0-9]+]] -; ATTRIBUTOR-NEXT: ret i32 [[R]] +; ATTRIBUTOR-NEXT: unreachable ; call void @mustprogress_readnone() %r = call i32 @mustprogress_load(ptr %ptr) @@ -112,7 +110,7 @@ define i64 @mustprogress_mayunwind() mustprogress personality ptr @__gxx_persona ; ; ATTRIBUTOR: Function Attrs: mustprogress nosync nounwind willreturn memory(none) ; ATTRIBUTOR-LABEL: @mustprogress_mayunwind( -; ATTRIBUTOR-NEXT: [[A:%.*]] = invoke i64 @fn_noread() #[[ATTR13:[0-9]+]] +; ATTRIBUTOR-NEXT: [[A:%.*]] = invoke i64 @fn_noread() #[[ATTR12:[0-9]+]] ; ATTRIBUTOR-NEXT: to label [[A:%.*]] unwind label [[B:%.*]] ; ATTRIBUTOR: A: ; ATTRIBUTOR-NEXT: ret i64 10 @@ -236,7 +234,6 @@ define void @willreturn_recursion() { ; ; ATTRIBUTOR: Function Attrs: nofree nosync nounwind memory(none) ; ATTRIBUTOR-LABEL: @willreturn_recursion( -; ATTRIBUTOR-NEXT: tail call void @willreturn_recursion() #[[ATTR9]] ; ATTRIBUTOR-NEXT: ret void ; tail call void @willreturn_recursion()