diff options
Diffstat (limited to 'llvm/test/Transforms/GVN')
| -rw-r--r-- | llvm/test/Transforms/GVN/assume-equal.ll | 44 | 
1 files changed, 44 insertions, 0 deletions
| diff --git a/llvm/test/Transforms/GVN/assume-equal.ll b/llvm/test/Transforms/GVN/assume-equal.ll index bbbc5c5..a389801 100644 --- a/llvm/test/Transforms/GVN/assume-equal.ll +++ b/llvm/test/Transforms/GVN/assume-equal.ll @@ -1,6 +1,8 @@  ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5  ; RUN: opt < %s -passes=gvn -S | FileCheck %s +target datalayout = "p1:64:64:64:32" +  %struct.A = type { ptr }  @_ZTV1A = available_externally unnamed_addr constant [4 x ptr] [ptr null, ptr @_ZTI1A, ptr @_ZN1A3fooEv, ptr @_ZN1A3barEv], align 8  @_ZTI1A = external constant ptr @@ -372,6 +374,20 @@ define i1 @assume_ptr_eq_different_prov_does_not_matter_icmp(ptr %p, ptr %p2) {    ret i1 %c  } +define i1 @assume_ptr_eq_different_prov_does_not_matter_icmp_addrsize(ptr addrspace(1) %p, ptr addrspace(1) %p2) { +; CHECK-LABEL: define i1 @assume_ptr_eq_different_prov_does_not_matter_icmp_addrsize( +; CHECK-SAME: ptr addrspace(1) [[P:%.*]], ptr addrspace(1) [[P2:%.*]]) { +; CHECK-NEXT:    [[CMP:%.*]] = icmp eq ptr addrspace(1) [[P]], [[P2]] +; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP]]) +; CHECK-NEXT:    [[C:%.*]] = icmp eq ptr addrspace(1) [[P]], null +; CHECK-NEXT:    ret i1 [[C]] +; +  %cmp = icmp eq ptr addrspace(1) %p, %p2 +  call void @llvm.assume(i1 %cmp) +  %c = icmp eq ptr addrspace(1) %p2, null +  ret i1 %c +} +  ; This is not correct, as it may change the provenance exposed by ptrtoint.  ; We still allow it for now.  define i64 @assume_ptr_eq_different_prov_does_not_matter_ptrtoint(ptr %p, ptr %p2) { @@ -388,6 +404,20 @@ define i64 @assume_ptr_eq_different_prov_does_not_matter_ptrtoint(ptr %p, ptr %p    ret i64 %int  } +define i64 @assume_ptr_eq_different_prov_does_not_matter_ptrtoint_addrsize(ptr addrspace(1) %p, ptr addrspace(1) %p2) { +; CHECK-LABEL: define i64 @assume_ptr_eq_different_prov_does_not_matter_ptrtoint_addrsize( +; CHECK-SAME: ptr addrspace(1) [[P:%.*]], ptr addrspace(1) [[P2:%.*]]) { +; CHECK-NEXT:    [[CMP:%.*]] = icmp eq ptr addrspace(1) [[P]], [[P2]] +; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP]]) +; CHECK-NEXT:    [[INT:%.*]] = ptrtoint ptr addrspace(1) [[P]] to i64 +; CHECK-NEXT:    ret i64 [[INT]] +; +  %cmp = icmp eq ptr addrspace(1) %p, %p2 +  call void @llvm.assume(i1 %cmp) +  %int = ptrtoint ptr addrspace(1) %p2 to i64 +  ret i64 %int +} +  define i64 @assume_ptr_eq_different_prov_does_not_matter_ptrtoaddr(ptr %p, ptr %p2) {  ; CHECK-LABEL: define i64 @assume_ptr_eq_different_prov_does_not_matter_ptrtoaddr(  ; CHECK-SAME: ptr [[P:%.*]], ptr [[P2:%.*]]) { @@ -402,6 +432,20 @@ define i64 @assume_ptr_eq_different_prov_does_not_matter_ptrtoaddr(ptr %p, ptr %    ret i64 %int  } +define i32 @assume_ptr_eq_different_prov_does_not_matter_ptrtoaddr_addrsize(ptr addrspace(1) %p, ptr addrspace(1) %p2) { +; CHECK-LABEL: define i32 @assume_ptr_eq_different_prov_does_not_matter_ptrtoaddr_addrsize( +; CHECK-SAME: ptr addrspace(1) [[P:%.*]], ptr addrspace(1) [[P2:%.*]]) { +; CHECK-NEXT:    [[CMP:%.*]] = icmp eq ptr addrspace(1) [[P]], [[P2]] +; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP]]) +; CHECK-NEXT:    [[INT:%.*]] = ptrtoaddr ptr addrspace(1) [[P]] to i32 +; CHECK-NEXT:    ret i32 [[INT]] +; +  %cmp = icmp eq ptr addrspace(1) %p, %p2 +  call void @llvm.assume(i1 %cmp) +  %int = ptrtoaddr ptr addrspace(1) %p2 to i32 +  ret i32 %int +} +  define i8 @assume_ptr_eq_same_prov(ptr %p, i64 %x) {  ; CHECK-LABEL: define i8 @assume_ptr_eq_same_prov(  ; CHECK-SAME: ptr [[P:%.*]], i64 [[X:%.*]]) { | 
