11; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
22; RUN: opt < %s -passes=gvn -S | FileCheck %s
33
4+ target datalayout = "p1:64:64:64:32"
5+
46%struct.A = type { ptr }
57@_ZTV1A = available_externally unnamed_addr constant [4 x ptr ] [ptr null , ptr @_ZTI1A , ptr @_ZN1A3fooEv , ptr @_ZN1A3barEv ], align 8
68@_ZTI1A = external constant ptr
@@ -372,6 +374,20 @@ define i1 @assume_ptr_eq_different_prov_does_not_matter_icmp(ptr %p, ptr %p2) {
372374 ret i1 %c
373375}
374376
377+ define i1 @assume_ptr_eq_different_prov_does_not_matter_icmp_addrsize (ptr addrspace (1 ) %p , ptr addrspace (1 ) %p2 ) {
378+ ; CHECK-LABEL: define i1 @assume_ptr_eq_different_prov_does_not_matter_icmp_addrsize(
379+ ; CHECK-SAME: ptr addrspace(1) [[P:%.*]], ptr addrspace(1) [[P2:%.*]]) {
380+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr addrspace(1) [[P]], [[P2]]
381+ ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
382+ ; CHECK-NEXT: [[C:%.*]] = icmp eq ptr addrspace(1) [[P]], null
383+ ; CHECK-NEXT: ret i1 [[C]]
384+ ;
385+ %cmp = icmp eq ptr addrspace (1 ) %p , %p2
386+ call void @llvm.assume (i1 %cmp )
387+ %c = icmp eq ptr addrspace (1 ) %p2 , null
388+ ret i1 %c
389+ }
390+
375391; This is not correct, as it may change the provenance exposed by ptrtoint.
376392; We still allow it for now.
377393define 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
388404 ret i64 %int
389405}
390406
407+ define i64 @assume_ptr_eq_different_prov_does_not_matter_ptrtoint_addrsize (ptr addrspace (1 ) %p , ptr addrspace (1 ) %p2 ) {
408+ ; CHECK-LABEL: define i64 @assume_ptr_eq_different_prov_does_not_matter_ptrtoint_addrsize(
409+ ; CHECK-SAME: ptr addrspace(1) [[P:%.*]], ptr addrspace(1) [[P2:%.*]]) {
410+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr addrspace(1) [[P]], [[P2]]
411+ ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
412+ ; CHECK-NEXT: [[INT:%.*]] = ptrtoint ptr addrspace(1) [[P]] to i64
413+ ; CHECK-NEXT: ret i64 [[INT]]
414+ ;
415+ %cmp = icmp eq ptr addrspace (1 ) %p , %p2
416+ call void @llvm.assume (i1 %cmp )
417+ %int = ptrtoint ptr addrspace (1 ) %p2 to i64
418+ ret i64 %int
419+ }
420+
391421define i64 @assume_ptr_eq_different_prov_does_not_matter_ptrtoaddr (ptr %p , ptr %p2 ) {
392422; CHECK-LABEL: define i64 @assume_ptr_eq_different_prov_does_not_matter_ptrtoaddr(
393423; CHECK-SAME: ptr [[P:%.*]], ptr [[P2:%.*]]) {
@@ -402,6 +432,20 @@ define i64 @assume_ptr_eq_different_prov_does_not_matter_ptrtoaddr(ptr %p, ptr %
402432 ret i64 %int
403433}
404434
435+ define i32 @assume_ptr_eq_different_prov_does_not_matter_ptrtoaddr_addrsize (ptr addrspace (1 ) %p , ptr addrspace (1 ) %p2 ) {
436+ ; CHECK-LABEL: define i32 @assume_ptr_eq_different_prov_does_not_matter_ptrtoaddr_addrsize(
437+ ; CHECK-SAME: ptr addrspace(1) [[P:%.*]], ptr addrspace(1) [[P2:%.*]]) {
438+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr addrspace(1) [[P]], [[P2]]
439+ ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
440+ ; CHECK-NEXT: [[INT:%.*]] = ptrtoaddr ptr addrspace(1) [[P]] to i32
441+ ; CHECK-NEXT: ret i32 [[INT]]
442+ ;
443+ %cmp = icmp eq ptr addrspace (1 ) %p , %p2
444+ call void @llvm.assume (i1 %cmp )
445+ %int = ptr toaddr ptr addrspace (1 ) %p2 to i32
446+ ret i32 %int
447+ }
448+
405449define i8 @assume_ptr_eq_same_prov (ptr %p , i64 %x ) {
406450; CHECK-LABEL: define i8 @assume_ptr_eq_same_prov(
407451; CHECK-SAME: ptr [[P:%.*]], i64 [[X:%.*]]) {
0 commit comments