From 3b6c9c19a0bd8a1ce4ee11d98e18f931b3493553 Mon Sep 17 00:00:00 2001 From: Sanjay Patel Date: Tue, 3 Jan 2017 19:32:11 +0000 Subject: [PATCH] [InstCombine] tighten checks for tests of assume -> metadata transform; NFC git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@290903 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/Transforms/InstCombine/assume.ll | 63 ++++++++++++++++----------- 1 file changed, 38 insertions(+), 25 deletions(-) diff --git a/test/Transforms/InstCombine/assume.ll b/test/Transforms/InstCombine/assume.ll index 2f9213820f2..7987aa24231 100644 --- a/test/Transforms/InstCombine/assume.ll +++ b/test/Transforms/InstCombine/assume.ll @@ -188,41 +188,56 @@ entry: declare void @escape(i32* %a) -; Do we canonicalize a nonnull assumption on a load into -; metadata form? +; Canonicalize a nonnull assumption on a load into metadata form. + define i1 @nonnull1(i32** %a) { -entry: +; CHECK-LABEL: @nonnull1( +; CHECK-NEXT: [[LOAD:%.*]] = load i32*, i32** %a, align 8, !nonnull !0 +; CHECK-NEXT: tail call void @escape(i32* nonnull [[LOAD]]) +; CHECK-NEXT: ret i1 false +; %load = load i32*, i32** %a %cmp = icmp ne i32* %load, null tail call void @llvm.assume(i1 %cmp) tail call void @escape(i32* %load) %rval = icmp eq i32* %load, null ret i1 %rval - -; CHECK-LABEL: @nonnull1 -; CHECK: !nonnull -; CHECK-NOT: call void @llvm.assume -; CHECK: ret i1 false } ; Make sure the above canonicalization applies only ; to pointer types. Doing otherwise would be illegal. + define i1 @nonnull2(i32* %a) { -entry: +; CHECK-LABEL: @nonnull2( +; CHECK-NEXT: [[LOAD:%.*]] = load i32, i32* %a, align 4 +; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[LOAD]], 0 +; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]]) +; CHECK-NEXT: [[RVAL:%.*]] = icmp eq i32 [[LOAD]], 0 +; CHECK-NEXT: ret i1 [[RVAL]] +; %load = load i32, i32* %a %cmp = icmp ne i32 %load, 0 tail call void @llvm.assume(i1 %cmp) %rval = icmp eq i32 %load, 0 ret i1 %rval - -; CHECK-LABEL: @nonnull2 -; CHECK-NOT: !nonnull -; CHECK: call void @llvm.assume } ; Make sure the above canonicalization does not trigger ; if the assume is control dependent on something else + define i1 @nonnull3(i32** %a, i1 %control) { +; CHECK-LABEL: @nonnull3( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[LOAD:%.*]] = load i32*, i32** %a, align 8 +; CHECK-NEXT: br i1 %control, label %taken, label %not_taken +; CHECK: taken: +; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32* [[LOAD]], null +; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]]) +; CHECK-NEXT: [[RVAL:%.*]] = icmp eq i32* [[LOAD]], null +; CHECK-NEXT: ret i1 [[RVAL]] +; CHECK: not_taken: +; CHECK-NEXT: ret i1 true +; entry: %load = load i32*, i32** %a %cmp = icmp ne i32* %load, null @@ -233,17 +248,21 @@ taken: ret i1 %rval not_taken: ret i1 true - -; CHECK-LABEL: @nonnull3 -; CHECK-NOT: !nonnull -; CHECK: call void @llvm.assume } ; Make sure the above canonicalization does not trigger -; if the path from the load to the assume is potentially +; if the path from the load to the assume is potentially ; interrupted by an exception being thrown + define i1 @nonnull4(i32** %a) { -entry: +; CHECK-LABEL: @nonnull4( +; CHECK-NEXT: [[LOAD:%.*]] = load i32*, i32** %a, align 8 +; CHECK-NEXT: tail call void @escape(i32* [[LOAD]]) +; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32* [[LOAD]], null +; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]]) +; CHECK-NEXT: [[RVAL:%.*]] = icmp eq i32* [[LOAD]], null +; CHECK-NEXT: ret i1 [[RVAL]] +; %load = load i32*, i32** %a ;; This call may throw! tail call void @escape(i32* %load) @@ -251,15 +270,9 @@ entry: tail call void @llvm.assume(i1 %cmp) %rval = icmp eq i32* %load, null ret i1 %rval - -; CHECK-LABEL: @nonnull4 -; CHECK-NOT: !nonnull -; CHECK: call void @llvm.assume } - - attributes #0 = { nounwind uwtable } attributes #1 = { nounwind } -- 2.49.0