99 lines · plain
1; RUN: llc < %s -mtriple=armv7-apple-darwin | FileCheck %s2 3; Make sure that we merge the consecutive load/store sequence below and use a4; word (16 bit) instead of a byte copy.5; CHECK: MergeLoadStoreBaseIndexOffset6; CHECK: ldrh [[REG:r[0-9]+]], [{{.*}}]7; CHECK: strh [[REG]], [r1], #28define void @MergeLoadStoreBaseIndexOffset(ptr %a, ptr %b, ptr %c, i32 %n) {9 br label %110 11; <label>:112 %.09 = phi i32 [ %n, %0 ], [ %11, %1 ]13 %.08 = phi ptr [ %b, %0 ], [ %10, %1 ]14 %.0 = phi ptr [ %a, %0 ], [ %2, %1 ]15 %2 = getelementptr inbounds i32, ptr %.0, i32 116 %3 = load i32, ptr %.0, align 117 %4 = getelementptr inbounds i8, ptr %c, i32 %318 %5 = load i8, ptr %4, align 119 %6 = add i32 %3, 120 %7 = getelementptr inbounds i8, ptr %c, i32 %621 %8 = load i8, ptr %7, align 122 store i8 %5, ptr %.08, align 123 %9 = getelementptr inbounds i8, ptr %.08, i32 124 store i8 %8, ptr %9, align 125 %10 = getelementptr inbounds i8, ptr %.08, i32 226 %11 = add nsw i32 %.09, -127 %12 = icmp eq i32 %11, 028 br i1 %12, label %13, label %129 30; <label>:1331 ret void32}33 34; Make sure that we merge the consecutive load/store sequence below and use a35; word (16 bit) instead of a byte copy even if there are intermediate sign36; extensions.37; CHECK: MergeLoadStoreBaseIndexOffsetSext38; CHECK: ldrh [[REG:r[0-9]+]], [{{.*}}]39; CHECK: strh [[REG]], [r1], #240define void @MergeLoadStoreBaseIndexOffsetSext(ptr %a, ptr %b, ptr %c, i32 %n) {41 br label %142 43; <label>:144 %.09 = phi i32 [ %n, %0 ], [ %12, %1 ]45 %.08 = phi ptr [ %b, %0 ], [ %11, %1 ]46 %.0 = phi ptr [ %a, %0 ], [ %2, %1 ]47 %2 = getelementptr inbounds i8, ptr %.0, i32 148 %3 = load i8, ptr %.0, align 149 %4 = sext i8 %3 to i3250 %5 = getelementptr inbounds i8, ptr %c, i32 %451 %6 = load i8, ptr %5, align 152 %7 = add i32 %4, 153 %8 = getelementptr inbounds i8, ptr %c, i32 %754 %9 = load i8, ptr %8, align 155 store i8 %6, ptr %.08, align 156 %10 = getelementptr inbounds i8, ptr %.08, i32 157 store i8 %9, ptr %10, align 158 %11 = getelementptr inbounds i8, ptr %.08, i32 259 %12 = add nsw i32 %.09, -160 %13 = icmp eq i32 %12, 061 br i1 %13, label %14, label %162 63; <label>:1464 ret void65}66 67; However, we can only merge ignore sign extensions when they are on all memory68; computations;69; CHECK: loadStoreBaseIndexOffsetSextNoSex70; CHECK-NOT: ldrh [[REG:r[0-9]+]], [{{.*}}]71; CHECK-NOT: strh [[REG]], [r1], #272define void @loadStoreBaseIndexOffsetSextNoSex(ptr %a, ptr %b, ptr %c, i32 %n) {73 br label %174 75; <label>:176 %.09 = phi i32 [ %n, %0 ], [ %12, %1 ]77 %.08 = phi ptr [ %b, %0 ], [ %11, %1 ]78 %.0 = phi ptr [ %a, %0 ], [ %2, %1 ]79 %2 = getelementptr inbounds i8, ptr %.0, i32 180 %3 = load i8, ptr %.0, align 181 %4 = sext i8 %3 to i3282 %5 = getelementptr inbounds i8, ptr %c, i32 %483 %6 = load i8, ptr %5, align 184 %7 = add i8 %3, 185 %wrap.4 = sext i8 %7 to i3286 %8 = getelementptr inbounds i8, ptr %c, i32 %wrap.487 %9 = load i8, ptr %8, align 188 store i8 %6, ptr %.08, align 189 %10 = getelementptr inbounds i8, ptr %.08, i32 190 store i8 %9, ptr %10, align 191 %11 = getelementptr inbounds i8, ptr %.08, i32 292 %12 = add nsw i32 %.09, -193 %13 = icmp eq i32 %12, 094 br i1 %13, label %14, label %195 96; <label>:1497 ret void98}99