1*e143e52cSFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2*e143e52cSFlorian Hahn; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 3*e143e52cSFlorian Hahn 4*e143e52cSFlorian Hahntarget datalayout = "p:128:64" 5*e143e52cSFlorian Hahn 6*e143e52cSFlorian Hahn; Test for 128 bit pointers. At the moment, constraints only support signed i64 offsets. 7*e143e52cSFlorian Hahndefine i1 @gep_decomp_large_index_63_bits(ptr %a) { 8*e143e52cSFlorian Hahn; CHECK-LABEL: @gep_decomp_large_index_63_bits( 9*e143e52cSFlorian Hahn; CHECK-NEXT: entry: 10*e143e52cSFlorian Hahn; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i64, ptr [[A:%.*]], i64 9223372036854775804 11*e143e52cSFlorian Hahn; CHECK-NEXT: [[GEP_2:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 9223372036854775805 12*e143e52cSFlorian Hahn; CHECK-NEXT: [[NE:%.*]] = icmp ne ptr [[GEP_1]], [[GEP_2]] 13*e143e52cSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[NE]]) 14*e143e52cSFlorian Hahn; CHECK-NEXT: [[CMP_ULE:%.*]] = icmp ule ptr [[GEP_1]], [[GEP_2]] 15*e143e52cSFlorian Hahn; CHECK-NEXT: [[CMP_UGE:%.*]] = icmp uge ptr [[GEP_1]], [[GEP_2]] 16*e143e52cSFlorian Hahn; CHECK-NEXT: [[RES:%.*]] = xor i1 [[CMP_ULE]], [[CMP_ULE]] 17*e143e52cSFlorian Hahn; CHECK-NEXT: ret i1 [[RES]] 18*e143e52cSFlorian Hahn; 19*e143e52cSFlorian Hahnentry: 20*e143e52cSFlorian Hahn %gep.1 = getelementptr inbounds i64, ptr %a, i64 9223372036854775804 21*e143e52cSFlorian Hahn %gep.2 = getelementptr inbounds i64, ptr %a, i64 9223372036854775805 22*e143e52cSFlorian Hahn %ne = icmp ne ptr %gep.1, %gep.2 23*e143e52cSFlorian Hahn call void @llvm.assume(i1 %ne) 24*e143e52cSFlorian Hahn %cmp.ule = icmp ule ptr %gep.1, %gep.2 25*e143e52cSFlorian Hahn %cmp.uge = icmp uge ptr %gep.1, %gep.2 26*e143e52cSFlorian Hahn %res = xor i1 %cmp.ule, %cmp.ule 27*e143e52cSFlorian Hahn ret i1 %res 28*e143e52cSFlorian Hahn} 29*e143e52cSFlorian Hahn 30*e143e52cSFlorian Hahndefine i1 @gep_decomp_large_index_67_bits(ptr %a) { 31*e143e52cSFlorian Hahn; CHECK-LABEL: @gep_decomp_large_index_67_bits( 32*e143e52cSFlorian Hahn; CHECK-NEXT: entry: 33*e143e52cSFlorian Hahn; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i64, ptr [[A:%.*]], i128 147573952589676412928 34*e143e52cSFlorian Hahn; CHECK-NEXT: [[GEP_2:%.*]] = getelementptr inbounds i64, ptr [[A]], i128 147573952589676412929 35*e143e52cSFlorian Hahn; CHECK-NEXT: [[NE:%.*]] = icmp ne ptr [[GEP_1]], [[GEP_2]] 36*e143e52cSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[NE]]) 37*e143e52cSFlorian Hahn; CHECK-NEXT: [[CMP_ULE:%.*]] = icmp ule ptr [[GEP_1]], [[GEP_2]] 38*e143e52cSFlorian Hahn; CHECK-NEXT: [[CMP_UGE:%.*]] = icmp uge ptr [[GEP_1]], [[GEP_2]] 39*e143e52cSFlorian Hahn; CHECK-NEXT: [[RES:%.*]] = xor i1 [[CMP_ULE]], [[CMP_UGE]] 40*e143e52cSFlorian Hahn; CHECK-NEXT: ret i1 [[RES]] 41*e143e52cSFlorian Hahn; 42*e143e52cSFlorian Hahnentry: 43*e143e52cSFlorian Hahn %gep.1 = getelementptr inbounds i64, ptr %a, i128 147573952589676412928 44*e143e52cSFlorian Hahn %gep.2 = getelementptr inbounds i64, ptr %a, i128 147573952589676412929 45*e143e52cSFlorian Hahn %ne = icmp ne ptr %gep.1, %gep.2 46*e143e52cSFlorian Hahn call void @llvm.assume(i1 %ne) 47*e143e52cSFlorian Hahn %cmp.ule = icmp ule ptr %gep.1, %gep.2 48*e143e52cSFlorian Hahn %cmp.uge = icmp uge ptr %gep.1, %gep.2 49*e143e52cSFlorian Hahn %res = xor i1 %cmp.ule, %cmp.uge 50*e143e52cSFlorian Hahn ret i1 %res 51*e143e52cSFlorian Hahn} 52*e143e52cSFlorian Hahn 53*e143e52cSFlorian Hahndeclare void @llvm.assume(i1) 54