16fcea431SRamkumar Ramachandra; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 26fcea431SRamkumar Ramachandra; RUN: opt -passes=loop-versioning -S < %s | FileCheck %s 37d9827f5SFlorian Hahn 47d9827f5SFlorian Hahn; NB: addrspaces 10-13 are non-integral 57d9827f5SFlorian Hahntarget datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128-ni:10:11:12:13" 67d9827f5SFlorian Hahn 77d9827f5SFlorian Hahn; This matches the test case from PR38290 87d9827f5SFlorian Hahn; Check that we expand the SCEV predicate check using GEP, rather 97d9827f5SFlorian Hahn; than ptrtoint. 107d9827f5SFlorian Hahn 117d9827f5SFlorian Hahn%jl_value_t = type opaque 12055fb779SNikita Popov%jl_array_t = type { ptr addrspace(13), i64, i16, i16, i32 } 137d9827f5SFlorian Hahn 147d9827f5SFlorian Hahndeclare i64 @julia_steprange_last_4949() 157d9827f5SFlorian Hahn 166fcea431SRamkumar Ramachandradefine void @wrapping_ptr_nonint_addrspace(ptr %arg) { 176fcea431SRamkumar Ramachandra; CHECK-LABEL: define void @wrapping_ptr_nonint_addrspace( 186fcea431SRamkumar Ramachandra; CHECK-SAME: ptr [[ARG:%.*]]) { 196fcea431SRamkumar Ramachandra; CHECK-NEXT: [[LOOP_LVER_CHECK:.*:]] 206fcea431SRamkumar Ramachandra; CHECK-NEXT: [[LOAD0:%.*]] = load ptr addrspace(10), ptr [[ARG]], align 8 216fcea431SRamkumar Ramachandra; CHECK-NEXT: [[LOAD1:%.*]] = load i32, ptr inttoptr (i64 12 to ptr), align 4 226fcea431SRamkumar Ramachandra; CHECK-NEXT: [[SUB:%.*]] = sub i32 0, [[LOAD1]] 236fcea431SRamkumar Ramachandra; CHECK-NEXT: [[CALL:%.*]] = call i64 @julia_steprange_last_4949() 246fcea431SRamkumar Ramachandra; CHECK-NEXT: [[CAST0:%.*]] = addrspacecast ptr addrspace(10) [[LOAD0]] to ptr addrspace(11) 256fcea431SRamkumar Ramachandra; CHECK-NEXT: [[LOAD2:%.*]] = load ptr addrspace(10), ptr addrspace(11) [[CAST0]], align 8 266fcea431SRamkumar Ramachandra; CHECK-NEXT: [[CAST1:%.*]] = addrspacecast ptr addrspace(10) [[LOAD2]] to ptr addrspace(11) 276fcea431SRamkumar Ramachandra; CHECK-NEXT: [[LOAD3:%.*]] = load ptr addrspace(13), ptr addrspace(11) [[CAST1]], align 8 286fcea431SRamkumar Ramachandra; CHECK-NEXT: [[SEXT:%.*]] = sext i32 [[SUB]] to i64 296fcea431SRamkumar Ramachandra; CHECK-NEXT: [[TMP0:%.*]] = shl i64 [[CALL]], 2 306fcea431SRamkumar Ramachandra; CHECK-NEXT: [[TMP1:%.*]] = shl nsw i64 [[SEXT]], 2 316fcea431SRamkumar Ramachandra; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[TMP0]], [[TMP1]] 326fcea431SRamkumar Ramachandra; CHECK-NEXT: [[TMP3:%.*]] = add i64 [[TMP2]], -4 336fcea431SRamkumar Ramachandra; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr addrspace(13) [[LOAD3]], i64 [[TMP3]] 346fcea431SRamkumar Ramachandra; CHECK-NEXT: [[SCEVGEP1:%.*]] = getelementptr i8, ptr addrspace(13) [[LOAD3]], i64 [[TMP1]] 356fcea431SRamkumar Ramachandra; CHECK-NEXT: [[TMP4:%.*]] = add i64 [[TMP0]], -4 366fcea431SRamkumar Ramachandra; CHECK-NEXT: [[SCEVGEP2:%.*]] = getelementptr i8, ptr addrspace(13) [[LOAD3]], i64 [[TMP4]] 376fcea431SRamkumar Ramachandra; CHECK-NEXT: [[BOUND0:%.*]] = icmp ult ptr addrspace(13) [[SCEVGEP]], [[LOAD3]] 386fcea431SRamkumar Ramachandra; CHECK-NEXT: [[BOUND1:%.*]] = icmp ult ptr addrspace(13) [[SCEVGEP2]], [[SCEVGEP1]] 396fcea431SRamkumar Ramachandra; CHECK-NEXT: [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]] 40*f719cfa8SRamkumar Ramachandra; CHECK-NEXT: br i1 [[FOUND_CONFLICT]], label %[[LOOP_PH_LVER_ORIG:.*]], label %[[LOOP_PH:.*]] 416fcea431SRamkumar Ramachandra; CHECK: [[LOOP_PH_LVER_ORIG]]: 426fcea431SRamkumar Ramachandra; CHECK-NEXT: br label %[[LOOP_LVER_ORIG:.*]] 436fcea431SRamkumar Ramachandra; CHECK: [[LOOP_LVER_ORIG]]: 446fcea431SRamkumar Ramachandra; CHECK-NEXT: [[VALUE_PHI3_LVER_ORIG:%.*]] = phi i64 [ 0, %[[LOOP_PH_LVER_ORIG]] ], [ [[ADD0_LVER_ORIG:%.*]], %[[LOOP_LVER_ORIG]] ] 456fcea431SRamkumar Ramachandra; CHECK-NEXT: [[ADD0_LVER_ORIG]] = add i64 [[VALUE_PHI3_LVER_ORIG]], -1 466fcea431SRamkumar Ramachandra; CHECK-NEXT: [[GEP0_LVER_ORIG:%.*]] = getelementptr inbounds i32, ptr addrspace(13) [[LOAD3]], i64 [[ADD0_LVER_ORIG]] 476fcea431SRamkumar Ramachandra; CHECK-NEXT: [[LOAD4_LVER_ORIG:%.*]] = load i32, ptr addrspace(13) [[GEP0_LVER_ORIG]], align 4 486fcea431SRamkumar Ramachandra; CHECK-NEXT: [[ADD1_LVER_ORIG:%.*]] = add i64 [[ADD0_LVER_ORIG]], [[SEXT]] 496fcea431SRamkumar Ramachandra; CHECK-NEXT: [[GEP1_LVER_ORIG:%.*]] = getelementptr inbounds i32, ptr addrspace(13) [[LOAD3]], i64 [[ADD1_LVER_ORIG]] 506fcea431SRamkumar Ramachandra; CHECK-NEXT: store i32 [[LOAD4_LVER_ORIG]], ptr addrspace(13) [[GEP1_LVER_ORIG]], align 4 516fcea431SRamkumar Ramachandra; CHECK-NEXT: [[CMP_LVER_ORIG:%.*]] = icmp eq i64 [[VALUE_PHI3_LVER_ORIG]], [[CALL]] 526fcea431SRamkumar Ramachandra; CHECK-NEXT: br i1 [[CMP_LVER_ORIG]], label %[[EXIT_LOOPEXIT:.*]], label %[[LOOP_LVER_ORIG]] 536fcea431SRamkumar Ramachandra; CHECK: [[LOOP_PH]]: 546fcea431SRamkumar Ramachandra; CHECK-NEXT: br label %[[LOOP:.*]] 556fcea431SRamkumar Ramachandra; CHECK: [[LOOP]]: 566fcea431SRamkumar Ramachandra; CHECK-NEXT: [[VALUE_PHI3:%.*]] = phi i64 [ 0, %[[LOOP_PH]] ], [ [[ADD0:%.*]], %[[LOOP]] ] 576fcea431SRamkumar Ramachandra; CHECK-NEXT: [[ADD0]] = add i64 [[VALUE_PHI3]], -1 586fcea431SRamkumar Ramachandra; CHECK-NEXT: [[GEP0:%.*]] = getelementptr inbounds i32, ptr addrspace(13) [[LOAD3]], i64 [[ADD0]] 596fcea431SRamkumar Ramachandra; CHECK-NEXT: [[LOAD4:%.*]] = load i32, ptr addrspace(13) [[GEP0]], align 4, !alias.scope [[META0:![0-9]+]] 606fcea431SRamkumar Ramachandra; CHECK-NEXT: [[ADD1:%.*]] = add i64 [[ADD0]], [[SEXT]] 616fcea431SRamkumar Ramachandra; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds i32, ptr addrspace(13) [[LOAD3]], i64 [[ADD1]] 626fcea431SRamkumar Ramachandra; CHECK-NEXT: store i32 [[LOAD4]], ptr addrspace(13) [[GEP1]], align 4, !alias.scope [[META3:![0-9]+]], !noalias [[META0]] 636fcea431SRamkumar Ramachandra; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[VALUE_PHI3]], [[CALL]] 64*f719cfa8SRamkumar Ramachandra; CHECK-NEXT: br i1 [[CMP]], label %[[EXIT_LOOPEXIT3:.*]], label %[[LOOP]] 656fcea431SRamkumar Ramachandra; CHECK: [[EXIT_LOOPEXIT]]: 666fcea431SRamkumar Ramachandra; CHECK-NEXT: br label %[[EXIT:.*]] 67*f719cfa8SRamkumar Ramachandra; CHECK: [[EXIT_LOOPEXIT3]]: 686fcea431SRamkumar Ramachandra; CHECK-NEXT: br label %[[EXIT]] 696fcea431SRamkumar Ramachandra; CHECK: [[EXIT]]: 706fcea431SRamkumar Ramachandra; CHECK-NEXT: ret void 716fcea431SRamkumar Ramachandra; 727d9827f5SFlorian Hahntop: 736fcea431SRamkumar Ramachandra %load0 = load ptr addrspace(10), ptr %arg, align 8 746fcea431SRamkumar Ramachandra %load1 = load i32, ptr inttoptr (i64 12 to ptr), align 4 756fcea431SRamkumar Ramachandra %sub = sub i32 0, %load1 766fcea431SRamkumar Ramachandra %call = call i64 @julia_steprange_last_4949() 776fcea431SRamkumar Ramachandra %cast0 = addrspacecast ptr addrspace(10) %load0 to ptr addrspace(11) 786fcea431SRamkumar Ramachandra %load2 = load ptr addrspace(10), ptr addrspace(11) %cast0, align 8 796fcea431SRamkumar Ramachandra %cast1 = addrspacecast ptr addrspace(10) %load2 to ptr addrspace(11) 806fcea431SRamkumar Ramachandra %load3 = load ptr addrspace(13), ptr addrspace(11) %cast1, align 8 816fcea431SRamkumar Ramachandra %sext = sext i32 %sub to i64 826fcea431SRamkumar Ramachandra br label %loop 837d9827f5SFlorian Hahn 846fcea431SRamkumar Ramachandraloop: 856fcea431SRamkumar Ramachandra %value_phi3 = phi i64 [ 0, %top ], [ %add0, %loop ] 866fcea431SRamkumar Ramachandra %add0 = add i64 %value_phi3, -1 876fcea431SRamkumar Ramachandra %gep0 = getelementptr inbounds i32, ptr addrspace(13) %load3, i64 %add0 886fcea431SRamkumar Ramachandra %load4 = load i32, ptr addrspace(13) %gep0, align 4 896fcea431SRamkumar Ramachandra %add1 = add i64 %add0, %sext 906fcea431SRamkumar Ramachandra %gep1 = getelementptr inbounds i32, ptr addrspace(13) %load3, i64 %add1 916fcea431SRamkumar Ramachandra store i32 %load4, ptr addrspace(13) %gep1, align 4 926fcea431SRamkumar Ramachandra %cmp = icmp eq i64 %value_phi3, %call 936fcea431SRamkumar Ramachandra br i1 %cmp, label %exit, label %loop 947d9827f5SFlorian Hahn 956fcea431SRamkumar Ramachandraexit: 967d9827f5SFlorian Hahn ret void 977d9827f5SFlorian Hahn} 986fcea431SRamkumar Ramachandra;. 996fcea431SRamkumar Ramachandra; CHECK: [[META0]] = !{[[META1:![0-9]+]]} 1006fcea431SRamkumar Ramachandra; CHECK: [[META1]] = distinct !{[[META1]], [[META2:![0-9]+]]} 1016fcea431SRamkumar Ramachandra; CHECK: [[META2]] = distinct !{[[META2]], !"LVerDomain"} 1026fcea431SRamkumar Ramachandra; CHECK: [[META3]] = !{[[META4:![0-9]+]]} 1036fcea431SRamkumar Ramachandra; CHECK: [[META4]] = distinct !{[[META4]], [[META2]]} 1046fcea431SRamkumar Ramachandra;. 105