440 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s3 4; NOTE: The custom datalayout defines i32 to be 64 bit aligned.5 6target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i32:64:64-f80:128-n8:16:32:64-S128"7 8declare void @use(ptr)9declare i1 @cond()10 11define void @test_monotonic_ptr_iv_inc_1_element_types_with_different_alloc_type_sizes(ptr %start, i16 %len) {12; CHECK-LABEL: @test_monotonic_ptr_iv_inc_1_element_types_with_different_alloc_type_sizes(13; CHECK-NEXT: entry:14; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds float, ptr [[START:%.*]], i16 [[LEN:%.*]]15; CHECK-NEXT: [[LEN_NEG:%.*]] = icmp slt i16 [[LEN]], 016; CHECK-NEXT: br i1 [[LEN_NEG]], label [[EXIT:%.*]], label [[LOOP_PH:%.*]]17; CHECK: loop.ph:18; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]19; CHECK: loop.header:20; CHECK-NEXT: [[PTR_IV:%.*]] = phi ptr [ [[START]], [[LOOP_PH]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]21; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[PTR_IV]], [[UPPER]]22; CHECK-NEXT: br i1 [[C]], label [[EXIT]], label [[FOR_BODY:%.*]]23; CHECK: for.body:24; CHECK-NEXT: [[T_2:%.*]] = icmp ult ptr [[PTR_IV]], [[UPPER]]25; CHECK-NEXT: [[AND:%.*]] = and i1 true, [[T_2]]26; CHECK-NEXT: br i1 [[AND]], label [[LOOP_LATCH]], label [[EXIT]]27; CHECK: loop.latch:28; CHECK-NEXT: call void @use(ptr [[PTR_IV]])29; CHECK-NEXT: [[PTR_IV_NEXT]] = getelementptr inbounds i32, ptr [[PTR_IV]], i16 130; CHECK-NEXT: br label [[LOOP_HEADER]]31; CHECK: exit:32; CHECK-NEXT: ret void33;34entry:35 %upper = getelementptr inbounds float, ptr %start, i16 %len36 %len.neg = icmp slt i16 %len, 037 br i1 %len.neg, label %exit, label %loop.ph38 39loop.ph:40 br label %loop.header41 42loop.header:43 %ptr.iv = phi ptr [ %start, %loop.ph ], [ %ptr.iv.next, %loop.latch ]44 %c = icmp eq ptr %ptr.iv, %upper45 br i1 %c, label %exit, label %for.body46 47for.body:48 %t.1 = icmp uge ptr %ptr.iv, %start49 %t.2 = icmp ult ptr %ptr.iv, %upper50 %and = and i1 %t.1, %t.251 br i1 %and, label %loop.latch, label %exit52 53loop.latch:54 call void @use(ptr %ptr.iv)55 %ptr.iv.next = getelementptr inbounds i32, ptr %ptr.iv, i16 156 br label %loop.header57 58exit:59 ret void60}61 62define void @test_monotonic_ptr_iv_inc_2_element_types_with_different_alloc_type_sizes(ptr %start, i16 %len) {63; CHECK-LABEL: @test_monotonic_ptr_iv_inc_2_element_types_with_different_alloc_type_sizes(64; CHECK-NEXT: entry:65; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[START:%.*]], i16 [[LEN:%.*]]66; CHECK-NEXT: [[LEN_NEG:%.*]] = icmp slt i16 [[LEN]], 067; CHECK-NEXT: br i1 [[LEN_NEG]], label [[EXIT:%.*]], label [[LOOP_PH:%.*]]68; CHECK: loop.ph:69; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]70; CHECK: loop.header:71; CHECK-NEXT: [[PTR_IV:%.*]] = phi ptr [ [[START]], [[LOOP_PH]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]72; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[PTR_IV]], [[UPPER]]73; CHECK-NEXT: br i1 [[C]], label [[EXIT]], label [[FOR_BODY:%.*]]74; CHECK: for.body:75; CHECK-NEXT: [[AND:%.*]] = and i1 true, true76; CHECK-NEXT: br i1 [[AND]], label [[LOOP_LATCH]], label [[EXIT]]77; CHECK: loop.latch:78; CHECK-NEXT: call void @use(ptr [[PTR_IV]])79; CHECK-NEXT: [[PTR_IV_NEXT]] = getelementptr inbounds float, ptr [[PTR_IV]], i16 180; CHECK-NEXT: br label [[LOOP_HEADER]]81; CHECK: exit:82; CHECK-NEXT: ret void83;84entry:85 %upper = getelementptr inbounds i32, ptr %start, i16 %len86 %len.neg = icmp slt i16 %len, 087 br i1 %len.neg, label %exit, label %loop.ph88 89loop.ph:90 br label %loop.header91 92loop.header:93 %ptr.iv = phi ptr [ %start, %loop.ph ], [ %ptr.iv.next, %loop.latch ]94 %c = icmp eq ptr %ptr.iv, %upper95 br i1 %c, label %exit, label %for.body96 97for.body:98 %t.1 = icmp uge ptr %ptr.iv, %start99 %t.2 = icmp ult ptr %ptr.iv, %upper100 %and = and i1 %t.1, %t.2101 br i1 %and, label %loop.latch, label %exit102 103loop.latch:104 call void @use(ptr %ptr.iv)105 %ptr.iv.next = getelementptr inbounds float, ptr %ptr.iv, i16 1106 br label %loop.header107 108exit:109 ret void110}111 112define void @test_monotonic_ptr_iv_inc_1_different_element_types_with_same_alloc_type_sizes(ptr %start, i16 %len) {113; CHECK-LABEL: @test_monotonic_ptr_iv_inc_1_different_element_types_with_same_alloc_type_sizes(114; CHECK-NEXT: entry:115; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds i5, ptr [[START:%.*]], i16 [[LEN:%.*]]116; CHECK-NEXT: [[LEN_NEG:%.*]] = icmp slt i16 [[LEN]], 0117; CHECK-NEXT: br i1 [[LEN_NEG]], label [[EXIT:%.*]], label [[LOOP_PH:%.*]]118; CHECK: loop.ph:119; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]120; CHECK: loop.header:121; CHECK-NEXT: [[PTR_IV:%.*]] = phi ptr [ [[START]], [[LOOP_PH]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]122; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[PTR_IV]], [[UPPER]]123; CHECK-NEXT: br i1 [[C]], label [[EXIT]], label [[FOR_BODY:%.*]]124; CHECK: for.body:125; CHECK-NEXT: [[AND:%.*]] = and i1 true, true126; CHECK-NEXT: br i1 [[AND]], label [[LOOP_LATCH]], label [[EXIT]]127; CHECK: loop.latch:128; CHECK-NEXT: call void @use(ptr [[PTR_IV]])129; CHECK-NEXT: [[PTR_IV_NEXT]] = getelementptr inbounds i7, ptr [[PTR_IV]], i16 1130; CHECK-NEXT: br label [[LOOP_HEADER]]131; CHECK: exit:132; CHECK-NEXT: ret void133;134entry:135 %upper = getelementptr inbounds i5, ptr %start, i16 %len136 %len.neg = icmp slt i16 %len, 0137 br i1 %len.neg, label %exit, label %loop.ph138 139loop.ph:140 br label %loop.header141 142loop.header:143 %ptr.iv = phi ptr [ %start, %loop.ph ], [ %ptr.iv.next, %loop.latch ]144 %c = icmp eq ptr %ptr.iv, %upper145 br i1 %c, label %exit, label %for.body146 147for.body:148 %t.1 = icmp uge ptr %ptr.iv, %start149 %t.2 = icmp ult ptr %ptr.iv, %upper150 %and = and i1 %t.1, %t.2151 br i1 %and, label %loop.latch, label %exit152 153loop.latch:154 call void @use(ptr %ptr.iv)155 %ptr.iv.next = getelementptr inbounds i7, ptr %ptr.iv, i16 1156 br label %loop.header157 158exit:159 ret void160}161 162define void @test_monotonic_ptr_iv_inc_2_different_element_types_with_same_alloc_type_sizes(ptr %start, i16 %len) {163; CHECK-LABEL: @test_monotonic_ptr_iv_inc_2_different_element_types_with_same_alloc_type_sizes(164; CHECK-NEXT: entry:165; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds i31, ptr [[START:%.*]], i16 [[LEN:%.*]]166; CHECK-NEXT: [[LEN_NEG:%.*]] = icmp slt i16 [[LEN]], 0167; CHECK-NEXT: br i1 [[LEN_NEG]], label [[EXIT:%.*]], label [[LOOP_PH:%.*]]168; CHECK: loop.ph:169; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]170; CHECK: loop.header:171; CHECK-NEXT: [[PTR_IV:%.*]] = phi ptr [ [[START]], [[LOOP_PH]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]172; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[PTR_IV]], [[UPPER]]173; CHECK-NEXT: br i1 [[C]], label [[EXIT]], label [[FOR_BODY:%.*]]174; CHECK: for.body:175; CHECK-NEXT: [[AND:%.*]] = and i1 true, true176; CHECK-NEXT: br i1 [[AND]], label [[LOOP_LATCH]], label [[EXIT]]177; CHECK: loop.latch:178; CHECK-NEXT: call void @use(ptr [[PTR_IV]])179; CHECK-NEXT: [[PTR_IV_NEXT]] = getelementptr inbounds i30, ptr [[PTR_IV]], i16 1180; CHECK-NEXT: br label [[LOOP_HEADER]]181; CHECK: exit:182; CHECK-NEXT: ret void183;184entry:185 %upper = getelementptr inbounds i31, ptr %start, i16 %len186 %len.neg = icmp slt i16 %len, 0187 br i1 %len.neg, label %exit, label %loop.ph188 189loop.ph:190 br label %loop.header191 192loop.header:193 %ptr.iv = phi ptr [ %start, %loop.ph ], [ %ptr.iv.next, %loop.latch ]194 %c = icmp eq ptr %ptr.iv, %upper195 br i1 %c, label %exit, label %for.body196 197for.body:198 %t.1 = icmp uge ptr %ptr.iv, %start199 %t.2 = icmp ult ptr %ptr.iv, %upper200 %and = and i1 %t.1, %t.2201 br i1 %and, label %loop.latch, label %exit202 203loop.latch:204 call void @use(ptr %ptr.iv)205 %ptr.iv.next = getelementptr inbounds i30, ptr %ptr.iv, i16 1206 br label %loop.header207 208exit:209 ret void210}211 212define void @test_monotonic_ptr_iv_inc_1_element_types_with_different_alloc_type_sizes_with_early_exit(ptr %start, i16 %len) {213; CHECK-LABEL: @test_monotonic_ptr_iv_inc_1_element_types_with_different_alloc_type_sizes_with_early_exit(214; CHECK-NEXT: entry:215; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds float, ptr [[START:%.*]], i16 [[LEN:%.*]]216; CHECK-NEXT: [[LEN_NEG:%.*]] = icmp slt i16 [[LEN]], 0217; CHECK-NEXT: br i1 [[LEN_NEG]], label [[EXIT:%.*]], label [[LOOP_PH:%.*]]218; CHECK: loop.ph:219; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]220; CHECK: loop.header:221; CHECK-NEXT: [[PTR_IV:%.*]] = phi ptr [ [[START]], [[LOOP_PH]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]222; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[PTR_IV]], [[UPPER]]223; CHECK-NEXT: br i1 [[C]], label [[EXIT]], label [[FOR_BODY:%.*]]224; CHECK: for.body:225; CHECK-NEXT: [[C_1:%.*]] = call i1 @cond()226; CHECK-NEXT: br i1 [[C_1]], label [[LOOP_NEXT:%.*]], label [[EXIT]]227; CHECK: loop.next:228; CHECK-NEXT: [[T_2:%.*]] = icmp ult ptr [[PTR_IV]], [[UPPER]]229; CHECK-NEXT: [[AND:%.*]] = and i1 true, [[T_2]]230; CHECK-NEXT: br i1 [[AND]], label [[LOOP_LATCH]], label [[EXIT]]231; CHECK: loop.latch:232; CHECK-NEXT: call void @use(ptr [[PTR_IV]])233; CHECK-NEXT: [[PTR_IV_NEXT]] = getelementptr inbounds i32, ptr [[PTR_IV]], i16 1234; CHECK-NEXT: br label [[LOOP_HEADER]]235; CHECK: exit:236; CHECK-NEXT: ret void237;238entry:239 %upper = getelementptr inbounds float, ptr %start, i16 %len240 %len.neg = icmp slt i16 %len, 0241 br i1 %len.neg, label %exit, label %loop.ph242 243loop.ph:244 br label %loop.header245 246loop.header:247 %ptr.iv = phi ptr [ %start, %loop.ph ], [ %ptr.iv.next, %loop.latch ]248 %c = icmp eq ptr %ptr.iv, %upper249 br i1 %c, label %exit, label %for.body250 251for.body:252 %c.1 = call i1 @cond()253 br i1 %c.1, label %loop.next, label %exit254 255loop.next:256 %t.1 = icmp uge ptr %ptr.iv, %start257 %t.2 = icmp ult ptr %ptr.iv, %upper258 %and = and i1 %t.1, %t.2259 br i1 %and, label %loop.latch, label %exit260 261loop.latch:262 call void @use(ptr %ptr.iv)263 %ptr.iv.next = getelementptr inbounds i32, ptr %ptr.iv, i16 1264 br label %loop.header265 266exit:267 ret void268}269 270define void @test_monotonic_ptr_iv_inc_2_element_types_with_different_alloc_type_sizes_with_early_exit(ptr %start, i16 %len) {271; CHECK-LABEL: @test_monotonic_ptr_iv_inc_2_element_types_with_different_alloc_type_sizes_with_early_exit(272; CHECK-NEXT: entry:273; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[START:%.*]], i16 [[LEN:%.*]]274; CHECK-NEXT: [[LEN_NEG:%.*]] = icmp slt i16 [[LEN]], 0275; CHECK-NEXT: br i1 [[LEN_NEG]], label [[EXIT:%.*]], label [[LOOP_PH:%.*]]276; CHECK: loop.ph:277; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]278; CHECK: loop.header:279; CHECK-NEXT: [[PTR_IV:%.*]] = phi ptr [ [[START]], [[LOOP_PH]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]280; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[PTR_IV]], [[UPPER]]281; CHECK-NEXT: br i1 [[C]], label [[EXIT]], label [[FOR_BODY:%.*]]282; CHECK: for.body:283; CHECK-NEXT: [[C_1:%.*]] = call i1 @cond()284; CHECK-NEXT: br i1 [[C_1]], label [[LOOP_NEXT:%.*]], label [[EXIT]]285; CHECK: loop.next:286; CHECK-NEXT: [[AND:%.*]] = and i1 true, true287; CHECK-NEXT: br i1 [[AND]], label [[LOOP_LATCH]], label [[EXIT]]288; CHECK: loop.latch:289; CHECK-NEXT: call void @use(ptr [[PTR_IV]])290; CHECK-NEXT: [[PTR_IV_NEXT]] = getelementptr inbounds float, ptr [[PTR_IV]], i16 1291; CHECK-NEXT: br label [[LOOP_HEADER]]292; CHECK: exit:293; CHECK-NEXT: ret void294;295entry:296 %upper = getelementptr inbounds i32, ptr %start, i16 %len297 %len.neg = icmp slt i16 %len, 0298 br i1 %len.neg, label %exit, label %loop.ph299 300loop.ph:301 br label %loop.header302 303loop.header:304 %ptr.iv = phi ptr [ %start, %loop.ph ], [ %ptr.iv.next, %loop.latch ]305 %c = icmp eq ptr %ptr.iv, %upper306 br i1 %c, label %exit, label %for.body307 308for.body:309 %c.1 = call i1 @cond()310 br i1 %c.1, label %loop.next, label %exit311 312loop.next:313 %t.1 = icmp uge ptr %ptr.iv, %start314 %t.2 = icmp ult ptr %ptr.iv, %upper315 %and = and i1 %t.1, %t.2316 br i1 %and, label %loop.latch, label %exit317 318loop.latch:319 call void @use(ptr %ptr.iv)320 %ptr.iv.next = getelementptr inbounds float, ptr %ptr.iv, i16 1321 br label %loop.header322 323exit:324 ret void325}326 327define void @test_monotonic_ptr_iv_inc_1_different_element_types_with_same_alloc_type_sizes_with_early_exit(ptr %start, i16 %len) {328; CHECK-LABEL: @test_monotonic_ptr_iv_inc_1_different_element_types_with_same_alloc_type_sizes_with_early_exit(329; CHECK-NEXT: entry:330; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds i5, ptr [[START:%.*]], i16 [[LEN:%.*]]331; CHECK-NEXT: [[LEN_NEG:%.*]] = icmp slt i16 [[LEN]], 0332; CHECK-NEXT: br i1 [[LEN_NEG]], label [[EXIT:%.*]], label [[LOOP_PH:%.*]]333; CHECK: loop.ph:334; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]335; CHECK: loop.header:336; CHECK-NEXT: [[PTR_IV:%.*]] = phi ptr [ [[START]], [[LOOP_PH]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]337; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[PTR_IV]], [[UPPER]]338; CHECK-NEXT: br i1 [[C]], label [[EXIT]], label [[FOR_BODY:%.*]]339; CHECK: for.body:340; CHECK-NEXT: [[C_1:%.*]] = call i1 @cond()341; CHECK-NEXT: br i1 [[C_1]], label [[LOOP_NEXT:%.*]], label [[EXIT]]342; CHECK: loop.next:343; CHECK-NEXT: [[AND:%.*]] = and i1 true, true344; CHECK-NEXT: br i1 [[AND]], label [[LOOP_LATCH]], label [[EXIT]]345; CHECK: loop.latch:346; CHECK-NEXT: call void @use(ptr [[PTR_IV]])347; CHECK-NEXT: [[PTR_IV_NEXT]] = getelementptr inbounds i7, ptr [[PTR_IV]], i16 1348; CHECK-NEXT: br label [[LOOP_HEADER]]349; CHECK: exit:350; CHECK-NEXT: ret void351;352entry:353 %upper = getelementptr inbounds i5, ptr %start, i16 %len354 %len.neg = icmp slt i16 %len, 0355 br i1 %len.neg, label %exit, label %loop.ph356 357loop.ph:358 br label %loop.header359 360loop.header:361 %ptr.iv = phi ptr [ %start, %loop.ph ], [ %ptr.iv.next, %loop.latch ]362 %c = icmp eq ptr %ptr.iv, %upper363 br i1 %c, label %exit, label %for.body364 365for.body:366 %c.1 = call i1 @cond()367 br i1 %c.1, label %loop.next, label %exit368 369loop.next:370 %t.1 = icmp uge ptr %ptr.iv, %start371 %t.2 = icmp ult ptr %ptr.iv, %upper372 %and = and i1 %t.1, %t.2373 br i1 %and, label %loop.latch, label %exit374 375loop.latch:376 call void @use(ptr %ptr.iv)377 %ptr.iv.next = getelementptr inbounds i7, ptr %ptr.iv, i16 1378 br label %loop.header379 380exit:381 ret void382}383 384define void @test_monotonic_ptr_iv_inc_2_different_element_types_with_same_alloc_type_sizes_with_early_exit(ptr %start, i16 %len) {385; CHECK-LABEL: @test_monotonic_ptr_iv_inc_2_different_element_types_with_same_alloc_type_sizes_with_early_exit(386; CHECK-NEXT: entry:387; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds i31, ptr [[START:%.*]], i16 [[LEN:%.*]]388; CHECK-NEXT: [[LEN_NEG:%.*]] = icmp slt i16 [[LEN]], 0389; CHECK-NEXT: br i1 [[LEN_NEG]], label [[EXIT:%.*]], label [[LOOP_PH:%.*]]390; CHECK: loop.ph:391; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]392; CHECK: loop.header:393; CHECK-NEXT: [[PTR_IV:%.*]] = phi ptr [ [[START]], [[LOOP_PH]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]394; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[PTR_IV]], [[UPPER]]395; CHECK-NEXT: br i1 [[C]], label [[EXIT]], label [[FOR_BODY:%.*]]396; CHECK: for.body:397; CHECK-NEXT: [[C_1:%.*]] = call i1 @cond()398; CHECK-NEXT: br i1 [[C_1]], label [[LOOP_NEXT:%.*]], label [[EXIT]]399; CHECK: loop.next:400; CHECK-NEXT: [[AND:%.*]] = and i1 true, true401; CHECK-NEXT: br i1 [[AND]], label [[LOOP_LATCH]], label [[EXIT]]402; CHECK: loop.latch:403; CHECK-NEXT: call void @use(ptr [[PTR_IV]])404; CHECK-NEXT: [[PTR_IV_NEXT]] = getelementptr inbounds i30, ptr [[PTR_IV]], i16 1405; CHECK-NEXT: br label [[LOOP_HEADER]]406; CHECK: exit:407; CHECK-NEXT: ret void408;409entry:410 %upper = getelementptr inbounds i31, ptr %start, i16 %len411 %len.neg = icmp slt i16 %len, 0412 br i1 %len.neg, label %exit, label %loop.ph413 414loop.ph:415 br label %loop.header416 417loop.header:418 %ptr.iv = phi ptr [ %start, %loop.ph ], [ %ptr.iv.next, %loop.latch ]419 %c = icmp eq ptr %ptr.iv, %upper420 br i1 %c, label %exit, label %for.body421 422for.body:423 %c.1 = call i1 @cond()424 br i1 %c.1, label %loop.next, label %exit425 426loop.next:427 %t.1 = icmp uge ptr %ptr.iv, %start428 %t.2 = icmp ult ptr %ptr.iv, %upper429 %and = and i1 %t.1, %t.2430 br i1 %and, label %loop.latch, label %exit431 432loop.latch:433 call void @use(ptr %ptr.iv)434 %ptr.iv.next = getelementptr inbounds i30, ptr %ptr.iv, i16 1435 br label %loop.header436 437exit:438 ret void439}440