diff options
Diffstat (limited to 'llvm/test/Transforms/FunctionAttrs/nonnull.ll')
| -rw-r--r-- | llvm/test/Transforms/FunctionAttrs/nonnull.ll | 259 |
1 files changed, 66 insertions, 193 deletions
diff --git a/llvm/test/Transforms/FunctionAttrs/nonnull.ll b/llvm/test/Transforms/FunctionAttrs/nonnull.ll index 42923cee770..128a2bdbe50 100644 --- a/llvm/test/Transforms/FunctionAttrs/nonnull.ll +++ b/llvm/test/Transforms/FunctionAttrs/nonnull.ll @@ -1,8 +1,6 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt -S -functionattrs -enable-nonnull-arg-prop %s | FileCheck %s --check-prefixes=BOTH,FNATTR,OLD -; RUN: opt -S -passes=function-attrs -enable-nonnull-arg-prop %s | FileCheck %s --check-prefixes=BOTH,FNATTR,OLD -; RUN: opt -attributor --attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=5 -S < %s | FileCheck %s --check-prefixes=BOTH,OLD,ATTRIBUTOR,ATTRIBUTOR_OPM -; RUN: opt -passes=attributor --attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=5 -S < %s | FileCheck %s --check-prefixes=BOTH,ATTRIBUTOR,ATTRIBUTOR_NPM +; RUN: opt -S -functionattrs -enable-nonnull-arg-prop %s | FileCheck %s --check-prefixes=FNATTR +; RUN: opt -S -passes=function-attrs -enable-nonnull-arg-prop %s | FileCheck %s --check-prefixes=FNATTR target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" @@ -10,14 +8,14 @@ declare nonnull i8* @ret_nonnull() ; Return a pointer trivially nonnull (call return attribute) define i8* @test1() { -; BOTH: define nonnull i8* @test1 +; FNATTR: define nonnull i8* @test1 %ret = call i8* @ret_nonnull() ret i8* %ret } ; Return a pointer trivially nonnull (argument attribute) define i8* @test2(i8* nonnull %p) { -; BOTH: define nonnull i8* @test2 +; FNATTR: define nonnull i8* @test2 ret i8* %p } @@ -25,7 +23,6 @@ define i8* @test2(i8* nonnull %p) { ; can we still mark the other one which is trivially nonnull define i8* @scc_binder(i1 %c) { ; FNATTR: define i8* @scc_binder -; ATTRIBUTOR: define noalias i8* @scc_binder br i1 %c, label %rec, label %end rec: call i8* @test3(i1 %c) @@ -35,7 +32,7 @@ end: } define i8* @test3(i1 %c) { -; BOTH: define nonnull i8* @test3 +; FNATTR: define nonnull i8* @test3 call i8* @scc_binder(i1 %c) %ret = call i8* @ret_nonnull() ret i8* %ret @@ -46,14 +43,12 @@ define i8* @test3(i1 %c) { ; just never return period.) define i8* @test4_helper() { ; FNATTR: define noalias nonnull i8* @test4_helper -; ATTRIBUTOR: define noalias nonnull align 536870912 dereferenceable(4294967295) i8* @test4_helper %ret = call i8* @test4() ret i8* %ret } define i8* @test4() { ; FNATTR: define noalias nonnull i8* @test4 -; ATTRIBUTOR: define noalias nonnull align 536870912 dereferenceable(4294967295) i8* @test4 %ret = call i8* @test4_helper() ret i8* %ret } @@ -62,7 +57,6 @@ define i8* @test4() { ; make sure we haven't marked them as nonnull. define i8* @test5_helper(i1 %c) { ; FNATTR: define noalias i8* @test5_helper -; ATTRIBUTOR: define noalias i8* @test5_helper br i1 %c, label %rec, label %end rec: %ret = call i8* @test5(i1 %c) @@ -73,14 +67,11 @@ end: define i8* @test5(i1 %c) { ; FNATTR: define noalias i8* @test5 -; ATTRIBUTOR: define noalias i8* @test5 %ret = call i8* @test5_helper(i1 %c) ret i8* %ret } ; Local analysis, but going through a self recursive phi -; ATTRIBUTOR: Function Attrs: noreturn -; ATTRIBUTOR: define noalias nonnull align 536870912 dereferenceable(4294967295) i8* @test6a() define i8* @test6a() { entry: %ret = call i8* @ret_nonnull() @@ -92,7 +83,6 @@ exit: ret i8* %phi } -; ATTRIBUTOR: define nonnull i8* @test6b(i1 %c) define i8* @test6b(i1 %c) { entry: %ret = call i8* @ret_nonnull() @@ -104,19 +94,19 @@ exit: ret i8* %phi } -; BOTH: define i8* @test7 +; FNATTR: define i8* @test7 define i8* @test7(i8* %a) { %b = getelementptr inbounds i8, i8* %a, i64 0 ret i8* %b } -; BOTH: define nonnull i8* @test8 +; FNATTR: define nonnull i8* @test8 define i8* @test8(i8* %a) { %b = getelementptr inbounds i8, i8* %a, i64 1 ret i8* %b } -; BOTH: define i8* @test9 +; FNATTR: define i8* @test9 define i8* @test9(i8* %a, i64 %n) { %b = getelementptr inbounds i8, i8* %a, i64 %n ret i8* %b @@ -125,7 +115,6 @@ define i8* @test9(i8* %a, i64 %n) { declare void @llvm.assume(i1) ; FNATTR: define i8* @test10 ; FIXME: missing nonnull -; ATTRIBUTOR: define i8* @test10 define i8* @test10(i8* %a, i64 %n) { %cmp = icmp ne i64 %n, 0 call void @llvm.assume(i1 %cmp) @@ -139,7 +128,6 @@ define i8* @test10(i8* %a, i64 %n) { ; } ; FNATTR: define i8* @test11 ; FIXME: missing nonnull -; ATTRIBUTOR: define i8* @test11 define i8* @test11(i8*) local_unnamed_addr { %2 = icmp eq i8* %0, null br i1 %2, label %3, label %5 @@ -157,8 +145,6 @@ define i8* @test11(i8*) local_unnamed_addr { ; Simple CallSite Test declare void @test12_helper(i8*) define void @test12(i8* nonnull %a) { -; ATTRIBUTOR: define void @test12(i8* nonnull %a) -; ATTRIBUTOR-NEXT: tail call void @test12_helper(i8* nonnull %a) tail call void @test12_helper(i8* %a) ret void } @@ -174,7 +160,6 @@ define void @test13_helper() { ret void } define internal void @test13(i8* %a, i8* %b, i8* %c) { -; ATTRIBUTOR: define internal void @test13(i8* nocapture nofree nonnull readnone %a, i8* nocapture nofree readnone %b, i8* nocapture nofree readnone %c) ret void } @@ -194,7 +179,6 @@ declare nonnull i8* @nonnull() define internal i32* @f1(i32* %arg) { ; FIXME: missing nonnull It should be nonnull @f1(i32* nonnull readonly %arg) -; ATTRIBUTOR: define internal nonnull i32* @f1(i32* nofree readonly %arg) bb: %tmp = icmp eq i32* %arg, null @@ -207,14 +191,12 @@ bb1: ; preds = %bb bb4: ; preds = %bb1 %tmp5 = getelementptr inbounds i32, i32* %arg, i64 1 -; ATTRIBUTOR: %tmp5b = tail call nonnull i32* @f3(i32* nofree nonnull %tmp5) %tmp5b = tail call i32* @f3(i32* %tmp5) %tmp5c = getelementptr inbounds i32, i32* %tmp5b, i64 -1 br label %bb9 bb6: ; preds = %bb1 ; FIXME: missing nonnull. It should be @f2(i32* nonnull %arg) -; ATTRIBUTOR: %tmp7 = tail call nonnull i32* @f2(i32* nofree %arg) %tmp7 = tail call i32* @f2(i32* %arg) ret i32* %tmp7 @@ -225,28 +207,23 @@ bb9: ; preds = %bb4, %bb define internal i32* @f2(i32* %arg) { ; FIXME: missing nonnull. It should be nonnull @f2(i32* nonnull %arg) -; ATTRIBUTOR: define internal nonnull i32* @f2(i32* nofree readonly %arg) bb: ; FIXME: missing nonnull. It should be @f1(i32* nonnull readonly %arg) -; ATTRIBUTOR: %tmp = tail call nonnull i32* @f1(i32* nofree %arg) %tmp = tail call i32* @f1(i32* %arg) ret i32* %tmp } define dso_local noalias i32* @f3(i32* %arg) { ; FIXME: missing nonnull. It should be nonnull @f3(i32* nonnull readonly %arg) -; ATTRIBUTOR: define dso_local noalias nonnull i32* @f3(i32* nofree readonly %arg) bb: ; FIXME: missing nonnull. It should be @f1(i32* nonnull readonly %arg) -; ATTRIBUTOR: %tmp = call nonnull i32* @f1(i32* nofree %arg) %tmp = call i32* @f1(i32* %arg) ret i32* %tmp } ; TEST 15 define void @f15(i8* %arg) { -; ATTRIBUTOR: tail call void @use1(i8* nonnull dereferenceable(4) %arg) tail call void @use1(i8* dereferenceable(4) %arg) ret void @@ -264,7 +241,6 @@ declare void @fun3(i8*, i8*, i8*) #1 ; We can say that %a is nonnull but %b is not. define void @f16(i8* %a, i8 * %b, i8 %c) { ; FIXME: missing nonnull on %a -; ATTRIBUTOR: define void @f16(i8* %a, i8* %b, i8 %c) %cmp = icmp eq i8 %c, 0 br i1 %cmp, label %if.then, label %if.else if.then: @@ -282,7 +258,6 @@ if.else: ; fun1(nonnull %a) ; We can say that %a is nonnull define void @f17(i8* %a, i8 %c) { -; ATTRIBUTOR: define void @f17(i8* nonnull %a, i8 %c) %cmp = icmp eq i8 %c, 0 br i1 %cmp, label %if.then, label %if.else if.then: @@ -307,7 +282,6 @@ cont: ; fun1(nonnull %a) define void @f18(i8* %a, i8* %b, i8 %c) { -; ATTRIBUTOR: define void @f18(i8* nonnull %a, i8* %b, i8 %c) %cmp1 = icmp eq i8 %c, 0 br i1 %cmp1, label %if.then, label %if.else if.then: @@ -334,7 +308,6 @@ cont2: define void @f19(i8* %a, i8* %b, i8 %c) { ; FIXME: missing nonnull on %b -; ATTRIBUTOR: define void @f19(i8* %a, i8* %b, i8 %c) br label %loop.header loop.header: %cmp2 = icmp eq i8 %c, 0 @@ -363,11 +336,10 @@ declare i8 @use1safecall(i8* %x) readonly nounwind ; readonly+nounwind guarantee ; Can't extend non-null to parent for any argument because the 2nd call is not guaranteed to execute. define void @parent1(i8* %a, i8* %b, i8* %c) { -; BOTH-LABEL: @parent1(i8* %a, i8* %b, i8* %c) -; BOTH-NEXT: call void @use3(i8* %c, i8* %a, i8* %b) +; FNATTR-LABEL: @parent1(i8* %a, i8* %b, i8* %c) +; FNATTR-NEXT: call void @use3(i8* %c, i8* %a, i8* %b) ; FNATTR-NEXT: call void @use3nonnull(i8* %b, i8* %c, i8* %a) -; ATTRIBUTOR-NEXT: call void @use3nonnull(i8* nonnull %b, i8* nonnull %c, i8* nonnull %a) -; BOTH-NEXT: ret void +; FNATTR-NEXT: ret void call void @use3(i8* %c, i8* %a, i8* %b) call void @use3nonnull(i8* %b, i8* %c, i8* %a) ret void @@ -380,11 +352,8 @@ define void @parent2(i8* %a, i8* %b, i8* %c) { ; FNATTR-NEXT: call void @use3nonnull(i8* %b, i8* %c, i8* %a) ; FNATTR-NEXT: call void @use3(i8* %c, i8* %a, i8* %b) -; ATTRIBUTOR-LABEL: @parent2(i8* nonnull %a, i8* nonnull %b, i8* nonnull %c) -; ATTRIBUTOR-NEXT: call void @use3nonnull(i8* nonnull %b, i8* nonnull %c, i8* nonnull %a) -; ATTRIBUTOR-NEXT: call void @use3(i8* nonnull %c, i8* nonnull %a, i8* nonnull %b) -; BOTH-NEXT: ret void +; FNATTR-NEXT: ret void call void @use3nonnull(i8* %b, i8* %c, i8* %a) call void @use3(i8* %c, i8* %a, i8* %b) ret void @@ -397,11 +366,8 @@ define void @parent3(i8* %a, i8* %b, i8* %c) { ; FNATTR-NEXT: call void @use1nonnull(i8* %a) ; FNATTR-NEXT: call void @use3(i8* %c, i8* %b, i8* %a) -; ATTRIBUTOR-LABEL: @parent3(i8* nonnull %a, i8* %b, i8* %c) -; ATTRIBUTOR-NEXT: call void @use1nonnull(i8* nonnull %a) -; ATTRIBUTOR-NEXT: call void @use3(i8* %c, i8* %b, i8* nonnull %a) -; BOTH-NEXT: ret void +; FNATTR-NEXT: ret void call void @use1nonnull(i8* %a) call void @use3(i8* %c, i8* %b, i8* %a) @@ -416,12 +382,8 @@ define void @parent4(i8* %a, i8* %b, i8* %c) { ; CHECK-NEXT: call void @use2(i8* %a, i8* %c) ; CHECK-NEXT: call void @use1(i8* %b) -; ATTRIBUTOR-LABEL: @parent4(i8* %a, i8* nonnull %b, i8* nonnull %c) -; ATTRIBUTOR-NEXT: call void @use2nonnull(i8* nonnull %c, i8* nonnull %b) -; ATTRIBUTOR-NEXT: call void @use2(i8* %a, i8* nonnull %c) -; ATTRIBUTOR-NEXT: call void @use1(i8* nonnull %b) -; BOTH: ret void +; FNATTR: ret void call void @use2nonnull(i8* %c, i8* %b) call void @use2(i8* %a, i8* %c) @@ -434,14 +396,13 @@ define void @parent4(i8* %a, i8* %b, i8* %c) { ; because it would incorrectly propagate the wrong information to its callers. define void @parent5(i8* %a, i1 %a_is_notnull) { -; BOTH: @parent5(i8* %a, i1 %a_is_notnull) -; BOTH-NEXT: br i1 %a_is_notnull, label %t, label %f -; BOTH: t: +; FNATTR: @parent5(i8* %a, i1 %a_is_notnull) +; FNATTR-NEXT: br i1 %a_is_notnull, label %t, label %f +; FNATTR: t: ; FNATTR-NEXT: call void @use1nonnull(i8* %a) -; ATTRIBUTOR-NEXT: call void @use1nonnull(i8* nonnull %a) -; BOTH-NEXT: ret void -; BOTH: f: -; BOTH-NEXT: ret void +; FNATTR-NEXT: ret void +; FNATTR: f: +; FNATTR-NEXT: ret void br i1 %a_is_notnull, label %t, label %f t: @@ -456,11 +417,9 @@ f: define i8 @parent6(i8* %a, i8* %b) { ; FNATTR-LABEL: @parent6(i8* nonnull %a, i8* %b) -; ATTRIBUTOR-LABEL: @parent6(i8* nonnull %a, i8* %b) -; BOTH-NEXT: [[C:%.*]] = load volatile i8, i8* %b +; FNATTR-NEXT: [[C:%.*]] = load volatile i8, i8* %b ; FNATTR-NEXT: call void @use1nonnull(i8* %a) -; ATTRIBUTOR-NEXT: call void @use1nonnull(i8* nonnull %a) -; BOTH-NEXT: ret i8 [[C]] +; FNATTR-NEXT: ret i8 [[C]] %c = load volatile i8, i8* %b call void @use1nonnull(i8* %a) @@ -475,11 +434,8 @@ define i8 @parent7(i8* %a) { ; FNATTR-NEXT: call void @use1nonnull(i8* %a) -; ATTRIBUTOR-LABEL: @parent7(i8* nonnull %a) -; ATTRIBUTOR-NEXT: [[RET:%.*]] = call i8 @use1safecall(i8* nonnull %a) -; ATTRIBUTOR-NEXT: call void @use1nonnull(i8* nonnull %a) -; BOTH-NEXT: ret i8 [[RET]] +; FNATTR-NEXT: ret i8 [[RET]] %ret = call i8 @use1safecall(i8* %a) call void @use1nonnull(i8* %a) @@ -492,18 +448,16 @@ declare i32 @esfp(...) define i1 @parent8(i8* %a, i8* %bogus1, i8* %b) personality i8* bitcast (i32 (...)* @esfp to i8*){ ; FNATTR-LABEL: @parent8(i8* nonnull %a, i8* nocapture readnone %bogus1, i8* nonnull %b) -; ATTRIBUTOR-LABEL: @parent8(i8* nonnull %a, i8* nocapture nofree readnone %bogus1, i8* nonnull %b) -; BOTH-NEXT: entry: +; FNATTR-NEXT: entry: ; FNATTR-NEXT: invoke void @use2nonnull(i8* %a, i8* %b) -; ATTRIBUTOR-NEXT: invoke void @use2nonnull(i8* nonnull %a, i8* nonnull %b) -; BOTH-NEXT: to label %cont unwind label %exc -; BOTH: cont: -; BOTH-NEXT: [[NULL_CHECK:%.*]] = icmp eq i8* %b, null -; BOTH-NEXT: ret i1 [[NULL_CHECK]] -; BOTH: exc: -; BOTH-NEXT: [[LP:%.*]] = landingpad { i8*, i32 } -; BOTH-NEXT: filter [0 x i8*] zeroinitializer -; BOTH-NEXT: unreachable +; FNATTR-NEXT: to label %cont unwind label %exc +; FNATTR: cont: +; FNATTR-NEXT: [[NULL_CHECK:%.*]] = icmp eq i8* %b, null +; FNATTR-NEXT: ret i1 [[NULL_CHECK]] +; FNATTR: exc: +; FNATTR-NEXT: [[LP:%.*]] = landingpad { i8*, i32 } +; FNATTR-NEXT: filter [0 x i8*] zeroinitializer +; FNATTR-NEXT: unreachable entry: invoke void @use2nonnull(i8* %a, i8* %b) @@ -519,7 +473,7 @@ exc: unreachable } -; BOTH: define nonnull i32* @gep1( +; FNATTR: define nonnull i32* @gep1( define i32* @gep1(i32* %p) { %q = getelementptr inbounds i32, i32* %p, i32 1 ret i32* %q @@ -527,12 +481,12 @@ define i32* @gep1(i32* %p) { define i32* @gep1_no_null_opt(i32* %p) #0 { ; Should't be able to derive nonnull based on gep. -; BOTH: define i32* @gep1_no_null_opt( +; FNATTR: define i32* @gep1_no_null_opt( %q = getelementptr inbounds i32, i32* %p, i32 1 ret i32* %q } -; BOTH: define i32 addrspace(3)* @gep2( +; FNATTR: define i32 addrspace(3)* @gep2( define i32 addrspace(3)* @gep2(i32 addrspace(3)* %p) { %q = getelementptr inbounds i32, i32 addrspace(3)* %p, i32 1 ret i32 addrspace(3)* %q @@ -540,12 +494,11 @@ define i32 addrspace(3)* @gep2(i32 addrspace(3)* %p) { ; FNATTR: define i32 addrspace(3)* @as(i32 addrspace(3)* readnone returned dereferenceable(4) %p) ; FIXME: We should propagate dereferenceable here but *not* nonnull -; ATTRIBUTOR: define dereferenceable_or_null(4) i32 addrspace(3)* @as(i32 addrspace(3)* nofree readnone returned dereferenceable(4) dereferenceable_or_null(4) %p) define i32 addrspace(3)* @as(i32 addrspace(3)* dereferenceable(4) %p) { ret i32 addrspace(3)* %p } -; BOTH: define internal nonnull i32* @g2() +; FNATTR: define internal nonnull i32* @g2() define internal i32* @g2() { ret i32* inttoptr (i64 4 to i32*) } @@ -556,33 +509,28 @@ define i32* @g1() { } declare void @use_i32_ptr(i32*) readnone nounwind -; ATTRIBUTOR: define internal void @called_by_weak(i32* nocapture nonnull readnone %a) define internal void @called_by_weak(i32* %a) { call void @use_i32_ptr(i32* %a) ret void } ; Check we do not annotate the function interface of this weak function. -; ATTRIBUTOR: define weak_odr void @weak_caller(i32* nonnull %a) define weak_odr void @weak_caller(i32* nonnull %a) { call void @called_by_weak(i32* %a) ret void } ; Expect nonnull -; ATTRIBUTOR: define internal void @control(i32* nocapture nonnull readnone align 16 dereferenceable(8) %a) define internal void @control(i32* dereferenceable(4) %a) { call void @use_i32_ptr(i32* %a) ret void } ; Avoid nonnull as we do not touch naked functions -; ATTRIBUTOR: define internal void @naked(i32* dereferenceable(4) %a) define internal void @naked(i32* dereferenceable(4) %a) naked { call void @use_i32_ptr(i32* %a) ret void } ; Avoid nonnull as we do not touch optnone -; ATTRIBUTOR: define internal void @optnone(i32* dereferenceable(4) %a) define internal void @optnone(i32* dereferenceable(4) %a) optnone noinline { call void @use_i32_ptr(i32* %a) ret void @@ -618,20 +566,6 @@ define i32 @nonnull_exec_ctx_1(i32* %a, i32 %b) { ; FNATTR-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], [[B]] ; FNATTR-NEXT: br i1 [[TMP9]], label [[EX]], label [[HD]] ; -; ATTRIBUTOR-LABEL: define {{[^@]+}}@nonnull_exec_ctx_1 -; ATTRIBUTOR-SAME: (i32* [[A:%.*]], i32 [[B:%.*]]) -; 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(i32* nonnull [[A:%.*]]) -; ATTRIBUTOR-NEXT: ret i32 [[TMP5]] -; ATTRIBUTOR: hd: -; ATTRIBUTOR-NEXT: [[TMP7:%.*]] = phi i32 [ [[TMP8:%.*]], [[HD]] ], [ 0, [[EN:%.*]] ] -; ATTRIBUTOR-NEXT: tail call void @h(i32* [[A]]) -; 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 @@ -667,22 +601,6 @@ define i32 @nonnull_exec_ctx_1b(i32* %a, i32 %b) { ; FNATTR-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], [[B]] ; FNATTR-NEXT: br i1 [[TMP9]], label [[EX]], label [[HD]] ; -; ATTRIBUTOR-LABEL: define {{[^@]+}}@nonnull_exec_ctx_1b -; ATTRIBUTOR-SAME: (i32* [[A:%.*]], i32 [[B:%.*]]) -; 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(i32* nonnull [[A:%.*]]) -; ATTRIBUTOR-NEXT: ret i32 [[TMP5]] -; ATTRIBUTOR: hd: -; ATTRIBUTOR-NEXT: [[TMP7:%.*]] = phi i32 [ [[TMP8:%.*]], [[HD2:%.*]] ], [ 0, [[EN:%.*]] ] -; ATTRIBUTOR-NEXT: tail call void @h(i32* [[A]]) -; 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 @@ -719,20 +637,6 @@ define i32 @nonnull_exec_ctx_2(i32* %a, i32 %b) willreturn nounwind { ; FNATTR-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], [[B]] ; FNATTR-NEXT: br i1 [[TMP9]], label [[EX]], label [[HD]] ; -; ATTRIBUTOR-LABEL: define {{[^@]+}}@nonnull_exec_ctx_2 -; ATTRIBUTOR-SAME: (i32* [[A:%.*]], i32 [[B:%.*]]) -; 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(i32* nonnull [[A:%.*]]) -; ATTRIBUTOR-NEXT: ret i32 [[TMP5]] -; ATTRIBUTOR: hd: -; ATTRIBUTOR-NEXT: [[TMP7:%.*]] = phi i32 [ [[TMP8:%.*]], [[HD]] ], [ 0, [[EN:%.*]] ] -; ATTRIBUTOR-NEXT: tail call void @h(i32* nonnull [[A]]) -; 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 @@ -768,22 +672,6 @@ define i32 @nonnull_exec_ctx_2b(i32* %a, i32 %b) willreturn nounwind { ; FNATTR-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], [[B]] ; FNATTR-NEXT: br i1 [[TMP9]], label [[EX]], label [[HD]] ; -; ATTRIBUTOR-LABEL: define {{[^@]+}}@nonnull_exec_ctx_2b -; ATTRIBUTOR-SAME: (i32* [[A:%.*]], i32 [[B:%.*]]) -; 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(i32* nonnull [[A:%.*]]) -; ATTRIBUTOR-NEXT: ret i32 [[TMP5]] -; ATTRIBUTOR: hd: -; ATTRIBUTOR-NEXT: [[TMP7:%.*]] = phi i32 [ [[TMP8:%.*]], [[HD2:%.*]] ], [ 0, [[EN:%.*]] ] -; ATTRIBUTOR-NEXT: tail call void @h(i32* nonnull [[A]]) -; 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 @@ -809,21 +697,21 @@ declare void @sink(i32*) ; FIXME: the sink argument should be marked nonnull as in @PR43833_simple. define void @PR43833(i32* %0, i32 %1) { -; BOTH-LABEL: @PR43833( -; BOTH-NEXT: [[TMP3:%.*]] = icmp sgt i32 [[TMP1:%.*]], 1 -; BOTH-NEXT: br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP7:%.*]] -; BOTH: 4: -; BOTH-NEXT: [[TMP5:%.*]] = zext i32 [[TMP1]] to i64 -; BOTH-NEXT: [[TMP6:%.*]] = getelementptr inbounds i32, i32* [[TMP0:%.*]], i64 [[TMP5]] -; BOTH-NEXT: br label [[TMP8:%.*]] -; BOTH: 7: -; BOTH-NEXT: ret void -; BOTH: 8: -; BOTH-NEXT: [[TMP9:%.*]] = phi i32 [ 1, [[TMP4]] ], [ [[TMP10:%.*]], [[TMP8]] ] -; BOTH-NEXT: tail call void @sink(i32* [[TMP6]]) -; BOTH-NEXT: [[TMP10]] = add nuw nsw i32 [[TMP9]], 1 -; BOTH-NEXT: [[TMP11:%.*]] = icmp eq i32 [[TMP10]], [[TMP1]] -; BOTH-NEXT: br i1 [[TMP11]], label [[TMP7]], label [[TMP8]] +; FNATTR-LABEL: @PR43833( +; FNATTR-NEXT: [[TMP3:%.*]] = icmp sgt i32 [[TMP1:%.*]], 1 +; FNATTR-NEXT: br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP7:%.*]] +; FNATTR: 4: +; FNATTR-NEXT: [[TMP5:%.*]] = zext i32 [[TMP1]] to i64 +; FNATTR-NEXT: [[TMP6:%.*]] = getelementptr inbounds i32, i32* [[TMP0:%.*]], i64 [[TMP5]] +; FNATTR-NEXT: br label [[TMP8:%.*]] +; FNATTR: 7: +; FNATTR-NEXT: ret void +; FNATTR: 8: +; FNATTR-NEXT: [[TMP9:%.*]] = phi i32 [ 1, [[TMP4]] ], [ [[TMP10:%.*]], [[TMP8]] ] +; FNATTR-NEXT: tail call void @sink(i32* [[TMP6]]) +; FNATTR-NEXT: [[TMP10]] = add nuw nsw i32 [[TMP9]], 1 +; FNATTR-NEXT: [[TMP11:%.*]] = icmp eq i32 [[TMP10]], [[TMP1]] +; FNATTR-NEXT: br i1 [[TMP11]], label [[TMP7]], label [[TMP8]] ; %3 = icmp sgt i32 %1, 1 br i1 %3, label %4, label %7 @@ -846,37 +734,22 @@ define void @PR43833(i32* %0, i32 %1) { ; Adjusted from PR43833 define void @PR43833_simple(i32* %0, i32 %1) { -; OLD-LABEL: @PR43833_simple( -; OLD-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP1:%.*]], 0 -; OLD-NEXT: br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP7:%.*]] -; OLD: 4: -; OLD-NEXT: [[TMP5:%.*]] = zext i32 [[TMP1]] to i64 -; OLD-NEXT: [[TMP6:%.*]] = getelementptr inbounds i32, i32* [[TMP0:%.*]], i64 [[TMP5]] -; OLD-NEXT: br label [[TMP8:%.*]] -; OLD: 7: -; OLD-NEXT: ret void -; OLD: 8: -; OLD-NEXT: [[TMP9:%.*]] = phi i32 [ 1, [[TMP4]] ], [ [[TMP10:%.*]], [[TMP8]] ] -; OLD-NEXT: tail call void @sink(i32* [[TMP6]]) -; OLD-NEXT: [[TMP10]] = add nuw nsw i32 [[TMP9]], 1 -; OLD-NEXT: [[TMP11:%.*]] = icmp eq i32 [[TMP10]], [[TMP1]] -; OLD-NEXT: br i1 [[TMP11]], label [[TMP7]], label [[TMP8]] +; FNATTR-LABEL: @PR43833_simple( +; FNATTR-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP1:%.*]], 0 +; FNATTR-NEXT: br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP7:%.*]] +; FNATTR: 4: +; FNATTR-NEXT: [[TMP5:%.*]] = zext i32 [[TMP1]] to i64 +; FNATTR-NEXT: [[TMP6:%.*]] = getelementptr inbounds i32, i32* [[TMP0:%.*]], i64 [[TMP5]] +; FNATTR-NEXT: br label [[TMP8:%.*]] +; FNATTR: 7: +; FNATTR-NEXT: ret void +; FNATTR: 8: +; FNATTR-NEXT: [[TMP9:%.*]] = phi i32 [ 1, [[TMP4]] ], [ [[TMP10:%.*]], [[TMP8]] ] +; FNATTR-NEXT: tail call void @sink(i32* [[TMP6]]) +; FNATTR-NEXT: [[TMP10]] = add nuw nsw i32 [[TMP9]], 1 +; FNATTR-NEXT: [[TMP11:%.*]] = icmp eq i32 [[TMP10]], [[TMP1]] +; FNATTR-NEXT: br i1 [[TMP11]], label [[TMP7]], label [[TMP8]] ; -; ATTRIBUTOR_NPM-LABEL: @PR43833_simple( -; ATTRIBUTOR_NPM-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP1:%.*]], 0 -; ATTRIBUTOR_NPM-NEXT: br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP7:%.*]] -; ATTRIBUTOR_NPM: 4: -; ATTRIBUTOR_NPM-NEXT: [[TMP5:%.*]] = zext i32 [[TMP1]] to i64 -; ATTRIBUTOR_NPM-NEXT: [[TMP6:%.*]] = getelementptr inbounds i32, i32* [[TMP0:%.*]], i64 [[TMP5]] -; ATTRIBUTOR_NPM-NEXT: br label [[TMP8:%.*]] -; ATTRIBUTOR_NPM: 7: -; ATTRIBUTOR_NPM-NEXT: ret void -; ATTRIBUTOR_NPM: 8: -; ATTRIBUTOR_NPM-NEXT: [[TMP9:%.*]] = phi i32 [ 1, [[TMP4]] ], [ [[TMP10:%.*]], [[TMP8]] ] -; ATTRIBUTOR_NPM-NEXT: tail call void @sink(i32* [[TMP6]]) -; ATTRIBUTOR_NPM-NEXT: [[TMP10]] = add nuw nsw i32 [[TMP9]], 1 -; ATTRIBUTOR_NPM-NEXT: [[TMP11:%.*]] = icmp eq i32 [[TMP10]], [[TMP1]] -; ATTRIBUTOR_NPM-NEXT: br i1 [[TMP11]], label [[TMP7]], label [[TMP8]] ; %3 = icmp ne i32 %1, 0 br i1 %3, label %4, label %7 |

