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 4cb3b5f07SFlorian Hahn%struct.1 = type { i32, i64, i8 } 5c5e1ddb6SFlorian Hahn%struct.2 = type { i32, [20 x i64], i8 } 6cb3b5f07SFlorian Hahn 7c5e1ddb6SFlorian Hahndefine i1 @test.ult.true.due.to.first.dimension(ptr %start, ptr %high) { 8cb3b5f07SFlorian Hahn; CHECK-LABEL: @test.ult.true.due.to.first.dimension( 9cb3b5f07SFlorian Hahn; CHECK-NEXT: entry: 10c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds [[STRUCT_1:%.*]], ptr [[START:%.*]], i64 6, i32 0 11c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[ADD_PTR_CAST:%.*]] = bitcast ptr [[ADD_PTR]] to ptr 12c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_CAST]], [[HIGH:%.*]] 13cb3b5f07SFlorian Hahn; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 14cb3b5f07SFlorian Hahn; CHECK: if.then: 15c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [[STRUCT_1]], ptr [[START]], i64 5, i32 0 16c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[START_0_CAST:%.*]] = bitcast ptr [[START_0]] to ptr 17572d5d37SFlorian Hahn; CHECK-NEXT: ret i1 true 18cb3b5f07SFlorian Hahn; CHECK: if.end: 19cb3b5f07SFlorian Hahn; CHECK-NEXT: ret i1 true 20cb3b5f07SFlorian Hahn; 21cb3b5f07SFlorian Hahnentry: 22c5e1ddb6SFlorian Hahn %add.ptr = getelementptr inbounds %struct.1, ptr %start, i64 6, i32 0 23c5e1ddb6SFlorian Hahn %add.ptr.cast = bitcast ptr %add.ptr to ptr 24c5e1ddb6SFlorian Hahn %c.1 = icmp ule ptr %add.ptr.cast, %high 25cb3b5f07SFlorian Hahn br i1 %c.1, label %if.then, label %if.end 26cb3b5f07SFlorian Hahn 27c5e1ddb6SFlorian Hahnif.then: 28c5e1ddb6SFlorian Hahn %start.0 = getelementptr inbounds %struct.1, ptr %start, i64 5, i32 0 29c5e1ddb6SFlorian Hahn %start.0.cast = bitcast ptr %start.0 to ptr 30c5e1ddb6SFlorian Hahn %c.0 = icmp ult ptr %start.0.cast, %high 31cb3b5f07SFlorian Hahn ret i1 %c.0 32cb3b5f07SFlorian Hahn 33c5e1ddb6SFlorian Hahnif.end: 34c5e1ddb6SFlorian Hahn ret i1 true 35cb3b5f07SFlorian Hahn} 36cb3b5f07SFlorian Hahn 37c5e1ddb6SFlorian Hahndefine i1 @test.ult.true.due.to.first.dimension.var.index.0(ptr %start, ptr %high, i32 %idx) { 38cb3b5f07SFlorian Hahn; CHECK-LABEL: @test.ult.true.due.to.first.dimension.var.index.0( 39cb3b5f07SFlorian Hahn; CHECK-NEXT: entry: 40cb3b5f07SFlorian Hahn; CHECK-NEXT: [[IDX_EXT_PLUS_1:%.*]] = add nuw nsw i32 [[IDX:%.*]], 1 41cb3b5f07SFlorian Hahn; CHECK-NEXT: [[IDX_EXT_PLUS_1_EXT:%.*]] = zext i32 [[IDX_EXT_PLUS_1]] to i64 42c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds [[STRUCT_1:%.*]], ptr [[START:%.*]], i64 [[IDX_EXT_PLUS_1_EXT]], i32 0 43c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[ADD_PTR_CAST:%.*]] = bitcast ptr [[ADD_PTR]] to ptr 44c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_CAST]], [[HIGH:%.*]] 45cb3b5f07SFlorian Hahn; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 46cb3b5f07SFlorian Hahn; CHECK: if.then: 47cb3b5f07SFlorian Hahn; CHECK-NEXT: [[IDX_EXT:%.*]] = zext i32 [[IDX]] to i64 48c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [[STRUCT_1]], ptr [[START]], i64 [[IDX_EXT]], i32 0 49c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[START_0_CAST:%.*]] = bitcast ptr [[START_0]] to ptr 50572d5d37SFlorian Hahn; CHECK-NEXT: ret i1 true 51cb3b5f07SFlorian Hahn; CHECK: if.end: 52cb3b5f07SFlorian Hahn; CHECK-NEXT: ret i1 true 53cb3b5f07SFlorian Hahn; 54cb3b5f07SFlorian Hahnentry: 55cb3b5f07SFlorian Hahn %idx.ext.plus.1 = add nuw nsw i32 %idx, 1 56cb3b5f07SFlorian Hahn %idx.ext.plus.1.ext = zext i32 %idx.ext.plus.1 to i64 57c5e1ddb6SFlorian Hahn %add.ptr = getelementptr inbounds %struct.1, ptr %start, i64 %idx.ext.plus.1.ext, i32 0 58c5e1ddb6SFlorian Hahn %add.ptr.cast = bitcast ptr %add.ptr to ptr 59c5e1ddb6SFlorian Hahn %c.1 = icmp ule ptr %add.ptr.cast, %high 60cb3b5f07SFlorian Hahn br i1 %c.1, label %if.then, label %if.end 61cb3b5f07SFlorian Hahn 62c5e1ddb6SFlorian Hahnif.then: 63cb3b5f07SFlorian Hahn %idx.ext = zext i32 %idx to i64 64c5e1ddb6SFlorian Hahn %start.0 = getelementptr inbounds %struct.1, ptr %start, i64 %idx.ext, i32 0 65c5e1ddb6SFlorian Hahn %start.0.cast = bitcast ptr %start.0 to ptr 66c5e1ddb6SFlorian Hahn %c.0 = icmp ult ptr %start.0.cast, %high 67cb3b5f07SFlorian Hahn ret i1 %c.0 68cb3b5f07SFlorian Hahn 69c5e1ddb6SFlorian Hahnif.end: 70c5e1ddb6SFlorian Hahn ret i1 true 71cb3b5f07SFlorian Hahn} 72cb3b5f07SFlorian Hahn 73c5e1ddb6SFlorian Hahndefine i1 @test.ult.true.due.to.first.dimension.var.index.1(ptr %start, ptr %high, i32 %idx) { 74cb3b5f07SFlorian Hahn; CHECK-LABEL: @test.ult.true.due.to.first.dimension.var.index.1( 75cb3b5f07SFlorian Hahn; CHECK-NEXT: entry: 76cb3b5f07SFlorian Hahn; CHECK-NEXT: [[IDX_EXT_PLUS_1:%.*]] = add nuw nsw i32 [[IDX:%.*]], 1 77cb3b5f07SFlorian Hahn; CHECK-NEXT: [[IDX_EXT_PLUS_1_EXT:%.*]] = zext i32 [[IDX_EXT_PLUS_1]] to i64 78c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds [[STRUCT_1:%.*]], ptr [[START:%.*]], i64 [[IDX_EXT_PLUS_1_EXT]], i32 0 79c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[ADD_PTR_CAST:%.*]] = bitcast ptr [[ADD_PTR]] to ptr 80c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_CAST]], [[HIGH:%.*]] 81cb3b5f07SFlorian Hahn; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 82cb3b5f07SFlorian Hahn; CHECK: if.then: 83cb3b5f07SFlorian Hahn; CHECK-NEXT: [[IDX_EXT:%.*]] = zext i32 [[IDX]] to i64 84c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [[STRUCT_1]], ptr [[START]], i64 [[IDX_EXT]], i32 1 85c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[START_0_CAST:%.*]] = bitcast ptr [[START_0]] to ptr 86572d5d37SFlorian Hahn; CHECK-NEXT: ret i1 true 87cb3b5f07SFlorian Hahn; CHECK: if.end: 88cb3b5f07SFlorian Hahn; CHECK-NEXT: ret i1 true 89cb3b5f07SFlorian Hahn; 90cb3b5f07SFlorian Hahnentry: 91cb3b5f07SFlorian Hahn %idx.ext.plus.1 = add nuw nsw i32 %idx, 1 92cb3b5f07SFlorian Hahn %idx.ext.plus.1.ext = zext i32 %idx.ext.plus.1 to i64 93c5e1ddb6SFlorian Hahn %add.ptr = getelementptr inbounds %struct.1, ptr %start, i64 %idx.ext.plus.1.ext, i32 0 94c5e1ddb6SFlorian Hahn %add.ptr.cast = bitcast ptr %add.ptr to ptr 95c5e1ddb6SFlorian Hahn %c.1 = icmp ule ptr %add.ptr.cast, %high 96cb3b5f07SFlorian Hahn br i1 %c.1, label %if.then, label %if.end 97cb3b5f07SFlorian Hahn 98c5e1ddb6SFlorian Hahnif.then: 99cb3b5f07SFlorian Hahn %idx.ext = zext i32 %idx to i64 100c5e1ddb6SFlorian Hahn %start.0 = getelementptr inbounds %struct.1, ptr %start, i64 %idx.ext, i32 1 101c5e1ddb6SFlorian Hahn %start.0.cast = bitcast ptr %start.0 to ptr 102c5e1ddb6SFlorian Hahn %c.0 = icmp ult ptr %start.0.cast, %high 103cb3b5f07SFlorian Hahn ret i1 %c.0 104cb3b5f07SFlorian Hahn 105c5e1ddb6SFlorian Hahnif.end: 106c5e1ddb6SFlorian Hahn ret i1 true 107cb3b5f07SFlorian Hahn} 108cb3b5f07SFlorian Hahn 109c5e1ddb6SFlorian Hahndefine i1 @test.ult.true.due.to.first.dimension.var.index.2(ptr %start, ptr %high, i32 %idx) { 110cb3b5f07SFlorian Hahn; CHECK-LABEL: @test.ult.true.due.to.first.dimension.var.index.2( 111cb3b5f07SFlorian Hahn; CHECK-NEXT: entry: 112cb3b5f07SFlorian Hahn; CHECK-NEXT: [[IDX_EXT_PLUS_1:%.*]] = add nuw nsw i32 [[IDX:%.*]], 1 113cb3b5f07SFlorian Hahn; CHECK-NEXT: [[IDX_EXT_PLUS_1_EXT:%.*]] = zext i32 [[IDX_EXT_PLUS_1]] to i64 114c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds [[STRUCT_1:%.*]], ptr [[START:%.*]], i64 [[IDX_EXT_PLUS_1_EXT]], i32 0 115c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[ADD_PTR_CAST:%.*]] = bitcast ptr [[ADD_PTR]] to ptr 116c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_CAST]], [[HIGH:%.*]] 117cb3b5f07SFlorian Hahn; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 118cb3b5f07SFlorian Hahn; CHECK: if.then: 119cb3b5f07SFlorian Hahn; CHECK-NEXT: [[IDX_EXT:%.*]] = zext i32 [[IDX]] to i64 120c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [[STRUCT_1]], ptr [[START]], i64 [[IDX_EXT]], i32 2 121572d5d37SFlorian Hahn; CHECK-NEXT: ret i1 true 122cb3b5f07SFlorian Hahn; CHECK: if.end: 123cb3b5f07SFlorian Hahn; CHECK-NEXT: ret i1 true 124cb3b5f07SFlorian Hahn; 125cb3b5f07SFlorian Hahnentry: 126cb3b5f07SFlorian Hahn %idx.ext.plus.1 = add nuw nsw i32 %idx, 1 127cb3b5f07SFlorian Hahn %idx.ext.plus.1.ext = zext i32 %idx.ext.plus.1 to i64 128c5e1ddb6SFlorian Hahn %add.ptr = getelementptr inbounds %struct.1, ptr %start, i64 %idx.ext.plus.1.ext, i32 0 129c5e1ddb6SFlorian Hahn %add.ptr.cast = bitcast ptr %add.ptr to ptr 130c5e1ddb6SFlorian Hahn %c.1 = icmp ule ptr %add.ptr.cast, %high 131cb3b5f07SFlorian Hahn br i1 %c.1, label %if.then, label %if.end 132cb3b5f07SFlorian Hahn 133c5e1ddb6SFlorian Hahnif.then: 134cb3b5f07SFlorian Hahn %idx.ext = zext i32 %idx to i64 135c5e1ddb6SFlorian Hahn %start.0 = getelementptr inbounds %struct.1, ptr %start, i64 %idx.ext, i32 2 136c5e1ddb6SFlorian Hahn %c.0 = icmp ult ptr %start.0, %high 137cb3b5f07SFlorian Hahn ret i1 %c.0 138cb3b5f07SFlorian Hahn 139c5e1ddb6SFlorian Hahnif.end: 140c5e1ddb6SFlorian Hahn ret i1 true 141cb3b5f07SFlorian Hahn} 142cb3b5f07SFlorian Hahn 143c5e1ddb6SFlorian Hahndefine i1 @test.ult.unknown.due.to.first.dimension(ptr %start, ptr %high) { 144cb3b5f07SFlorian Hahn; CHECK-LABEL: @test.ult.unknown.due.to.first.dimension( 145cb3b5f07SFlorian Hahn; CHECK-NEXT: entry: 146c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds [[STRUCT_1:%.*]], ptr [[START:%.*]], i64 5, i32 0 147c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[ADD_PTR_CAST:%.*]] = bitcast ptr [[ADD_PTR]] to ptr 148c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_CAST]], [[HIGH:%.*]] 149cb3b5f07SFlorian Hahn; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 150cb3b5f07SFlorian Hahn; CHECK: if.then: 151c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [[STRUCT_1]], ptr [[START]], i64 6, i32 0 152c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[START_0_CAST:%.*]] = bitcast ptr [[START_0]] to ptr 153c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp ult ptr [[START_0_CAST]], [[HIGH]] 154cb3b5f07SFlorian Hahn; CHECK-NEXT: ret i1 [[C_0]] 155cb3b5f07SFlorian Hahn; CHECK: if.end: 156cb3b5f07SFlorian Hahn; CHECK-NEXT: ret i1 true 157cb3b5f07SFlorian Hahn; 158cb3b5f07SFlorian Hahnentry: 159c5e1ddb6SFlorian Hahn %add.ptr = getelementptr inbounds %struct.1, ptr %start, i64 5, i32 0 160c5e1ddb6SFlorian Hahn %add.ptr.cast = bitcast ptr %add.ptr to ptr 161c5e1ddb6SFlorian Hahn %c.1 = icmp ule ptr %add.ptr.cast, %high 162cb3b5f07SFlorian Hahn br i1 %c.1, label %if.then, label %if.end 163cb3b5f07SFlorian Hahn 164c5e1ddb6SFlorian Hahnif.then: 165c5e1ddb6SFlorian Hahn %start.0 = getelementptr inbounds %struct.1, ptr %start, i64 6, i32 0 166c5e1ddb6SFlorian Hahn %start.0.cast = bitcast ptr %start.0 to ptr 167c5e1ddb6SFlorian Hahn %c.0 = icmp ult ptr %start.0.cast, %high 168cb3b5f07SFlorian Hahn ret i1 %c.0 169cb3b5f07SFlorian Hahn 170c5e1ddb6SFlorian Hahnif.end: 171c5e1ddb6SFlorian Hahn ret i1 true 172cb3b5f07SFlorian Hahn} 173cb3b5f07SFlorian Hahn 174c5e1ddb6SFlorian Hahndefine i1 @test.ult.true.due.to.second.dimension(ptr %start, ptr %high) { 175cb3b5f07SFlorian Hahn; CHECK-LABEL: @test.ult.true.due.to.second.dimension( 176cb3b5f07SFlorian Hahn; CHECK-NEXT: entry: 177c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds [[STRUCT_1:%.*]], ptr [[START:%.*]], i64 5, i32 2 178c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule ptr [[ADD_PTR]], [[HIGH:%.*]] 179cb3b5f07SFlorian Hahn; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 180cb3b5f07SFlorian Hahn; CHECK: if.then: 181c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [[STRUCT_1]], ptr [[START]], i64 5, i32 1 182c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[START_0_CAST:%.*]] = bitcast ptr [[START_0]] to ptr 183572d5d37SFlorian Hahn; CHECK-NEXT: ret i1 true 184cb3b5f07SFlorian Hahn; CHECK: if.end: 185cb3b5f07SFlorian Hahn; CHECK-NEXT: ret i1 true 186cb3b5f07SFlorian Hahn; 187cb3b5f07SFlorian Hahnentry: 188c5e1ddb6SFlorian Hahn %add.ptr = getelementptr inbounds %struct.1, ptr %start, i64 5, i32 2 189c5e1ddb6SFlorian Hahn %c.1 = icmp ule ptr %add.ptr, %high 190cb3b5f07SFlorian Hahn br i1 %c.1, label %if.then, label %if.end 191cb3b5f07SFlorian Hahn 192c5e1ddb6SFlorian Hahnif.then: 193c5e1ddb6SFlorian Hahn %start.0 = getelementptr inbounds %struct.1, ptr %start, i64 5, i32 1 194c5e1ddb6SFlorian Hahn %start.0.cast = bitcast ptr %start.0 to ptr 195c5e1ddb6SFlorian Hahn %c.0 = icmp ult ptr %start.0.cast, %high 196cb3b5f07SFlorian Hahn ret i1 %c.0 197cb3b5f07SFlorian Hahn 198c5e1ddb6SFlorian Hahnif.end: 199c5e1ddb6SFlorian Hahn ret i1 true 200cb3b5f07SFlorian Hahn} 201cb3b5f07SFlorian Hahn 202c5e1ddb6SFlorian Hahndefine i1 @test.ult.unknown.due.to.second.dimension(ptr %start, ptr %high) { 203cb3b5f07SFlorian Hahn; CHECK-LABEL: @test.ult.unknown.due.to.second.dimension( 204cb3b5f07SFlorian Hahn; CHECK-NEXT: entry: 205c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds [[STRUCT_1:%.*]], ptr [[START:%.*]], i64 5, i32 2 206c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule ptr [[ADD_PTR]], [[HIGH:%.*]] 207cb3b5f07SFlorian Hahn; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 208cb3b5f07SFlorian Hahn; CHECK: if.then: 209c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [[STRUCT_1]], ptr [[START]], i64 5, i32 2 210c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp ult ptr [[START_0]], [[HIGH]] 211cb3b5f07SFlorian Hahn; CHECK-NEXT: ret i1 [[C_0]] 212cb3b5f07SFlorian Hahn; CHECK: if.end: 213cb3b5f07SFlorian Hahn; CHECK-NEXT: ret i1 true 214cb3b5f07SFlorian Hahn; 215cb3b5f07SFlorian Hahnentry: 216c5e1ddb6SFlorian Hahn %add.ptr = getelementptr inbounds %struct.1, ptr %start, i64 5, i32 2 217c5e1ddb6SFlorian Hahn %c.1 = icmp ule ptr %add.ptr, %high 218cb3b5f07SFlorian Hahn br i1 %c.1, label %if.then, label %if.end 219cb3b5f07SFlorian Hahn 220c5e1ddb6SFlorian Hahnif.then: 221c5e1ddb6SFlorian Hahn %start.0 = getelementptr inbounds %struct.1, ptr %start, i64 5, i32 2 222c5e1ddb6SFlorian Hahn %c.0 = icmp ult ptr %start.0, %high 223cb3b5f07SFlorian Hahn ret i1 %c.0 224cb3b5f07SFlorian Hahn 225c5e1ddb6SFlorian Hahnif.end: 226c5e1ddb6SFlorian Hahn ret i1 true 227cb3b5f07SFlorian Hahn} 228cb3b5f07SFlorian Hahn 229c5e1ddb6SFlorian Hahndefine i1 @test.ult.unknown.due.to.second.dimension.var.index.0(ptr %start, ptr %high, i32 %idx) { 230cb3b5f07SFlorian Hahn; CHECK-LABEL: @test.ult.unknown.due.to.second.dimension.var.index.0( 231cb3b5f07SFlorian Hahn; CHECK-NEXT: entry: 232cb3b5f07SFlorian Hahn; CHECK-NEXT: [[IDX_EXT:%.*]] = zext i32 [[IDX:%.*]] to i64 233c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds [[STRUCT_1:%.*]], ptr [[START:%.*]], i64 [[IDX_EXT]], i32 0 234c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[ADD_PTR_CAST:%.*]] = bitcast ptr [[ADD_PTR]] to ptr 235c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_CAST]], [[HIGH:%.*]] 236cb3b5f07SFlorian Hahn; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 237cb3b5f07SFlorian Hahn; CHECK: if.then: 238c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [[STRUCT_1]], ptr [[START]], i64 [[IDX_EXT]], i32 1 239c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[START_0_CAST:%.*]] = bitcast ptr [[START_0]] to ptr 240c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp ult ptr [[START_0_CAST]], [[HIGH]] 241cb3b5f07SFlorian Hahn; CHECK-NEXT: ret i1 [[C_0]] 242cb3b5f07SFlorian Hahn; CHECK: if.end: 243cb3b5f07SFlorian Hahn; CHECK-NEXT: ret i1 true 244cb3b5f07SFlorian Hahn; 245cb3b5f07SFlorian Hahnentry: 246cb3b5f07SFlorian Hahn %idx.ext = zext i32 %idx to i64 247c5e1ddb6SFlorian Hahn %add.ptr = getelementptr inbounds %struct.1, ptr %start, i64 %idx.ext, i32 0 248c5e1ddb6SFlorian Hahn %add.ptr.cast = bitcast ptr %add.ptr to ptr 249c5e1ddb6SFlorian Hahn %c.1 = icmp ule ptr %add.ptr.cast, %high 250cb3b5f07SFlorian Hahn br i1 %c.1, label %if.then, label %if.end 251cb3b5f07SFlorian Hahn 252c5e1ddb6SFlorian Hahnif.then: 253c5e1ddb6SFlorian Hahn %start.0 = getelementptr inbounds %struct.1, ptr %start, i64 %idx.ext, i32 1 254c5e1ddb6SFlorian Hahn %start.0.cast = bitcast ptr %start.0 to ptr 255c5e1ddb6SFlorian Hahn %c.0 = icmp ult ptr %start.0.cast, %high 256cb3b5f07SFlorian Hahn ret i1 %c.0 257cb3b5f07SFlorian Hahn 258c5e1ddb6SFlorian Hahnif.end: 259c5e1ddb6SFlorian Hahn ret i1 true 260cb3b5f07SFlorian Hahn} 261cb3b5f07SFlorian Hahn 262c5e1ddb6SFlorian Hahndefine i1 @test.ult.unknown.due.to.second.dimension.var.index.1(ptr %start, ptr %high, i32 %idx) { 263cb3b5f07SFlorian Hahn; CHECK-LABEL: @test.ult.unknown.due.to.second.dimension.var.index.1( 264cb3b5f07SFlorian Hahn; CHECK-NEXT: entry: 265cb3b5f07SFlorian Hahn; CHECK-NEXT: [[IDX_EXT:%.*]] = zext i32 [[IDX:%.*]] to i64 266c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds [[STRUCT_1:%.*]], ptr [[START:%.*]], i64 [[IDX_EXT]], i32 1 267c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[ADD_PTR_CAST:%.*]] = bitcast ptr [[ADD_PTR]] to ptr 268c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_CAST]], [[HIGH:%.*]] 269cb3b5f07SFlorian Hahn; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 270cb3b5f07SFlorian Hahn; CHECK: if.then: 271c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [[STRUCT_1]], ptr [[START]], i64 [[IDX_EXT]], i32 2 272c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp ult ptr [[START_0]], [[HIGH]] 273cb3b5f07SFlorian Hahn; CHECK-NEXT: ret i1 [[C_0]] 274cb3b5f07SFlorian Hahn; CHECK: if.end: 275cb3b5f07SFlorian Hahn; CHECK-NEXT: ret i1 true 276cb3b5f07SFlorian Hahn; 277cb3b5f07SFlorian Hahnentry: 278cb3b5f07SFlorian Hahn %idx.ext = zext i32 %idx to i64 279c5e1ddb6SFlorian Hahn %add.ptr = getelementptr inbounds %struct.1, ptr %start, i64 %idx.ext, i32 1 280c5e1ddb6SFlorian Hahn %add.ptr.cast = bitcast ptr %add.ptr to ptr 281c5e1ddb6SFlorian Hahn %c.1 = icmp ule ptr %add.ptr.cast, %high 282cb3b5f07SFlorian Hahn br i1 %c.1, label %if.then, label %if.end 283cb3b5f07SFlorian Hahn 284c5e1ddb6SFlorian Hahnif.then: 285c5e1ddb6SFlorian Hahn %start.0 = getelementptr inbounds %struct.1, ptr %start, i64 %idx.ext, i32 2 286c5e1ddb6SFlorian Hahn %c.0 = icmp ult ptr %start.0, %high 287cb3b5f07SFlorian Hahn ret i1 %c.0 288cb3b5f07SFlorian Hahn 289c5e1ddb6SFlorian Hahnif.end: 290c5e1ddb6SFlorian Hahn ret i1 true 291cb3b5f07SFlorian Hahn} 292cb3b5f07SFlorian Hahn 293c5e1ddb6SFlorian Hahndefine i1 @ptr.int.struct.test.ult.true.due.to.first.dimension(ptr %start, ptr %high) { 294cb3b5f07SFlorian Hahn; CHECK-LABEL: @ptr.int.struct.test.ult.true.due.to.first.dimension( 295cb3b5f07SFlorian Hahn; CHECK-NEXT: entry: 296c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds [[STRUCT_2:%.*]], ptr [[START:%.*]], i64 6, i32 1, i32 5 297c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[ADD_PTR_CAST:%.*]] = bitcast ptr [[ADD_PTR]] to ptr 298c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_CAST]], [[HIGH:%.*]] 299cb3b5f07SFlorian Hahn; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 300cb3b5f07SFlorian Hahn; CHECK: if.then: 301c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [[STRUCT_2]], ptr [[START]], i64 6, i32 0 302c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[START_0_CAST:%.*]] = bitcast ptr [[START_0]] to ptr 303572d5d37SFlorian Hahn; CHECK-NEXT: ret i1 true 304cb3b5f07SFlorian Hahn; CHECK: if.end: 305cb3b5f07SFlorian Hahn; CHECK-NEXT: ret i1 true 306cb3b5f07SFlorian Hahn; 307cb3b5f07SFlorian Hahnentry: 308c5e1ddb6SFlorian Hahn %add.ptr = getelementptr inbounds %struct.2, ptr %start, i64 6, i32 1, i32 5 309c5e1ddb6SFlorian Hahn %add.ptr.cast = bitcast ptr %add.ptr to ptr 310c5e1ddb6SFlorian Hahn %c.1 = icmp ule ptr %add.ptr.cast, %high 311cb3b5f07SFlorian Hahn br i1 %c.1, label %if.then, label %if.end 312cb3b5f07SFlorian Hahn 313c5e1ddb6SFlorian Hahnif.then: 314c5e1ddb6SFlorian Hahn %start.0 = getelementptr inbounds %struct.2, ptr %start, i64 6, i32 0 315c5e1ddb6SFlorian Hahn %start.0.cast = bitcast ptr %start.0 to ptr 316c5e1ddb6SFlorian Hahn %c.0 = icmp ult ptr %start.0.cast, %high 317cb3b5f07SFlorian Hahn ret i1 %c.0 318cb3b5f07SFlorian Hahn 319c5e1ddb6SFlorian Hahnif.end: 320c5e1ddb6SFlorian Hahn ret i1 true 321cb3b5f07SFlorian Hahn} 322cb3b5f07SFlorian Hahn 323c5e1ddb6SFlorian Hahndefine i1 @ptr.int.struct.test.ult.true.due.to.third.dimension.var.index(ptr %start, ptr %high, i32 %idx) { 324cb3b5f07SFlorian Hahn; CHECK-LABEL: @ptr.int.struct.test.ult.true.due.to.third.dimension.var.index( 325cb3b5f07SFlorian Hahn; CHECK-NEXT: entry: 326cb3b5f07SFlorian Hahn; CHECK-NEXT: [[IDX_EXT_PLUS_1:%.*]] = add nuw nsw i32 [[IDX:%.*]], 1 327cb3b5f07SFlorian Hahn; CHECK-NEXT: [[IDX_EXT_PLUS_1_EXT:%.*]] = zext i32 [[IDX_EXT_PLUS_1]] to i64 328c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds [[STRUCT_2:%.*]], ptr [[START:%.*]], i64 6, i32 1, i64 [[IDX_EXT_PLUS_1_EXT]] 329c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[ADD_PTR_CAST:%.*]] = bitcast ptr [[ADD_PTR]] to ptr 330c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_CAST]], [[HIGH:%.*]] 331cb3b5f07SFlorian Hahn; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 332cb3b5f07SFlorian Hahn; CHECK: if.then: 333cb3b5f07SFlorian Hahn; CHECK-NEXT: [[IDX_EXT:%.*]] = zext i32 [[IDX]] to i64 334c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [[STRUCT_2]], ptr [[START]], i64 6, i32 1, i64 [[IDX_EXT]] 335c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[START_0_CAST:%.*]] = bitcast ptr [[START_0]] to ptr 336572d5d37SFlorian Hahn; CHECK-NEXT: ret i1 true 337cb3b5f07SFlorian Hahn; CHECK: if.end: 338cb3b5f07SFlorian Hahn; CHECK-NEXT: ret i1 true 339cb3b5f07SFlorian Hahn; 340cb3b5f07SFlorian Hahnentry: 341cb3b5f07SFlorian Hahn %idx.ext.plus.1 = add nuw nsw i32 %idx, 1 342cb3b5f07SFlorian Hahn %idx.ext.plus.1.ext = zext i32 %idx.ext.plus.1 to i64 343c5e1ddb6SFlorian Hahn %add.ptr = getelementptr inbounds %struct.2, ptr %start, i64 6, i32 1, i64 %idx.ext.plus.1.ext 344c5e1ddb6SFlorian Hahn %add.ptr.cast = bitcast ptr %add.ptr to ptr 345c5e1ddb6SFlorian Hahn %c.1 = icmp ule ptr %add.ptr.cast, %high 346cb3b5f07SFlorian Hahn br i1 %c.1, label %if.then, label %if.end 347cb3b5f07SFlorian Hahn 348c5e1ddb6SFlorian Hahnif.then: 349cb3b5f07SFlorian Hahn %idx.ext = zext i32 %idx to i64 350c5e1ddb6SFlorian Hahn %start.0 = getelementptr inbounds %struct.2, ptr %start, i64 6, i32 1, i64 %idx.ext 351c5e1ddb6SFlorian Hahn %start.0.cast = bitcast ptr %start.0 to ptr 352c5e1ddb6SFlorian Hahn %c.0 = icmp ult ptr %start.0.cast, %high 353cb3b5f07SFlorian Hahn ret i1 %c.0 354cb3b5f07SFlorian Hahn 355c5e1ddb6SFlorian Hahnif.end: 356c5e1ddb6SFlorian Hahn ret i1 true 357cb3b5f07SFlorian Hahn} 358cb3b5f07SFlorian Hahn 359c5e1ddb6SFlorian Hahndefine i1 @ptr.int.struct.test.ult.due.to.second.dimension.var.index(ptr %start, ptr %high, i32 %idx) { 360cb3b5f07SFlorian Hahn; CHECK-LABEL: @ptr.int.struct.test.ult.due.to.second.dimension.var.index( 361cb3b5f07SFlorian Hahn; CHECK-NEXT: entry: 362cb3b5f07SFlorian Hahn; CHECK-NEXT: [[IDX_EXT_PLUS_1:%.*]] = add nuw nsw i32 [[IDX:%.*]], 1 363cb3b5f07SFlorian Hahn; CHECK-NEXT: [[IDX_EXT_PLUS_1_EXT:%.*]] = zext i32 [[IDX_EXT_PLUS_1]] to i64 364c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds [[STRUCT_2:%.*]], ptr [[START:%.*]], i64 6, i32 1, i64 [[IDX_EXT_PLUS_1_EXT]] 365c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[ADD_PTR_CAST:%.*]] = bitcast ptr [[ADD_PTR]] to ptr 366c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_CAST]], [[HIGH:%.*]] 367cb3b5f07SFlorian Hahn; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 368cb3b5f07SFlorian Hahn; CHECK: if.then: 369cb3b5f07SFlorian Hahn; CHECK-NEXT: [[IDX_EXT:%.*]] = zext i32 [[IDX]] to i64 370c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [[STRUCT_2]], ptr [[START]], i64 6, i32 0 371c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[START_0_CAST:%.*]] = bitcast ptr [[START_0]] to ptr 372*fbcf8a8cSFlorian Hahn; CHECK-NEXT: ret i1 true 373cb3b5f07SFlorian Hahn; CHECK: if.end: 374cb3b5f07SFlorian Hahn; CHECK-NEXT: ret i1 true 375cb3b5f07SFlorian Hahn; 376cb3b5f07SFlorian Hahnentry: 377cb3b5f07SFlorian Hahn %idx.ext.plus.1 = add nuw nsw i32 %idx, 1 378cb3b5f07SFlorian Hahn %idx.ext.plus.1.ext = zext i32 %idx.ext.plus.1 to i64 379c5e1ddb6SFlorian Hahn %add.ptr = getelementptr inbounds %struct.2, ptr %start, i64 6, i32 1, i64 %idx.ext.plus.1.ext 380c5e1ddb6SFlorian Hahn %add.ptr.cast = bitcast ptr %add.ptr to ptr 381c5e1ddb6SFlorian Hahn %c.1 = icmp ule ptr %add.ptr.cast, %high 382cb3b5f07SFlorian Hahn br i1 %c.1, label %if.then, label %if.end 383cb3b5f07SFlorian Hahn 384c5e1ddb6SFlorian Hahnif.then: 385cb3b5f07SFlorian Hahn %idx.ext = zext i32 %idx to i64 386c5e1ddb6SFlorian Hahn %start.0 = getelementptr inbounds %struct.2, ptr %start, i64 6, i32 0 387c5e1ddb6SFlorian Hahn %start.0.cast = bitcast ptr %start.0 to ptr 388c5e1ddb6SFlorian Hahn %c.0 = icmp ult ptr %start.0.cast, %high 389cb3b5f07SFlorian Hahn ret i1 %c.0 390cb3b5f07SFlorian Hahn 391c5e1ddb6SFlorian Hahnif.end: 392c5e1ddb6SFlorian Hahn ret i1 true 393cb3b5f07SFlorian Hahn} 394cb3b5f07SFlorian Hahn 395c5e1ddb6SFlorian Hahndefine i1 @ptr.int.struct.test.ult.unknown.due.to.second.dimension.var.index(ptr %start, ptr %high, i32 %idx) { 396cb3b5f07SFlorian Hahn; CHECK-LABEL: @ptr.int.struct.test.ult.unknown.due.to.second.dimension.var.index( 397cb3b5f07SFlorian Hahn; CHECK-NEXT: entry: 398cb3b5f07SFlorian Hahn; CHECK-NEXT: [[IDX_EXT_PLUS_1:%.*]] = add nuw nsw i32 [[IDX:%.*]], 1 399cb3b5f07SFlorian Hahn; CHECK-NEXT: [[IDX_EXT_PLUS_1_EXT:%.*]] = zext i32 [[IDX_EXT_PLUS_1]] to i64 400c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds [[STRUCT_2:%.*]], ptr [[START:%.*]], i64 6, i32 1, i64 [[IDX_EXT_PLUS_1_EXT]] 401c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[ADD_PTR_CAST:%.*]] = bitcast ptr [[ADD_PTR]] to ptr 402c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_CAST]], [[HIGH:%.*]] 403cb3b5f07SFlorian Hahn; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 404cb3b5f07SFlorian Hahn; CHECK: if.then: 405cb3b5f07SFlorian Hahn; CHECK-NEXT: [[IDX_EXT:%.*]] = zext i32 [[IDX]] to i64 406c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [[STRUCT_2]], ptr [[START]], i64 6, i32 2 407c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp ult ptr [[START_0]], [[HIGH]] 408cb3b5f07SFlorian Hahn; CHECK-NEXT: ret i1 [[C_0]] 409cb3b5f07SFlorian Hahn; CHECK: if.end: 410cb3b5f07SFlorian Hahn; CHECK-NEXT: ret i1 true 411cb3b5f07SFlorian Hahn; 412cb3b5f07SFlorian Hahnentry: 413cb3b5f07SFlorian Hahn %idx.ext.plus.1 = add nuw nsw i32 %idx, 1 414cb3b5f07SFlorian Hahn %idx.ext.plus.1.ext = zext i32 %idx.ext.plus.1 to i64 415c5e1ddb6SFlorian Hahn %add.ptr = getelementptr inbounds %struct.2, ptr %start, i64 6, i32 1, i64 %idx.ext.plus.1.ext 416c5e1ddb6SFlorian Hahn %add.ptr.cast = bitcast ptr %add.ptr to ptr 417c5e1ddb6SFlorian Hahn %c.1 = icmp ule ptr %add.ptr.cast, %high 418cb3b5f07SFlorian Hahn br i1 %c.1, label %if.then, label %if.end 419cb3b5f07SFlorian Hahn 420c5e1ddb6SFlorian Hahnif.then: 421cb3b5f07SFlorian Hahn %idx.ext = zext i32 %idx to i64 422c5e1ddb6SFlorian Hahn %start.0 = getelementptr inbounds %struct.2, ptr %start, i64 6, i32 2 423c5e1ddb6SFlorian Hahn %c.0 = icmp ult ptr %start.0, %high 424cb3b5f07SFlorian Hahn ret i1 %c.0 425cb3b5f07SFlorian Hahn 426c5e1ddb6SFlorian Hahnif.end: 427c5e1ddb6SFlorian Hahn ret i1 true 428cb3b5f07SFlorian Hahn} 429