1cb3b5f07SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 28ebb3eacSBjorn Pettersson; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 3cb3b5f07SFlorian Hahn 4c5e1ddb6SFlorian Hahndefine void @pointer.to.array.test.ult.true.due.to.first.dimension(ptr %start, ptr %high) { 5cb3b5f07SFlorian Hahn; CHECK-LABEL: @pointer.to.array.test.ult.true.due.to.first.dimension( 6cb3b5f07SFlorian Hahn; CHECK-NEXT: entry: 7c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[ADD_PTR_I:%.*]] = getelementptr inbounds [10 x i8], ptr [[START:%.*]], i64 9, i64 3 8c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_I]], [[HIGH:%.*]] 9cb3b5f07SFlorian Hahn; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 10cb3b5f07SFlorian Hahn; CHECK: if.then: 11c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 5, i64 0 12*572d5d37SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 13cb3b5f07SFlorian Hahn; CHECK-NEXT: ret void 14cb3b5f07SFlorian Hahn; CHECK: if.end: 15cb3b5f07SFlorian Hahn; CHECK-NEXT: ret void 16cb3b5f07SFlorian Hahn; 17cb3b5f07SFlorian Hahnentry: 18c5e1ddb6SFlorian Hahn %add.ptr.i = getelementptr inbounds [10 x i8], ptr %start, i64 9, i64 3 19c5e1ddb6SFlorian Hahn %c.1 = icmp ule ptr %add.ptr.i, %high 20cb3b5f07SFlorian Hahn br i1 %c.1, label %if.then, label %if.end 21cb3b5f07SFlorian Hahn 22cb3b5f07SFlorian Hahnif.then: ; preds = %entry 23c5e1ddb6SFlorian Hahn %start.0 = getelementptr inbounds [10 x i8], ptr %start, i64 5, i64 0 24c5e1ddb6SFlorian Hahn %c.0 = icmp ult ptr %start.0, %high 25cb3b5f07SFlorian Hahn call void @use(i1 %c.0) 26cb3b5f07SFlorian Hahn ret void 27cb3b5f07SFlorian Hahn 28cb3b5f07SFlorian Hahnif.end: ; preds = %entry 29cb3b5f07SFlorian Hahn ret void 30cb3b5f07SFlorian Hahn} 31cb3b5f07SFlorian Hahn 32c5e1ddb6SFlorian Hahndefine void @pointer.to.array.test.ult.unknown.due.to.first.dimension(ptr %start, ptr %high) { 33cb3b5f07SFlorian Hahn; CHECK-LABEL: @pointer.to.array.test.ult.unknown.due.to.first.dimension( 34cb3b5f07SFlorian Hahn; CHECK-NEXT: entry: 35c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[ADD_PTR_I:%.*]] = getelementptr inbounds [10 x i8], ptr [[START:%.*]], i64 5, i64 3 36c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_I]], [[HIGH:%.*]] 37cb3b5f07SFlorian Hahn; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 38cb3b5f07SFlorian Hahn; CHECK: if.then: 39c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 10, i64 0 40c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp ult ptr [[START_0]], [[HIGH]] 41cb3b5f07SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_0]]) 42cb3b5f07SFlorian Hahn; CHECK-NEXT: ret void 43cb3b5f07SFlorian Hahn; CHECK: if.end: 44cb3b5f07SFlorian Hahn; CHECK-NEXT: ret void 45cb3b5f07SFlorian Hahn; 46cb3b5f07SFlorian Hahnentry: 47c5e1ddb6SFlorian Hahn %add.ptr.i = getelementptr inbounds [10 x i8], ptr %start, i64 5, i64 3 48c5e1ddb6SFlorian Hahn %c.1 = icmp ule ptr %add.ptr.i, %high 49cb3b5f07SFlorian Hahn br i1 %c.1, label %if.then, label %if.end 50cb3b5f07SFlorian Hahn 51cb3b5f07SFlorian Hahnif.then: ; preds = %entry 52c5e1ddb6SFlorian Hahn %start.0 = getelementptr inbounds [10 x i8], ptr %start, i64 10, i64 0 53c5e1ddb6SFlorian Hahn %c.0 = icmp ult ptr %start.0, %high 54cb3b5f07SFlorian Hahn call void @use(i1 %c.0) 55cb3b5f07SFlorian Hahn ret void 56cb3b5f07SFlorian Hahn 57cb3b5f07SFlorian Hahnif.end: ; preds = %entry 58cb3b5f07SFlorian Hahn ret void 59cb3b5f07SFlorian Hahn} 60cb3b5f07SFlorian Hahn 61c5e1ddb6SFlorian Hahndefine void @pointer.to.array.test.ult.true.due.to.second.dimension(ptr %start, ptr %high) { 62cb3b5f07SFlorian Hahn; CHECK-LABEL: @pointer.to.array.test.ult.true.due.to.second.dimension( 63cb3b5f07SFlorian Hahn; CHECK-NEXT: entry: 64c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[ADD_PTR_I:%.*]] = getelementptr inbounds [10 x i8], ptr [[START:%.*]], i64 5, i64 1 65c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_I]], [[HIGH:%.*]] 66cb3b5f07SFlorian Hahn; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 67cb3b5f07SFlorian Hahn; CHECK: if.then: 68c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 5, i64 0 69*572d5d37SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 70cb3b5f07SFlorian Hahn; CHECK-NEXT: ret void 71cb3b5f07SFlorian Hahn; CHECK: if.end: 72cb3b5f07SFlorian Hahn; CHECK-NEXT: ret void 73cb3b5f07SFlorian Hahn; 74cb3b5f07SFlorian Hahnentry: 75c5e1ddb6SFlorian Hahn %add.ptr.i = getelementptr inbounds [10 x i8], ptr %start, i64 5, i64 1 76c5e1ddb6SFlorian Hahn %c.1 = icmp ule ptr %add.ptr.i, %high 77cb3b5f07SFlorian Hahn br i1 %c.1, label %if.then, label %if.end 78cb3b5f07SFlorian Hahn 79cb3b5f07SFlorian Hahnif.then: ; preds = %entry 80c5e1ddb6SFlorian Hahn %start.0 = getelementptr inbounds [10 x i8], ptr %start, i64 5, i64 0 81c5e1ddb6SFlorian Hahn %c.0 = icmp ult ptr %start.0, %high 82cb3b5f07SFlorian Hahn call void @use(i1 %c.0) 83cb3b5f07SFlorian Hahn ret void 84cb3b5f07SFlorian Hahn 85cb3b5f07SFlorian Hahnif.end: ; preds = %entry 86cb3b5f07SFlorian Hahn ret void 87cb3b5f07SFlorian Hahn} 88cb3b5f07SFlorian Hahn 89c5e1ddb6SFlorian Hahndefine void @pointer.to.array.test.ult.unknown.to.second.dimension(ptr %start, ptr %high) { 90cb3b5f07SFlorian Hahn; CHECK-LABEL: @pointer.to.array.test.ult.unknown.to.second.dimension( 91cb3b5f07SFlorian Hahn; CHECK-NEXT: entry: 92c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[ADD_PTR_I:%.*]] = getelementptr inbounds [10 x i8], ptr [[START:%.*]], i64 5, i64 0 93c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_I]], [[HIGH:%.*]] 94cb3b5f07SFlorian Hahn; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 95cb3b5f07SFlorian Hahn; CHECK: if.then: 96c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 5, i64 1 97c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp ult ptr [[START_0]], [[HIGH]] 98cb3b5f07SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_0]]) 99cb3b5f07SFlorian Hahn; CHECK-NEXT: ret void 100cb3b5f07SFlorian Hahn; CHECK: if.end: 101cb3b5f07SFlorian Hahn; CHECK-NEXT: ret void 102cb3b5f07SFlorian Hahn; 103cb3b5f07SFlorian Hahnentry: 104c5e1ddb6SFlorian Hahn %add.ptr.i = getelementptr inbounds [10 x i8], ptr %start, i64 5, i64 0 105c5e1ddb6SFlorian Hahn %c.1 = icmp ule ptr %add.ptr.i, %high 106cb3b5f07SFlorian Hahn br i1 %c.1, label %if.then, label %if.end 107cb3b5f07SFlorian Hahn 108cb3b5f07SFlorian Hahnif.then: ; preds = %entry 109c5e1ddb6SFlorian Hahn %start.0 = getelementptr inbounds [10 x i8], ptr %start, i64 5, i64 1 110c5e1ddb6SFlorian Hahn %c.0 = icmp ult ptr %start.0, %high 111cb3b5f07SFlorian Hahn call void @use(i1 %c.0) 112cb3b5f07SFlorian Hahn ret void 113cb3b5f07SFlorian Hahn 114cb3b5f07SFlorian Hahnif.end: ; preds = %entry 115cb3b5f07SFlorian Hahn ret void 116cb3b5f07SFlorian Hahn} 117cb3b5f07SFlorian Hahn 118c5e1ddb6SFlorian Hahndefine void @pointer.to.array.test.not.uge.ult(ptr %start, ptr %high) { 119cb3b5f07SFlorian Hahn; CHECK-LABEL: @pointer.to.array.test.not.uge.ult( 120cb3b5f07SFlorian Hahn; CHECK-NEXT: entry: 121c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[ADD_PTR_I:%.*]] = getelementptr inbounds [10 x i8], ptr [[START:%.*]], i64 1, i64 3 122c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp uge ptr [[ADD_PTR_I]], [[HIGH:%.*]] 123cb3b5f07SFlorian Hahn; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 124cb3b5f07SFlorian Hahn; CHECK: if.then: 125cb3b5f07SFlorian Hahn; CHECK-NEXT: ret void 126cb3b5f07SFlorian Hahn; CHECK: if.end: 127c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 10, i64 0 128c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp ult ptr [[START_0]], [[HIGH]] 129cb3b5f07SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_0]]) 130cb3b5f07SFlorian Hahn; CHECK-NEXT: ret void 131cb3b5f07SFlorian Hahn; 132cb3b5f07SFlorian Hahnentry: 133c5e1ddb6SFlorian Hahn %add.ptr.i = getelementptr inbounds [10 x i8], ptr %start, i64 1, i64 3 134c5e1ddb6SFlorian Hahn %c.1 = icmp uge ptr %add.ptr.i, %high 135cb3b5f07SFlorian Hahn br i1 %c.1, label %if.then, label %if.end 136cb3b5f07SFlorian Hahn 137cb3b5f07SFlorian Hahnif.then: ; preds = %entry 138cb3b5f07SFlorian Hahn ret void 139cb3b5f07SFlorian Hahn 140cb3b5f07SFlorian Hahnif.end: ; preds = %entry 141c5e1ddb6SFlorian Hahn %start.0 = getelementptr inbounds [10 x i8], ptr %start, i64 10, i64 0 142c5e1ddb6SFlorian Hahn %c.0 = icmp ult ptr %start.0, %high 143cb3b5f07SFlorian Hahn call void @use(i1 %c.0) 144cb3b5f07SFlorian Hahn ret void 145cb3b5f07SFlorian Hahn} 146cb3b5f07SFlorian Hahn 147c5e1ddb6SFlorian Hahndefine void @pointer.to.array.test.not.uge.ule(ptr %start, ptr %high) { 148cb3b5f07SFlorian Hahn; CHECK-LABEL: @pointer.to.array.test.not.uge.ule( 149cb3b5f07SFlorian Hahn; CHECK-NEXT: entry: 150c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[ADD_PTR_I:%.*]] = getelementptr inbounds [10 x i8], ptr [[START:%.*]], i64 1, i64 3 151c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp uge ptr [[ADD_PTR_I]], [[HIGH:%.*]] 152cb3b5f07SFlorian Hahn; CHECK-NEXT: br i1 [[C]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 153cb3b5f07SFlorian Hahn; CHECK: if.then: 154cb3b5f07SFlorian Hahn; CHECK-NEXT: ret void 155cb3b5f07SFlorian Hahn; CHECK: if.end: 156c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 10, i64 0 157c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp ule ptr [[START_0]], [[HIGH]] 158cb3b5f07SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_0]]) 159c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[START_1:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 2, i64 1 160c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule ptr [[START_1]], [[HIGH]] 161cb3b5f07SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_1]]) 162cb3b5f07SFlorian Hahn; CHECK-NEXT: ret void 163cb3b5f07SFlorian Hahn; 164cb3b5f07SFlorian Hahnentry: 165c5e1ddb6SFlorian Hahn %add.ptr.i = getelementptr inbounds [10 x i8], ptr %start, i64 1, i64 3 166c5e1ddb6SFlorian Hahn %c = icmp uge ptr %add.ptr.i, %high 167cb3b5f07SFlorian Hahn br i1 %c, label %if.then, label %if.end 168cb3b5f07SFlorian Hahn 169cb3b5f07SFlorian Hahnif.then: ; preds = %entry 170cb3b5f07SFlorian Hahn ret void 171cb3b5f07SFlorian Hahn 172cb3b5f07SFlorian Hahnif.end: ; preds = %entry 173c5e1ddb6SFlorian Hahn %start.0 = getelementptr inbounds [10 x i8], ptr %start, i64 10, i64 0 174c5e1ddb6SFlorian Hahn %c.0 = icmp ule ptr %start.0, %high 175cb3b5f07SFlorian Hahn call void @use(i1 %c.0) 176c5e1ddb6SFlorian Hahn %start.1 = getelementptr inbounds [10 x i8], ptr %start, i64 2, i64 1 177c5e1ddb6SFlorian Hahn %c.1 = icmp ule ptr %start.1, %high 178cb3b5f07SFlorian Hahn call void @use(i1 %c.1) 179cb3b5f07SFlorian Hahn ret void 180cb3b5f07SFlorian Hahn} 181cb3b5f07SFlorian Hahn 182c5e1ddb6SFlorian Hahndefine void @pointer.to.array.test.not.uge.ugt(ptr %start, ptr %high) { 183cb3b5f07SFlorian Hahn; CHECK-LABEL: @pointer.to.array.test.not.uge.ugt( 184cb3b5f07SFlorian Hahn; CHECK-NEXT: entry: 185c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[ADD_PTR_I:%.*]] = getelementptr inbounds [10 x i8], ptr [[START:%.*]], i64 1, i64 3 186c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp uge ptr [[ADD_PTR_I]], [[HIGH:%.*]] 187cb3b5f07SFlorian Hahn; CHECK-NEXT: br i1 [[C]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 188cb3b5f07SFlorian Hahn; CHECK: if.then: 189cb3b5f07SFlorian Hahn; CHECK-NEXT: ret void 190cb3b5f07SFlorian Hahn; CHECK: if.end: 191c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 3, i64 0 192c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp ugt ptr [[START_0]], [[HIGH]] 193cb3b5f07SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_0]]) 194c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[START_1:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 3, i64 1 195c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ugt ptr [[START_1]], [[HIGH]] 196cb3b5f07SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_1]]) 197cb3b5f07SFlorian Hahn; CHECK-NEXT: ret void 198cb3b5f07SFlorian Hahn; 199cb3b5f07SFlorian Hahnentry: 200c5e1ddb6SFlorian Hahn %add.ptr.i = getelementptr inbounds [10 x i8], ptr %start, i64 1, i64 3 201c5e1ddb6SFlorian Hahn %c = icmp uge ptr %add.ptr.i, %high 202cb3b5f07SFlorian Hahn br i1 %c, label %if.then, label %if.end 203cb3b5f07SFlorian Hahn 204cb3b5f07SFlorian Hahnif.then: ; preds = %entry 205cb3b5f07SFlorian Hahn ret void 206cb3b5f07SFlorian Hahn 207cb3b5f07SFlorian Hahnif.end: ; preds = %entry 208c5e1ddb6SFlorian Hahn %start.0 = getelementptr inbounds [10 x i8], ptr %start, i64 3, i64 0 209c5e1ddb6SFlorian Hahn %c.0 = icmp ugt ptr %start.0, %high 210cb3b5f07SFlorian Hahn call void @use(i1 %c.0) 211c5e1ddb6SFlorian Hahn %start.1 = getelementptr inbounds [10 x i8], ptr %start, i64 3, i64 1 212c5e1ddb6SFlorian Hahn %c.1 = icmp ugt ptr %start.1, %high 213cb3b5f07SFlorian Hahn call void @use(i1 %c.1) 214cb3b5f07SFlorian Hahn ret void 215cb3b5f07SFlorian Hahn} 216cb3b5f07SFlorian Hahn 217c5e1ddb6SFlorian Hahndefine void @pointer.to.array.test.not.uge.uge(ptr %start, ptr %high) { 218cb3b5f07SFlorian Hahn; CHECK-LABEL: @pointer.to.array.test.not.uge.uge( 219cb3b5f07SFlorian Hahn; CHECK-NEXT: entry: 220c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[ADD_PTR_I:%.*]] = getelementptr inbounds [10 x i8], ptr [[START:%.*]], i64 1, i64 3 221c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp uge ptr [[ADD_PTR_I]], [[HIGH:%.*]] 222cb3b5f07SFlorian Hahn; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 223cb3b5f07SFlorian Hahn; CHECK: if.then: 224cb3b5f07SFlorian Hahn; CHECK-NEXT: ret void 225cb3b5f07SFlorian Hahn; CHECK: if.end: 226c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 3, i64 0 227c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp uge ptr [[START_0]], [[HIGH]] 228cb3b5f07SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_0]]) 229cb3b5f07SFlorian Hahn; CHECK-NEXT: ret void 230cb3b5f07SFlorian Hahn; 231cb3b5f07SFlorian Hahnentry: 232c5e1ddb6SFlorian Hahn %add.ptr.i = getelementptr inbounds [10 x i8], ptr %start, i64 1, i64 3 233c5e1ddb6SFlorian Hahn %c.1 = icmp uge ptr %add.ptr.i, %high 234cb3b5f07SFlorian Hahn br i1 %c.1, label %if.then, label %if.end 235cb3b5f07SFlorian Hahn 236cb3b5f07SFlorian Hahnif.then: ; preds = %entry 237cb3b5f07SFlorian Hahn ret void 238cb3b5f07SFlorian Hahn 239cb3b5f07SFlorian Hahnif.end: ; preds = %entry 240c5e1ddb6SFlorian Hahn %start.0 = getelementptr inbounds [10 x i8], ptr %start, i64 3, i64 0 241c5e1ddb6SFlorian Hahn %c.0 = icmp uge ptr %start.0, %high 242cb3b5f07SFlorian Hahn call void @use(i1 %c.0) 243cb3b5f07SFlorian Hahn ret void 244cb3b5f07SFlorian Hahn} 245cb3b5f07SFlorian Hahn 246cb3b5f07SFlorian Hahndeclare void @use(i1) 247