summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/FunctionAttrs
diff options
context:
space:
mode:
authorJohannes Doerfert <johannes@jdoerfert.de>2019-10-29 11:46:00 -0500
committerJohannes Doerfert <johannes@jdoerfert.de>2019-10-31 14:47:06 -0500
commit2d6d651e8cb62fc5f17782c37dcad0b7bf18a4e6 (patch)
treee68e597cf0eb3d774af71677e7c2ced5fa57ae81 /llvm/test/Transforms/FunctionAttrs
parent57dd4b03e4806bbb4760ab6150940150d884df20 (diff)
downloadbcm5719-llvm-2d6d651e8cb62fc5f17782c37dcad0b7bf18a4e6.tar.gz
bcm5719-llvm-2d6d651e8cb62fc5f17782c37dcad0b7bf18a4e6.zip
[Attributor] Make AANonNull perform context sensitive queries
Summary: In order to get context sensitivity from isKnownNonZero we need to provide a context instruction *and* a dominator tree. The latter is passed now to which actually allows to remove some initialization code. Tests taken from PR43833. Reviewers: uenoku, sstefan1 Subscribers: hiraditya, bollu, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D69595
Diffstat (limited to 'llvm/test/Transforms/FunctionAttrs')
-rw-r--r--llvm/test/Transforms/FunctionAttrs/nonnull.ll95
1 files changed, 94 insertions, 1 deletions
diff --git a/llvm/test/Transforms/FunctionAttrs/nonnull.ll b/llvm/test/Transforms/FunctionAttrs/nonnull.ll
index fb62e4aafac..cea4785d058 100644
--- a/llvm/test/Transforms/FunctionAttrs/nonnull.ll
+++ b/llvm/test/Transforms/FunctionAttrs/nonnull.ll
@@ -207,7 +207,7 @@ bb1: ; preds = %bb
bb4: ; preds = %bb1
%tmp5 = getelementptr inbounds i32, i32* %arg, i64 1
-; ATTRIBUTOR: %tmp5b = tail call i32* @f3(i32* nonnull %tmp5)
+; ATTRIBUTOR: %tmp5b = tail call nonnull i32* @f3(i32* nonnull %tmp5)
%tmp5b = tail call i32* @f3(i32* %tmp5)
%tmp5c = getelementptr inbounds i32, i32* %tmp5b, i64 -1
br label %bb9
@@ -803,5 +803,98 @@ hd2:
br i1 %tmp9, label %ex, label %hd
}
+; Original from PR43833
+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]]
+;
+ %3 = icmp sgt i32 %1, 1
+ br i1 %3, label %4, label %7
+
+4: ; preds = %2
+ %5 = zext i32 %1 to i64
+ %6 = getelementptr inbounds i32, i32* %0, i64 %5
+ br label %8
+
+7: ; preds = %8, %2
+ ret void
+
+8: ; preds = %8, %4
+ %9 = phi i32 [ 1, %4 ], [ %10, %8 ]
+ tail call void @sink(i32* %6)
+ %10 = add nuw nsw i32 %9, 1
+ %11 = icmp eq i32 %10, %1
+ br i1 %11, label %7, label %8
+}
+
+; 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]]
+;
+; 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* nonnull [[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
+
+4: ; preds = %2
+ %5 = zext i32 %1 to i64
+ %6 = getelementptr inbounds i32, i32* %0, i64 %5
+ br label %8
+
+7: ; preds = %8, %2
+ ret void
+
+8: ; preds = %8, %4
+ %9 = phi i32 [ 1, %4 ], [ %10, %8 ]
+ tail call void @sink(i32* %6)
+ %10 = add nuw nsw i32 %9, 1
+ %11 = icmp eq i32 %10, %1
+ br i1 %11, label %7, label %8
+}
+
attributes #0 = { "null-pointer-is-valid"="true" }
attributes #1 = { nounwind willreturn}
OpenPOWER on IntegriCloud