[InstCombine] tighten checks for tests of assume -> metadata transform; NFC

llvm-svn: 290903
This commit is contained in:
Sanjay Patel 2017-01-03 19:32:11 +00:00
parent 1145989a71
commit ada846aff0
1 changed files with 38 additions and 25 deletions

View File

@ -188,41 +188,56 @@ entry:
declare void @escape(i32* %a) declare void @escape(i32* %a)
; Do we canonicalize a nonnull assumption on a load into ; Canonicalize a nonnull assumption on a load into metadata form.
; metadata form?
define i1 @nonnull1(i32** %a) { 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 %load = load i32*, i32** %a
%cmp = icmp ne i32* %load, null %cmp = icmp ne i32* %load, null
tail call void @llvm.assume(i1 %cmp) tail call void @llvm.assume(i1 %cmp)
tail call void @escape(i32* %load) tail call void @escape(i32* %load)
%rval = icmp eq i32* %load, null %rval = icmp eq i32* %load, null
ret i1 %rval 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 ; Make sure the above canonicalization applies only
; to pointer types. Doing otherwise would be illegal. ; to pointer types. Doing otherwise would be illegal.
define i1 @nonnull2(i32* %a) { 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 %load = load i32, i32* %a
%cmp = icmp ne i32 %load, 0 %cmp = icmp ne i32 %load, 0
tail call void @llvm.assume(i1 %cmp) tail call void @llvm.assume(i1 %cmp)
%rval = icmp eq i32 %load, 0 %rval = icmp eq i32 %load, 0
ret i1 %rval ret i1 %rval
; CHECK-LABEL: @nonnull2
; CHECK-NOT: !nonnull
; CHECK: call void @llvm.assume
} }
; Make sure the above canonicalization does not trigger ; Make sure the above canonicalization does not trigger
; if the assume is control dependent on something else ; if the assume is control dependent on something else
define i1 @nonnull3(i32** %a, i1 %control) { 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: entry:
%load = load i32*, i32** %a %load = load i32*, i32** %a
%cmp = icmp ne i32* %load, null %cmp = icmp ne i32* %load, null
@ -233,17 +248,21 @@ taken:
ret i1 %rval ret i1 %rval
not_taken: not_taken:
ret i1 true ret i1 true
; CHECK-LABEL: @nonnull3
; CHECK-NOT: !nonnull
; CHECK: call void @llvm.assume
} }
; Make sure the above canonicalization does not trigger ; 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 ; interrupted by an exception being thrown
define i1 @nonnull4(i32** %a) { 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 %load = load i32*, i32** %a
;; This call may throw! ;; This call may throw!
tail call void @escape(i32* %load) tail call void @escape(i32* %load)
@ -251,15 +270,9 @@ entry:
tail call void @llvm.assume(i1 %cmp) tail call void @llvm.assume(i1 %cmp)
%rval = icmp eq i32* %load, null %rval = icmp eq i32* %load, null
ret i1 %rval ret i1 %rval
; CHECK-LABEL: @nonnull4
; CHECK-NOT: !nonnull
; CHECK: call void @llvm.assume
} }
attributes #0 = { nounwind uwtable } attributes #0 = { nounwind uwtable }
attributes #1 = { nounwind } attributes #1 = { nounwind }