93 lines · plain
1; RUN: opt -passes=loop-versioning -S < %s | FileCheck %s2target triple = "x86_64-unknown-linux-gnu"3 4define void @fill(ptr %ls1.20, ptr %ls2.21, ptr %cse3.22) {5; CHECK-LABEL: @fill(6; CHECK-NEXT: bb1.lver.check:7; CHECK-NEXT: [[LS1_20_PROMOTED:%.*]] = load ptr, ptr [[LS1_20:%.*]], align 88; CHECK-NEXT: [[LS2_21_PROMOTED:%.*]] = load ptr, ptr [[LS2_21:%.*]], align 89; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[LS1_20_PROMOTED]], i64 -110; CHECK-NEXT: [[SCEVGEP1:%.*]] = getelementptr i8, ptr [[LS1_20_PROMOTED]], i64 111; CHECK-NEXT: [[SCEVGEP2:%.*]] = getelementptr i8, ptr [[LS2_21_PROMOTED]], i64 112; CHECK-NEXT: [[BOUND0:%.*]] = icmp ult ptr [[SCEVGEP]], [[SCEVGEP2]]13; CHECK-NEXT: [[BOUND1:%.*]] = icmp ult ptr [[LS2_21_PROMOTED]], [[SCEVGEP1]]14; CHECK-NEXT: [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]]15; CHECK-NEXT: br i1 [[FOUND_CONFLICT]], label %bb1.ph.lver.orig, label %bb1.ph16; CHECK: bb1.ph.lver.orig:17;18bb1.ph:19 %ls1.20.promoted = load ptr, ptr %ls1.2020 %ls2.21.promoted = load ptr, ptr %ls2.2121 br label %bb122 23bb1:24 %_tmp302 = phi ptr [ %ls2.21.promoted, %bb1.ph ], [ %_tmp30, %bb1 ]25 %_tmp281 = phi ptr [ %ls1.20.promoted, %bb1.ph ], [ %_tmp28, %bb1 ]26 %_tmp14 = getelementptr i8, ptr %_tmp281, i16 -127 %_tmp15 = load i8, ptr %_tmp1428 %add = add i8 %_tmp15, 129 store i8 %add, ptr %_tmp28130 store i8 %add, ptr %_tmp30231 %_tmp28 = getelementptr i8, ptr %_tmp281, i16 132 %_tmp30 = getelementptr i8, ptr %_tmp302, i16 133 br i1 false, label %bb1, label %bb3.loopexit34 35bb3.loopexit:36 %_tmp30.lcssa = phi ptr [ %_tmp30, %bb1 ]37 %_tmp15.lcssa = phi i8 [ %_tmp15, %bb1 ]38 %_tmp28.lcssa = phi ptr [ %_tmp28, %bb1 ]39 store ptr %_tmp28.lcssa, ptr %ls1.2040 store i8 %_tmp15.lcssa, ptr %cse3.2241 store ptr %_tmp30.lcssa, ptr %ls2.2142 br label %bb343 44bb3:45 ret void46}47 48define void @fill_no_null_opt(ptr %ls1.20, ptr %ls2.21, ptr %cse3.22) #0 {49; CHECK-LABEL: @fill_no_null_opt(50; CHECK-NEXT: bb1.lver.check:51; CHECK-NEXT: [[LS1_20_PROMOTED:%.*]] = load ptr, ptr [[LS1_20:%.*]], align 852; CHECK-NEXT: [[LS2_21_PROMOTED:%.*]] = load ptr, ptr [[LS2_21:%.*]], align 853; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[LS1_20_PROMOTED]], i64 -154; CHECK-NEXT: [[SCEVGEP1:%.*]] = getelementptr i8, ptr [[LS1_20_PROMOTED]], i64 155; CHECK-NEXT: [[SCEVGEP2:%.*]] = getelementptr i8, ptr [[LS2_21_PROMOTED]], i64 156; CHECK-NEXT: [[BOUND0:%.*]] = icmp ult ptr [[SCEVGEP]], [[SCEVGEP2]]57; CHECK-NEXT: [[BOUND1:%.*]] = icmp ult ptr [[LS2_21_PROMOTED]], [[SCEVGEP1]]58; CHECK-NEXT: [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]]59; CHECK-NEXT: br i1 [[FOUND_CONFLICT]], label %bb1.ph.lver.orig, label %bb1.ph60; CHECK: bb1.ph.lver.orig:61;62bb1.ph:63 %ls1.20.promoted = load ptr, ptr %ls1.2064 %ls2.21.promoted = load ptr, ptr %ls2.2165 br label %bb166 67bb1:68 %_tmp302 = phi ptr [ %ls2.21.promoted, %bb1.ph ], [ %_tmp30, %bb1 ]69 %_tmp281 = phi ptr [ %ls1.20.promoted, %bb1.ph ], [ %_tmp28, %bb1 ]70 %_tmp14 = getelementptr i8, ptr %_tmp281, i16 -171 %_tmp15 = load i8, ptr %_tmp1472 %add = add i8 %_tmp15, 173 store i8 %add, ptr %_tmp28174 store i8 %add, ptr %_tmp30275 %_tmp28 = getelementptr i8, ptr %_tmp281, i16 176 %_tmp30 = getelementptr i8, ptr %_tmp302, i16 177 br i1 false, label %bb1, label %bb3.loopexit78 79bb3.loopexit:80 %_tmp30.lcssa = phi ptr [ %_tmp30, %bb1 ]81 %_tmp15.lcssa = phi i8 [ %_tmp15, %bb1 ]82 %_tmp28.lcssa = phi ptr [ %_tmp28, %bb1 ]83 store ptr %_tmp28.lcssa, ptr %ls1.2084 store i8 %_tmp15.lcssa, ptr %cse3.2285 store ptr %_tmp30.lcssa, ptr %ls2.2186 br label %bb387 88bb3:89 ret void90}91 92attributes #0 = { null_pointer_is_valid }93