1abc14518SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 28ebb3eacSBjorn Pettersson; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 3abc14518SFlorian Hahn 4*34e477e9SFlorian Hahndefine i1 @gep0_and_cmp(ptr readonly %src, ptr readnone %min, ptr readnone %max) { 5af0087c0SFlorian Hahn; CHECK-LABEL: @gep0_and_cmp( 6af0087c0SFlorian Hahn; CHECK-NEXT: check.0.min: 7*34e477e9SFlorian Hahn; CHECK-NEXT: [[SRC_C:%.*]] = getelementptr i32, ptr [[SRC:%.*]], i64 0 8*34e477e9SFlorian Hahn; CHECK-NEXT: [[MIN_C:%.*]] = getelementptr i32, ptr [[MIN:%.*]], i64 0 9*34e477e9SFlorian Hahn; CHECK-NEXT: [[GEP_3:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 3 10*34e477e9SFlorian Hahn; CHECK-NEXT: [[GEP_3_C:%.*]] = getelementptr i32, ptr [[GEP_3]], i32 0 11*34e477e9SFlorian Hahn; CHECK-NEXT: [[C_MIN_0:%.*]] = icmp ult ptr [[SRC_C]], [[MIN_C]] 12*34e477e9SFlorian Hahn; CHECK-NEXT: [[C_MAX_3:%.*]] = icmp ugt ptr [[GEP_3_C]], [[MAX:%.*]] 13af0087c0SFlorian Hahn; CHECK-NEXT: [[OR:%.*]] = or i1 [[C_MIN_0]], [[C_MAX_3]] 14af0087c0SFlorian Hahn; CHECK-NEXT: br i1 [[OR]], label [[TRAP:%.*]], label [[CHECKS:%.*]] 15af0087c0SFlorian Hahn; CHECK: trap: 16af0087c0SFlorian Hahn; CHECK-NEXT: ret i1 false 17af0087c0SFlorian Hahn; CHECK: checks: 18*34e477e9SFlorian Hahn; CHECK-NEXT: [[C_3_MAX:%.*]] = icmp ult ptr [[GEP_3]], [[MAX]] 19af0087c0SFlorian Hahn; CHECK-NEXT: [[RES_1:%.*]] = xor i1 false, [[C_3_MAX]] 20*34e477e9SFlorian Hahn; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 1 21af0087c0SFlorian Hahn; CHECK-NEXT: [[RES_2:%.*]] = xor i1 false, true 22*34e477e9SFlorian Hahn; CHECK-NEXT: [[GEP_2:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 2 23af0087c0SFlorian Hahn; CHECK-NEXT: [[RES_3:%.*]] = xor i1 false, true 24*34e477e9SFlorian Hahn; CHECK-NEXT: [[GEP_4:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 4 25*34e477e9SFlorian Hahn; CHECK-NEXT: [[C_4_MAX:%.*]] = icmp ult ptr [[GEP_4]], [[MAX]] 26af0087c0SFlorian Hahn; CHECK-NEXT: [[RES_4:%.*]] = xor i1 false, [[C_4_MAX]] 27af0087c0SFlorian Hahn; CHECK-NEXT: [[RES_5:%.*]] = xor i1 [[RES_1]], [[RES_2]] 28af0087c0SFlorian Hahn; CHECK-NEXT: [[RES_6:%.*]] = xor i1 [[RES_5]], [[RES_3]] 29af0087c0SFlorian Hahn; CHECK-NEXT: [[RES_7:%.*]] = xor i1 [[RES_6]], [[RES_4]] 30af0087c0SFlorian Hahn; CHECK-NEXT: ret i1 [[RES_7]] 31af0087c0SFlorian Hahn; 32af0087c0SFlorian Hahncheck.0.min: 33*34e477e9SFlorian Hahn %src.c = getelementptr i32, ptr %src, i64 0 34*34e477e9SFlorian Hahn %min.c = getelementptr i32, ptr %min, i64 0 35af0087c0SFlorian Hahn 36*34e477e9SFlorian Hahn %gep.3 = getelementptr inbounds i32, ptr %src, i64 3 37*34e477e9SFlorian Hahn %gep.3.c = getelementptr i32, ptr %gep.3, i32 0 38*34e477e9SFlorian Hahn %c.min.0 = icmp ult ptr %src.c, %min.c 39*34e477e9SFlorian Hahn %c.max.3 = icmp ugt ptr %gep.3.c, %max 40af0087c0SFlorian Hahn 41af0087c0SFlorian Hahn %or = or i1 %c.min.0, %c.max.3 42af0087c0SFlorian Hahn br i1 %or, label %trap, label %checks 43af0087c0SFlorian Hahn 44af0087c0SFlorian Hahntrap: 45af0087c0SFlorian Hahn ret i1 0 46af0087c0SFlorian Hahn 47af0087c0SFlorian Hahnchecks: 48*34e477e9SFlorian Hahn %c.3.min = icmp ult ptr %gep.3, %min 49*34e477e9SFlorian Hahn %c.3.max = icmp ult ptr %gep.3, %max 50af0087c0SFlorian Hahn %res.1 = xor i1 %c.3.min, %c.3.max 51af0087c0SFlorian Hahn 52*34e477e9SFlorian Hahn %gep.1 = getelementptr inbounds i32, ptr %src, i64 1 53*34e477e9SFlorian Hahn %c.1.min = icmp ult ptr %gep.1, %min 54*34e477e9SFlorian Hahn %c.1.max = icmp ult ptr %gep.1, %max 55af0087c0SFlorian Hahn %res.2 = xor i1 %c.1.min, %c.1.max 56af0087c0SFlorian Hahn 57*34e477e9SFlorian Hahn %gep.2 = getelementptr inbounds i32, ptr %src, i64 2 58*34e477e9SFlorian Hahn %c.2.min = icmp ult ptr %gep.2, %min 59*34e477e9SFlorian Hahn %c.2.max = icmp ult ptr %gep.2, %max 60af0087c0SFlorian Hahn %res.3 = xor i1 %c.2.min, %c.2.max 61af0087c0SFlorian Hahn 62*34e477e9SFlorian Hahn %gep.4 = getelementptr inbounds i32, ptr %src, i64 4 63*34e477e9SFlorian Hahn %c.4.min = icmp ult ptr %gep.4, %min 64*34e477e9SFlorian Hahn %c.4.max = icmp ult ptr %gep.4, %max 65af0087c0SFlorian Hahn %res.4 = xor i1 %c.4.min, %c.4.max 66af0087c0SFlorian Hahn 67af0087c0SFlorian Hahn %res.5 = xor i1 %res.1, %res.2 68af0087c0SFlorian Hahn %res.6 = xor i1 %res.5, %res.3 69af0087c0SFlorian Hahn %res.7 = xor i1 %res.6, %res.4 70af0087c0SFlorian Hahn 71af0087c0SFlorian Hahn ret i1 %res.7 72af0087c0SFlorian Hahn} 73af0087c0SFlorian Hahn 74af0087c0SFlorian Hahn; Should not look through addresspacecast, because it may change the pointer 75af0087c0SFlorian Hahn; value. 76*34e477e9SFlorian Hahndefine i1 @addrspacecast_and_cmp(ptr readonly %src, ptr readnone %min, ptr readnone %max) { 77af0087c0SFlorian Hahn; CHECK-LABEL: @addrspacecast_and_cmp( 78af0087c0SFlorian Hahn; CHECK-NEXT: check.0.min: 79*34e477e9SFlorian Hahn; CHECK-NEXT: [[SRC_C:%.*]] = addrspacecast ptr [[SRC:%.*]] to ptr addrspace(1) 80*34e477e9SFlorian Hahn; CHECK-NEXT: [[MIN_C:%.*]] = addrspacecast ptr [[MIN:%.*]] to ptr addrspace(1) 81*34e477e9SFlorian Hahn; CHECK-NEXT: [[MAX_C:%.*]] = addrspacecast ptr [[MAX:%.*]] to ptr addrspace(1) 82*34e477e9SFlorian Hahn; CHECK-NEXT: [[GEP_3:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 3 83*34e477e9SFlorian Hahn; CHECK-NEXT: [[GEP_3_C:%.*]] = addrspacecast ptr [[GEP_3]] to ptr addrspace(1) 84*34e477e9SFlorian Hahn; CHECK-NEXT: [[C_MIN_0:%.*]] = icmp ult ptr addrspace(1) [[SRC_C]], [[MIN_C]] 85*34e477e9SFlorian Hahn; CHECK-NEXT: [[C_MAX_3:%.*]] = icmp ugt ptr addrspace(1) [[GEP_3_C]], [[MAX_C]] 86af0087c0SFlorian Hahn; CHECK-NEXT: [[OR:%.*]] = or i1 [[C_MIN_0]], [[C_MAX_3]] 87af0087c0SFlorian Hahn; CHECK-NEXT: br i1 [[OR]], label [[TRAP:%.*]], label [[CHECKS:%.*]] 88af0087c0SFlorian Hahn; CHECK: trap: 89af0087c0SFlorian Hahn; CHECK-NEXT: ret i1 false 90af0087c0SFlorian Hahn; CHECK: checks: 91*34e477e9SFlorian Hahn; CHECK-NEXT: [[C_3_MIN:%.*]] = icmp ult ptr [[GEP_3]], [[MIN]] 92*34e477e9SFlorian Hahn; CHECK-NEXT: [[C_3_MAX:%.*]] = icmp ult ptr [[GEP_3]], [[MAX]] 934858e081SFlorian Hahn; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[C_3_MIN]], [[C_3_MAX]] 94*34e477e9SFlorian Hahn; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 1 95*34e477e9SFlorian Hahn; CHECK-NEXT: [[C_1_MIN:%.*]] = icmp ult ptr [[GEP_1]], [[MIN]] 96*34e477e9SFlorian Hahn; CHECK-NEXT: [[C_1_MAX:%.*]] = icmp ult ptr [[GEP_1]], [[MAX]] 974858e081SFlorian Hahn; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[C_1_MIN]], [[C_1_MAX]] 98*34e477e9SFlorian Hahn; CHECK-NEXT: [[GEP_2:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 2 99*34e477e9SFlorian Hahn; CHECK-NEXT: [[C_2_MIN:%.*]] = icmp ult ptr [[GEP_2]], [[MIN]] 100*34e477e9SFlorian Hahn; CHECK-NEXT: [[C_2_MAX:%.*]] = icmp ult ptr [[GEP_2]], [[MAX]] 1014858e081SFlorian Hahn; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[C_2_MIN]], [[C_2_MAX]] 102*34e477e9SFlorian Hahn; CHECK-NEXT: [[GEP_4:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 4 103*34e477e9SFlorian Hahn; CHECK-NEXT: [[C_4_MIN:%.*]] = icmp ult ptr [[GEP_4]], [[MIN]] 104*34e477e9SFlorian Hahn; CHECK-NEXT: [[C_4_MAX:%.*]] = icmp ult ptr [[GEP_4]], [[MAX]] 1054858e081SFlorian Hahn; CHECK-NEXT: [[RES_4:%.*]] = xor i1 [[C_4_MIN]], [[C_4_MAX]] 106af0087c0SFlorian Hahn; CHECK-NEXT: [[RES_5:%.*]] = xor i1 [[RES_1]], [[RES_2]] 107af0087c0SFlorian Hahn; CHECK-NEXT: [[RES_6:%.*]] = xor i1 [[RES_5]], [[RES_3]] 108af0087c0SFlorian Hahn; CHECK-NEXT: [[RES_7:%.*]] = xor i1 [[RES_6]], [[RES_4]] 109af0087c0SFlorian Hahn; CHECK-NEXT: ret i1 [[RES_7]] 110af0087c0SFlorian Hahn; 111af0087c0SFlorian Hahncheck.0.min: 112*34e477e9SFlorian Hahn %src.c = addrspacecast ptr %src to ptr addrspace(1) 113*34e477e9SFlorian Hahn %min.c = addrspacecast ptr %min to ptr addrspace(1) 114*34e477e9SFlorian Hahn %max.c = addrspacecast ptr %max to ptr addrspace(1) 115af0087c0SFlorian Hahn 116*34e477e9SFlorian Hahn %gep.3 = getelementptr inbounds i32, ptr %src, i64 3 117*34e477e9SFlorian Hahn %gep.3.c = addrspacecast ptr %gep.3 to ptr addrspace(1) 118*34e477e9SFlorian Hahn %c.min.0 = icmp ult ptr addrspace(1) %src.c, %min.c 119*34e477e9SFlorian Hahn %c.max.3 = icmp ugt ptr addrspace(1) %gep.3.c, %max.c 120af0087c0SFlorian Hahn 121af0087c0SFlorian Hahn %or = or i1 %c.min.0, %c.max.3 122af0087c0SFlorian Hahn br i1 %or, label %trap, label %checks 123af0087c0SFlorian Hahn 124af0087c0SFlorian Hahntrap: 125af0087c0SFlorian Hahn ret i1 0 126af0087c0SFlorian Hahn 127af0087c0SFlorian Hahnchecks: 128*34e477e9SFlorian Hahn %c.3.min = icmp ult ptr %gep.3, %min 129*34e477e9SFlorian Hahn %c.3.max = icmp ult ptr %gep.3, %max 130af0087c0SFlorian Hahn %res.1 = xor i1 %c.3.min, %c.3.max 131af0087c0SFlorian Hahn 132*34e477e9SFlorian Hahn %gep.1 = getelementptr inbounds i32, ptr %src, i64 1 133*34e477e9SFlorian Hahn %c.1.min = icmp ult ptr %gep.1, %min 134*34e477e9SFlorian Hahn %c.1.max = icmp ult ptr %gep.1, %max 135af0087c0SFlorian Hahn %res.2 = xor i1 %c.1.min, %c.1.max 136af0087c0SFlorian Hahn 137*34e477e9SFlorian Hahn %gep.2 = getelementptr inbounds i32, ptr %src, i64 2 138*34e477e9SFlorian Hahn %c.2.min = icmp ult ptr %gep.2, %min 139*34e477e9SFlorian Hahn %c.2.max = icmp ult ptr %gep.2, %max 140af0087c0SFlorian Hahn %res.3 = xor i1 %c.2.min, %c.2.max 141af0087c0SFlorian Hahn 142*34e477e9SFlorian Hahn %gep.4 = getelementptr inbounds i32, ptr %src, i64 4 143*34e477e9SFlorian Hahn %c.4.min = icmp ult ptr %gep.4, %min 144*34e477e9SFlorian Hahn %c.4.max = icmp ult ptr %gep.4, %max 145af0087c0SFlorian Hahn %res.4 = xor i1 %c.4.min, %c.4.max 146af0087c0SFlorian Hahn 147af0087c0SFlorian Hahn %res.5 = xor i1 %res.1, %res.2 148af0087c0SFlorian Hahn %res.6 = xor i1 %res.5, %res.3 149af0087c0SFlorian Hahn %res.7 = xor i1 %res.6, %res.4 150af0087c0SFlorian Hahn 151af0087c0SFlorian Hahn ret i1 %res.7 152af0087c0SFlorian Hahn} 153