forked from OSchip/llvm-project
[InstCombine] tighten checks for tests of assume -> metadata transform; NFC
llvm-svn: 290903
This commit is contained in:
parent
1145989a71
commit
ada846aff0
|
@ -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 }
|
||||
|
||||
|
|
Loading…
Reference in New Issue