Index: lib/Target/ARM/ARMLoadStoreOptimizer.cpp =================================================================== --- lib/Target/ARM/ARMLoadStoreOptimizer.cpp +++ lib/Target/ARM/ARMLoadStoreOptimizer.cpp @@ -1027,6 +1027,18 @@ if (AssumeMisalignedLoadStores && !mayCombineMisaligned(*STI, *MI)) CanMergeToLSMulti = CanMergeToLSDouble = false; + // vldm / vstm limit are 32 for S variants, 16 for D variants. + unsigned Limit; + switch (Opcode) { + default: + Limit = UINT_MAX; + break; + case ARM::VLDRD: + case ARM::VSTRD: + Limit = 16; + break; + } + // Merge following instructions where possible. for (unsigned I = SIndex+1; I < EIndex; ++I, ++Count) { int NewOffset = MemOps[I].Offset; @@ -1036,6 +1048,8 @@ unsigned Reg = MO.getReg(); if (Reg == ARM::SP || Reg == ARM::PC) break; + if (Count == Limit) + break; // See if the current load/store may be part of a multi load/store. unsigned RegNum = MO.isUndef() ? std::numeric_limits::max() Index: test/CodeGen/ARM/load-multiple-opt.ll =================================================================== --- /dev/null +++ test/CodeGen/ARM/load-multiple-opt.ll @@ -0,0 +1,300 @@ +; RUN: llc %s -o - -debug-only=arm-ldst-opt | FileCheck %s +; CHECK-NOT: vstmia r4, {d15, d16, d17, d18, d19, d20, d21, d22, d23, d24, d25, d26, d27, d28, d29, d30, d31} +; CHECK: vstmia r4, {d15, d16, d17, d18, d19, d20, d21, d22, d23, d24, d25, d26, d27, d28, d29, d30} +; CHECK-NEXT: vstr d31, [r4, #128] +; CHECK: vstmia r0, {d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14} + +target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" +target triple = "thumbv7--linux-android" + +%struct.ak = type { %struct.bk } +%struct.bk = type { %struct.m } +%struct.m = type { [64 x %struct.bw] } +%struct.bw = type { double, %struct.ak.1 } +%struct.ak.1 = type { %struct.bk.2 } +%struct.bk.2 = type { %struct.m.4 } +%struct.m.4 = type { [64 x double] } +%struct.l = type { i8 } + +; Function Attrs: ssp uwtable +define void @_Z2brR1lI1ME(%struct.ak* noalias sret, %struct.l* nocapture readonly dereferenceable(1)) { + %3 = alloca %struct.bw, align 8 + %4 = tail call %struct.ak* @_ZN2akI2bwEC1Ev(%struct.ak* %0) + %5 = bitcast %struct.bw* %3 to i8* + call void @llvm.lifetime.start.p0i8(i64 520, i8* nonnull %5) + %6 = call %struct.bw* @_ZN2bwC1Ed(%struct.bw* nonnull %3, double 2.000000e+00) + %7 = bitcast %struct.l* %1 to %struct.bw** + %8 = load %struct.bw*, %struct.bw** %7, align 4, !noalias !1 + %9 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 0 + %10 = load double, double* %9, align 8 + %11 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 0 + %12 = load double, double* %11, align 8 + %13 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 1 + %14 = load double, double* %13, align 8 + %15 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 2 + %16 = load double, double* %15, align 8 + %17 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 3 + %18 = load double, double* %17, align 8 + %19 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 4 + %20 = load double, double* %19, align 8 + %21 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 5 + %22 = load double, double* %21, align 8 + %23 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 6 + %24 = load double, double* %23, align 8 + %25 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 7 + %26 = load double, double* %25, align 8 + %27 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 8 + %28 = load double, double* %27, align 8 + %29 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 9 + %30 = load double, double* %29, align 8 + %31 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 10 + %32 = load double, double* %31, align 8 + %33 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 11 + %34 = load double, double* %33, align 8 + %35 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 12 + %36 = load double, double* %35, align 8 + %37 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 13 + %38 = load double, double* %37, align 8 + %39 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 14 + %40 = load double, double* %39, align 8 + %41 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 15 + %42 = load double, double* %41, align 8 + %43 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 16 + %44 = load double, double* %43, align 8 + %45 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 17 + %46 = load double, double* %45, align 8 + %47 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 18 + %48 = load double, double* %47, align 8 + %49 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 19 + %50 = load double, double* %49, align 8 + %51 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 20 + %52 = load double, double* %51, align 8 + %53 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 21 + %54 = load double, double* %53, align 8 + %55 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 22 + %56 = load double, double* %55, align 8 + %57 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 23 + %58 = load double, double* %57, align 8 + %59 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 24 + %60 = load double, double* %59, align 8 + %61 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 25 + %62 = load double, double* %61, align 8 + %63 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 26 + %64 = load double, double* %63, align 8 + %65 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 27 + %66 = load double, double* %65, align 8 + %67 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 28 + %68 = load double, double* %67, align 8 + %69 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 29 + %70 = load double, double* %69, align 8 + %71 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 30 + %72 = load double, double* %71, align 8 + %73 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 31 + %74 = load double, double* %73, align 8 + %75 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 32 + %76 = load double, double* %75, align 8 + %77 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 33 + %78 = load double, double* %77, align 8 + %79 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 34 + %80 = load double, double* %79, align 8 + %81 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 35 + %82 = load double, double* %81, align 8 + %83 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 36 + %84 = load double, double* %83, align 8 + %85 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 37 + %86 = load double, double* %85, align 8 + %87 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 38 + %88 = load double, double* %87, align 8 + %89 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 39 + %90 = load double, double* %89, align 8 + %91 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 40 + %92 = load double, double* %91, align 8 + %93 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 41 + %94 = load double, double* %93, align 8 + %95 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 42 + %96 = load double, double* %95, align 8 + %97 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 43 + %98 = load double, double* %97, align 8 + %99 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 44 + %100 = load double, double* %99, align 8 + %101 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 45 + %102 = load double, double* %101, align 8 + %103 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 46 + %104 = load double, double* %103, align 8 + %105 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 47 + %106 = load double, double* %105, align 8 + %107 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 48 + %108 = load double, double* %107, align 8 + %109 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 49 + %110 = load double, double* %109, align 8 + %111 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 50 + %112 = load double, double* %111, align 8 + %113 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 51 + %114 = load double, double* %113, align 8 + %115 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 52 + %116 = load double, double* %115, align 8 + %117 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 53 + %118 = load double, double* %117, align 8 + %119 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 54 + %120 = load double, double* %119, align 8 + %121 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 55 + %122 = load double, double* %121, align 8 + %123 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 56 + %124 = load double, double* %123, align 8 + %125 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 57 + %126 = load double, double* %125, align 8 + %127 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 58 + %128 = load double, double* %127, align 8 + %129 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 59 + %130 = load double, double* %129, align 8 + %131 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 60 + %132 = load double, double* %131, align 8 + %133 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 61 + %134 = load double, double* %133, align 8 + %135 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 62 + %136 = load double, double* %135, align 8 + %137 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 0 + store double %10, double* %137, align 8 + %138 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 0 + store double %12, double* %138, align 8 + %139 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 1 + store double %14, double* %139, align 8 + %140 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 2 + store double %16, double* %140, align 8 + %141 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 3 + store double %18, double* %141, align 8 + %142 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 4 + store double %20, double* %142, align 8 + %143 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 5 + store double %22, double* %143, align 8 + %144 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 6 + store double %24, double* %144, align 8 + %145 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 7 + store double %26, double* %145, align 8 + %146 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 8 + store double %28, double* %146, align 8 + %147 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 9 + store double %30, double* %147, align 8 + %148 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 10 + store double %32, double* %148, align 8 + %149 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 11 + store double %34, double* %149, align 8 + %150 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 12 + store double %36, double* %150, align 8 + %151 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 13 + store double %38, double* %151, align 8 + %152 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 14 + store double %40, double* %152, align 8 + %153 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 15 + store double %42, double* %153, align 8 + %154 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 16 + store double %44, double* %154, align 8 + %155 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 17 + store double %46, double* %155, align 8 + %156 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 18 + store double %48, double* %156, align 8 + %157 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 19 + store double %50, double* %157, align 8 + %158 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 20 + store double %52, double* %158, align 8 + %159 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 21 + store double %54, double* %159, align 8 + %160 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 22 + store double %56, double* %160, align 8 + %161 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 23 + store double %58, double* %161, align 8 + %162 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 24 + store double %60, double* %162, align 8 + %163 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 25 + store double %62, double* %163, align 8 + %164 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 26 + store double %64, double* %164, align 8 + %165 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 27 + store double %66, double* %165, align 8 + %166 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 28 + store double %68, double* %166, align 8 + %167 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 29 + store double %70, double* %167, align 8 + %168 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 30 + store double %72, double* %168, align 8 + %169 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 31 + store double %74, double* %169, align 8 + %170 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 32 + store double %76, double* %170, align 8 + %171 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 33 + store double %78, double* %171, align 8 + %172 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 34 + store double %80, double* %172, align 8 + %173 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 35 + store double %82, double* %173, align 8 + %174 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 36 + store double %84, double* %174, align 8 + %175 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 37 + store double %86, double* %175, align 8 + %176 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 38 + store double %88, double* %176, align 8 + %177 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 39 + store double %90, double* %177, align 8 + %178 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 40 + store double %92, double* %178, align 8 + %179 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 41 + store double %94, double* %179, align 8 + %180 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 42 + store double %96, double* %180, align 8 + %181 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 43 + store double %98, double* %181, align 8 + %182 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 44 + store double %100, double* %182, align 8 + %183 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 45 + store double %102, double* %183, align 8 + %184 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 46 + store double %104, double* %184, align 8 + %185 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 47 + store double %106, double* %185, align 8 + %186 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 48 + store double %108, double* %186, align 8 + %187 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 49 + store double %110, double* %187, align 8 + %188 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 50 + store double %112, double* %188, align 8 + %189 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 51 + store double %114, double* %189, align 8 + %190 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 52 + store double %116, double* %190, align 8 + %191 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 53 + store double %118, double* %191, align 8 + %192 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 54 + store double %120, double* %192, align 8 + %193 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 55 + store double %122, double* %193, align 8 + %194 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 56 + store double %124, double* %194, align 8 + %195 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 57 + store double %126, double* %195, align 8 + %196 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 58 + store double %128, double* %196, align 8 + %197 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 59 + store double %130, double* %197, align 8 + %198 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 60 + store double %132, double* %198, align 8 + %199 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 61 + store double %134, double* %199, align 8 + %200 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 62 + store double %136, double* %200, align 8 + call void @llvm.lifetime.end.p0i8(i64 520, i8* nonnull %5) + ret void +} + +declare %struct.ak* @_ZN2akI2bwEC1Ev(%struct.ak* returned) + +declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) + +declare %struct.bw* @_ZN2bwC1Ed(%struct.bw* returned, double) + +declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) + +!1 = !{!2, !4} +!2 = distinct !{!2, !3, !"_ZNK1M2asEi: argument 0"} +!3 = distinct !{!3, !"_ZNK1M2asEi"} +!4 = distinct !{!4, !5, !"_ZNK1lI1ME3fooEi: argument 0"} +!5 = distinct !{!5, !"_ZNK1lI1ME3fooEi"} Index: test/CodeGen/ARM/load_store_opt_reg_limit.mir =================================================================== --- /dev/null +++ test/CodeGen/ARM/load_store_opt_reg_limit.mir @@ -0,0 +1,671 @@ +# RUN: llc -mtriple=thumbv7--linux-andorid -verify-machineinstrs -run-pass=arm-ldst-opt %s -o - | FileCheck %s +--- | + target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" + target triple = "thumbv7--linux-android" + + %struct.ak = type { %struct.bk } + %struct.bk = type { %struct.m } + %struct.m = type { [64 x %struct.bw] } + %struct.bw = type { double, %struct.ak.1 } + %struct.ak.1 = type { %struct.bk.2 } + %struct.bk.2 = type { %struct.m.4 } + %struct.m.4 = type { [64 x double] } + %struct.l = type { i8 } + + define void @_Z2brR1lI1ME(%struct.ak* noalias sret, %struct.l* nocapture readonly dereferenceable(1)) { + %3 = alloca %struct.bw, align 8 + %4 = tail call %struct.ak* @_ZN2akI2bwEC1Ev(%struct.ak* %0) + %5 = bitcast %struct.bw* %3 to i8* + call void @llvm.lifetime.start.p0i8(i64 520, i8* nonnull %5) + %6 = call %struct.bw* @_ZN2bwC1Ed(%struct.bw* nonnull %3, double 2.000000e+00) + %7 = bitcast %struct.l* %1 to %struct.bw** + %8 = load %struct.bw*, %struct.bw** %7, align 4, !noalias !0 + %9 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 0 + %10 = load double, double* %9, align 8 + %11 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 0 + %12 = load double, double* %11, align 8 + %13 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 1 + %14 = load double, double* %13, align 8 + %15 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 2 + %16 = load double, double* %15, align 8 + %17 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 3 + %18 = load double, double* %17, align 8 + %19 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 4 + %20 = load double, double* %19, align 8 + %21 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 5 + %22 = load double, double* %21, align 8 + %23 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 6 + %24 = load double, double* %23, align 8 + %25 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 7 + %26 = load double, double* %25, align 8 + %27 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 8 + %28 = load double, double* %27, align 8 + %29 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 9 + %30 = load double, double* %29, align 8 + %31 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 10 + %32 = load double, double* %31, align 8 + %33 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 11 + %34 = load double, double* %33, align 8 + %35 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 12 + %36 = load double, double* %35, align 8 + %37 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 13 + %38 = load double, double* %37, align 8 + %39 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 14 + %40 = load double, double* %39, align 8 + %41 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 15 + %42 = load double, double* %41, align 8 + %43 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 16 + %44 = load double, double* %43, align 8 + %45 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 17 + %46 = load double, double* %45, align 8 + %47 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 18 + %48 = load double, double* %47, align 8 + %49 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 19 + %50 = load double, double* %49, align 8 + %51 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 20 + %52 = load double, double* %51, align 8 + %53 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 21 + %54 = load double, double* %53, align 8 + %55 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 22 + %56 = load double, double* %55, align 8 + %57 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 23 + %58 = load double, double* %57, align 8 + %59 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 24 + %60 = load double, double* %59, align 8 + %61 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 25 + %62 = load double, double* %61, align 8 + %63 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 26 + %64 = load double, double* %63, align 8 + %65 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 27 + %66 = load double, double* %65, align 8 + %67 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 28 + %68 = load double, double* %67, align 8 + %69 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 29 + %70 = load double, double* %69, align 8 + %71 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 30 + %72 = load double, double* %71, align 8 + %73 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 31 + %74 = load double, double* %73, align 8 + %75 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 32 + %76 = load double, double* %75, align 8 + %77 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 33 + %78 = load double, double* %77, align 8 + %79 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 34 + %80 = load double, double* %79, align 8 + %81 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 35 + %82 = load double, double* %81, align 8 + %83 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 36 + %84 = load double, double* %83, align 8 + %85 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 37 + %86 = load double, double* %85, align 8 + %87 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 38 + %88 = load double, double* %87, align 8 + %89 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 39 + %90 = load double, double* %89, align 8 + %91 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 40 + %92 = load double, double* %91, align 8 + %93 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 41 + %94 = load double, double* %93, align 8 + %95 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 42 + %96 = load double, double* %95, align 8 + %97 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 43 + %98 = load double, double* %97, align 8 + %99 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 44 + %100 = load double, double* %99, align 8 + %101 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 45 + %102 = load double, double* %101, align 8 + %103 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 46 + %104 = load double, double* %103, align 8 + %105 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 47 + %106 = load double, double* %105, align 8 + %107 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 48 + %108 = load double, double* %107, align 8 + %109 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 49 + %110 = load double, double* %109, align 8 + %111 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 50 + %112 = load double, double* %111, align 8 + %113 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 51 + %114 = load double, double* %113, align 8 + %115 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 52 + %116 = load double, double* %115, align 8 + %117 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 53 + %118 = load double, double* %117, align 8 + %119 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 54 + %120 = load double, double* %119, align 8 + %121 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 55 + %122 = load double, double* %121, align 8 + %123 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 56 + %124 = load double, double* %123, align 8 + %125 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 57 + %126 = load double, double* %125, align 8 + %127 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 58 + %128 = load double, double* %127, align 8 + %129 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 59 + %130 = load double, double* %129, align 8 + %131 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 60 + %132 = load double, double* %131, align 8 + %133 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 61 + %134 = load double, double* %133, align 8 + %135 = getelementptr inbounds %struct.bw, %struct.bw* %8, i32 2, i32 1, i32 0, i32 0, i32 0, i32 62 + %136 = load double, double* %135, align 8 + %137 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 0 + store double %10, double* %137, align 8 + %138 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 0 + store double %12, double* %138, align 8 + %139 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 1 + store double %14, double* %139, align 8 + %140 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 2 + store double %16, double* %140, align 8 + %141 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 3 + store double %18, double* %141, align 8 + %142 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 4 + store double %20, double* %142, align 8 + %143 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 5 + store double %22, double* %143, align 8 + %144 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 6 + store double %24, double* %144, align 8 + %145 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 7 + store double %26, double* %145, align 8 + %146 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 8 + store double %28, double* %146, align 8 + %147 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 9 + store double %30, double* %147, align 8 + %148 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 10 + store double %32, double* %148, align 8 + %149 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 11 + store double %34, double* %149, align 8 + %150 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 12 + store double %36, double* %150, align 8 + %151 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 13 + store double %38, double* %151, align 8 + %152 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 14 + store double %40, double* %152, align 8 + %153 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 15 + store double %42, double* %153, align 8 + %154 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 16 + store double %44, double* %154, align 8 + %155 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 17 + store double %46, double* %155, align 8 + %156 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 18 + store double %48, double* %156, align 8 + %157 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 19 + store double %50, double* %157, align 8 + %158 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 20 + store double %52, double* %158, align 8 + %159 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 21 + store double %54, double* %159, align 8 + %160 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 22 + store double %56, double* %160, align 8 + %161 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 23 + store double %58, double* %161, align 8 + %162 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 24 + store double %60, double* %162, align 8 + %163 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 25 + store double %62, double* %163, align 8 + %164 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 26 + store double %64, double* %164, align 8 + %165 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 27 + store double %66, double* %165, align 8 + %166 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 28 + store double %68, double* %166, align 8 + %167 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 29 + store double %70, double* %167, align 8 + %168 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 30 + store double %72, double* %168, align 8 + %169 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 31 + store double %74, double* %169, align 8 + %170 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 32 + store double %76, double* %170, align 8 + %171 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 33 + store double %78, double* %171, align 8 + %172 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 34 + store double %80, double* %172, align 8 + %173 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 35 + store double %82, double* %173, align 8 + %174 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 36 + store double %84, double* %174, align 8 + %175 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 37 + store double %86, double* %175, align 8 + %176 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 38 + store double %88, double* %176, align 8 + %177 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 39 + store double %90, double* %177, align 8 + %178 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 40 + store double %92, double* %178, align 8 + %179 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 41 + store double %94, double* %179, align 8 + %180 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 42 + store double %96, double* %180, align 8 + %181 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 43 + store double %98, double* %181, align 8 + %182 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 44 + store double %100, double* %182, align 8 + %183 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 45 + store double %102, double* %183, align 8 + %184 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 46 + store double %104, double* %184, align 8 + %185 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 47 + store double %106, double* %185, align 8 + %186 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 48 + store double %108, double* %186, align 8 + %187 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 49 + store double %110, double* %187, align 8 + %188 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 50 + store double %112, double* %188, align 8 + %189 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 51 + store double %114, double* %189, align 8 + %190 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 52 + store double %116, double* %190, align 8 + %191 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 53 + store double %118, double* %191, align 8 + %192 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 54 + store double %120, double* %192, align 8 + %193 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 55 + store double %122, double* %193, align 8 + %194 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 56 + store double %124, double* %194, align 8 + %195 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 57 + store double %126, double* %195, align 8 + %196 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 58 + store double %128, double* %196, align 8 + %197 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 59 + store double %130, double* %197, align 8 + %198 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 60 + store double %132, double* %198, align 8 + %199 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 61 + store double %134, double* %199, align 8 + %200 = getelementptr inbounds %struct.ak, %struct.ak* %0, i32 0, i32 0, i32 0, i32 0, i32 undef, i32 1, i32 0, i32 0, i32 0, i32 62 + store double %136, double* %200, align 8 + call void @llvm.lifetime.end.p0i8(i64 520, i8* nonnull %5) + ret void + } + + declare %struct.ak* @_ZN2akI2bwEC1Ev(%struct.ak* returned) + + ; Function Attrs: argmemonly nounwind + declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) #0 + + declare %struct.bw* @_ZN2bwC1Ed(%struct.bw* returned, double) + + ; Function Attrs: argmemonly nounwind + declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) #0 + + ; Function Attrs: nounwind + declare void @llvm.stackprotector(i8*, i8**) #1 + + attributes #0 = { argmemonly nounwind } + attributes #1 = { nounwind } + + !0 = !{!1, !3} + !1 = distinct !{!1, !2, !"_ZNK1M2asEi: argument 0"} + !2 = distinct !{!2, !"_ZNK1M2asEi"} + !3 = distinct !{!3, !4, !"_ZNK1lI1ME3fooEi: argument 0"} + !4 = distinct !{!4, !"_ZNK1lI1ME3fooEi"} + +... +--- +#CHECK: _Z2brR1lI1ME +name: _Z2brR1lI1ME +alignment: 1 +tracksRegLiveness: true +liveins: + - { reg: '$r0' } + - { reg: '$r1' } +frameInfo: + stackSize: 856 + maxAlignment: 8 + adjustsStack: true + hasCalls: true + maxCallFrameSize: 0 + localFrameSize: 520 +stack: + - { id: 1, type: spill-slot, offset: -608, size: 8, alignment: 8, stack-id: 0 } + - { id: 2, type: spill-slot, offset: -616, size: 8, alignment: 8, stack-id: 0 } + - { id: 3, type: spill-slot, offset: -624, size: 8, alignment: 8, stack-id: 0 } + - { id: 4, type: spill-slot, offset: -632, size: 8, alignment: 8, stack-id: 0 } + - { id: 5, type: spill-slot, offset: -640, size: 8, alignment: 8, stack-id: 0 } + - { id: 6, type: spill-slot, offset: -648, size: 8, alignment: 8, stack-id: 0 } + - { id: 7, type: spill-slot, offset: -656, size: 8, alignment: 8, stack-id: 0 } + - { id: 8, type: spill-slot, offset: -664, size: 8, alignment: 8, stack-id: 0 } + - { id: 9, type: spill-slot, offset: -672, size: 8, alignment: 8, stack-id: 0 } + - { id: 10, type: spill-slot, offset: -680, size: 8, alignment: 8, stack-id: 0 } + - { id: 11, type: spill-slot, offset: -688, size: 8, alignment: 8, stack-id: 0 } + - { id: 12, type: spill-slot, offset: -696, size: 8, alignment: 8, stack-id: 0 } + - { id: 13, type: spill-slot, offset: -704, size: 8, alignment: 8, stack-id: 0 } + - { id: 14, type: spill-slot, offset: -712, size: 8, alignment: 8, stack-id: 0 } + - { id: 15, type: spill-slot, offset: -720, size: 8, alignment: 8, stack-id: 0 } + - { id: 16, type: spill-slot, offset: -728, size: 8, alignment: 8, stack-id: 0 } + - { id: 17, type: spill-slot, offset: -736, size: 8, alignment: 8, stack-id: 0 } + - { id: 18, type: spill-slot, offset: -744, size: 8, alignment: 8, stack-id: 0 } + - { id: 19, type: spill-slot, offset: -752, size: 8, alignment: 8, stack-id: 0 } + - { id: 20, type: spill-slot, offset: -760, size: 8, alignment: 8, stack-id: 0 } + - { id: 21, type: spill-slot, offset: -768, size: 8, alignment: 8, stack-id: 0 } + - { id: 22, type: spill-slot, offset: -776, size: 8, alignment: 8, stack-id: 0 } + - { id: 23, type: spill-slot, offset: -784, size: 8, alignment: 8, stack-id: 0 } + - { id: 24, type: spill-slot, offset: -792, size: 8, alignment: 8, stack-id: 0 } + - { id: 25, type: spill-slot, offset: -800, size: 8, alignment: 8, stack-id: 0 } + - { id: 26, type: spill-slot, offset: -808, size: 8, alignment: 8, stack-id: 0 } + - { id: 27, type: spill-slot, offset: -816, size: 8, alignment: 8, stack-id: 0 } + - { id: 28, type: spill-slot, offset: -824, size: 8, alignment: 8, stack-id: 0 } + - { id: 29, type: spill-slot, offset: -832, size: 8, alignment: 8, stack-id: 0 } + - { id: 30, type: spill-slot, offset: -840, size: 8, alignment: 8, stack-id: 0 } + - { id: 31, type: spill-slot, offset: -848, size: 8, alignment: 8, stack-id: 0 } + - { id: 32, type: spill-slot, offset: -856, size: 8, alignment: 8, stack-id: 0 } + - { id: 33, type: spill-slot, offset: -4, size: 4, alignment: 4, stack-id: 0, + callee-saved-register: '$lr', callee-saved-restored: false } + - { id: 34, type: spill-slot, offset: -8, size: 4, alignment: 4, stack-id: 0, + callee-saved-register: '$r7' } + - { id: 35, type: spill-slot, offset: -12, size: 4, alignment: 4, stack-id: 0, + callee-saved-register: '$r5' } + - { id: 36, type: spill-slot, offset: -16, size: 4, alignment: 4, stack-id: 0, + callee-saved-register: '$r4' } + - { id: 37, type: spill-slot, offset: -24, size: 8, alignment: 8, stack-id: 0, + callee-saved-register: '$d15' } + - { id: 38, type: spill-slot, offset: -32, size: 8, alignment: 8, stack-id: 0, + callee-saved-register: '$d14' } + - { id: 39, type: spill-slot, offset: -40, size: 8, alignment: 8, stack-id: 0, + callee-saved-register: '$d13' } + - { id: 40, type: spill-slot, offset: -48, size: 8, alignment: 8, stack-id: 0, + callee-saved-register: '$d12' } + - { id: 41, type: spill-slot, offset: -56, size: 8, alignment: 8, stack-id: 0, + callee-saved-register: '$d11' } + - { id: 42, type: spill-slot, offset: -64, size: 8, alignment: 8, stack-id: 0, + callee-saved-register: '$d10' } + - { id: 43, type: spill-slot, offset: -72, size: 8, alignment: 8, stack-id: 0, + callee-saved-register: '$d9' } + - { id: 44, type: spill-slot, offset: -80, size: 8, alignment: 8, stack-id: 0, + callee-saved-register: '$d8' } +# CHECK: VSTMDIA $r4, 14, $noreg, killed $d15, killed $d16, killed $d17, killed $d18, killed $d19, killed $d20, killed $d21, killed $d22, killed $d23, killed $d24, killed $d25, killed $d26, killed $d27, killed $d28, killed $d29, killed $d30 +# CHECK-NEXT: VSTRD killed renamable $d31, renamable $r4, 32, 14, $noreg :: (store 8 into %ir.153) +# CHECK: VSTMDIA killed $r0, 14, $noreg, killed $d4, killed $d5, killed $d6, killed $d7, killed $d8, killed $d9, killed $d10, killed $d11, killed $d12, killed $d13, killed $d14 +body: | + bb.0 (%ir-block.2): + liveins: $r0, $r1, $r4, $r5, $r7, $lr, $d8, $d9, $d10, $d11, $d12, $d13, $d14, $d15 + + $sp = frame-setup t2STMDB_UPD $sp, 14, $noreg, killed $r4, killed $r5, killed $r7, killed $lr + frame-setup CFI_INSTRUCTION def_cfa_offset 16 + frame-setup CFI_INSTRUCTION offset $lr, -4 + frame-setup CFI_INSTRUCTION offset $r7, -8 + frame-setup CFI_INSTRUCTION offset $r5, -12 + frame-setup CFI_INSTRUCTION offset $r4, -16 + $sp = frame-setup VSTMDDB_UPD $sp, 14, $noreg, killed $d8, killed $d9, killed $d10, killed $d11, killed $d12, killed $d13, killed $d14, killed $d15 + frame-setup CFI_INSTRUCTION def_cfa_offset 80 + frame-setup CFI_INSTRUCTION offset $d15, -24 + frame-setup CFI_INSTRUCTION offset $d14, -32 + frame-setup CFI_INSTRUCTION offset $d13, -40 + frame-setup CFI_INSTRUCTION offset $d12, -48 + frame-setup CFI_INSTRUCTION offset $d11, -56 + frame-setup CFI_INSTRUCTION offset $d10, -64 + frame-setup CFI_INSTRUCTION offset $d9, -72 + frame-setup CFI_INSTRUCTION offset $d8, -80 + $sp = frame-setup t2SUBri killed $sp, 776, 14, $noreg, $noreg + frame-setup CFI_INSTRUCTION def_cfa_offset 856 + $r5 = tMOVr $r1, 14, $noreg + $r4 = tMOVr $r0, 14, $noreg + tBL 14, $noreg, @_ZN2akI2bwEC1Ev, csr_aapcs_thisreturn, implicit-def dead $lr, implicit $sp, implicit $r0, implicit-def $sp + renamable $d16 = FCONSTD 0, 14, $noreg + renamable $r2, renamable $r3 = VMOVRRD killed renamable $d16, 14, $noreg + renamable $r0 = t2ADDri $sp, 256, 14, $noreg, $noreg + tBL 14, $noreg, @_ZN2bwC1Ed, csr_aapcs_thisreturn, implicit-def dead $lr, implicit $sp, implicit $r0, implicit $r2, implicit $r3, implicit-def $sp + renamable $r0 = t2LDRi12 killed renamable $r5, 0, 14, $noreg :: (load 4 from %ir.7) + renamable $r12 = t2ADDri renamable $r0, 1048, 14, $noreg, $noreg + renamable $lr = t2ADDri renamable $r0, 1064, 14, $noreg, $noreg + renamable $r3 = t2ADDri renamable $r0, 1080, 14, $noreg, $noreg + renamable $r5 = t2ADDri renamable $r0, 1096, 14, $noreg, $noreg + renamable $r1 = t2ADDri renamable $r0, 1112, 14, $noreg, $noreg + renamable $r2 = t2ADDri renamable $r0, 1544, 14, $noreg, $noreg + renamable $d16 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.135) + VSTRD killed renamable $d16, $sp, 62, 14, $noreg :: (store 8 into %stack.1) + renamable $r2 = t2ADDri renamable $r0, 1536, 14, $noreg, $noreg + renamable $d16 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.133) + VSTRD killed renamable $d16, $sp, 60, 14, $noreg :: (store 8 into %stack.2) + renamable $r2 = t2ADDri renamable $r0, 1528, 14, $noreg, $noreg + renamable $d16 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.131) + VSTRD killed renamable $d16, $sp, 58, 14, $noreg :: (store 8 into %stack.3) + renamable $r2 = t2ADDri renamable $r0, 1520, 14, $noreg, $noreg + renamable $d16 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.129) + VSTRD killed renamable $d16, $sp, 56, 14, $noreg :: (store 8 into %stack.4) + renamable $r2 = t2ADDri renamable $r0, 1512, 14, $noreg, $noreg + renamable $d16 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.127) + VSTRD killed renamable $d16, $sp, 54, 14, $noreg :: (store 8 into %stack.5) + renamable $r2 = t2ADDri renamable $r0, 1496, 14, $noreg, $noreg + renamable $d16 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.123) + VSTRD killed renamable $d16, $sp, 52, 14, $noreg :: (store 8 into %stack.6) + renamable $r2 = t2ADDri renamable $r0, 1504, 14, $noreg, $noreg + renamable $d16 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.125) + VSTRD killed renamable $d16, $sp, 50, 14, $noreg :: (store 8 into %stack.7) + renamable $r2 = t2ADDri renamable $r0, 1488, 14, $noreg, $noreg + renamable $d16 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.121) + VSTRD killed renamable $d16, $sp, 48, 14, $noreg :: (store 8 into %stack.8) + renamable $r2 = t2ADDri renamable $r0, 1480, 14, $noreg, $noreg + renamable $d16 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.119) + VSTRD killed renamable $d16, $sp, 46, 14, $noreg :: (store 8 into %stack.9) + renamable $r2 = t2ADDri renamable $r0, 1472, 14, $noreg, $noreg + renamable $d16 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.117) + VSTRD killed renamable $d16, $sp, 44, 14, $noreg :: (store 8 into %stack.10) + renamable $r2 = t2ADDri renamable $r0, 1464, 14, $noreg, $noreg + renamable $d16 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.115) + VSTRD killed renamable $d16, $sp, 42, 14, $noreg :: (store 8 into %stack.11) + renamable $r2 = t2ADDri renamable $r0, 1456, 14, $noreg, $noreg + renamable $d16 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.113) + VSTRD killed renamable $d16, $sp, 40, 14, $noreg :: (store 8 into %stack.12) + renamable $r2 = t2ADDri renamable $r0, 1448, 14, $noreg, $noreg + renamable $d16 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.111) + VSTRD killed renamable $d16, $sp, 38, 14, $noreg :: (store 8 into %stack.13) + renamable $r2 = t2ADDri renamable $r0, 1440, 14, $noreg, $noreg + renamable $d16 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.109) + VSTRD killed renamable $d16, $sp, 36, 14, $noreg :: (store 8 into %stack.14) + renamable $r2 = t2ADDri renamable $r0, 1432, 14, $noreg, $noreg + renamable $d16 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.107) + VSTRD killed renamable $d16, $sp, 34, 14, $noreg :: (store 8 into %stack.15) + renamable $r2 = t2ADDri renamable $r0, 1424, 14, $noreg, $noreg + renamable $d16 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.105) + VSTRD killed renamable $d16, $sp, 32, 14, $noreg :: (store 8 into %stack.16) + renamable $r2 = t2ADDri renamable $r0, 1416, 14, $noreg, $noreg + renamable $d16 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.103) + VSTRD killed renamable $d16, $sp, 30, 14, $noreg :: (store 8 into %stack.17) + renamable $r2 = t2ADDri renamable $r0, 1408, 14, $noreg, $noreg + renamable $d16 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.101) + VSTRD killed renamable $d16, $sp, 28, 14, $noreg :: (store 8 into %stack.18) + renamable $r2 = t2ADDri renamable $r0, 1400, 14, $noreg, $noreg + renamable $d16 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.99) + VSTRD killed renamable $d16, $sp, 26, 14, $noreg :: (store 8 into %stack.19) + renamable $r2 = t2ADDri renamable $r0, 1392, 14, $noreg, $noreg + renamable $d16 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.97) + VSTRD killed renamable $d16, $sp, 24, 14, $noreg :: (store 8 into %stack.20) + renamable $r2 = t2ADDri renamable $r0, 1384, 14, $noreg, $noreg + renamable $d16 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.95) + VSTRD killed renamable $d16, $sp, 22, 14, $noreg :: (store 8 into %stack.21) + renamable $r2 = t2ADDri renamable $r0, 1376, 14, $noreg, $noreg + renamable $d16 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.93) + VSTRD killed renamable $d16, $sp, 20, 14, $noreg :: (store 8 into %stack.22) + renamable $r2 = t2ADDri renamable $r0, 1368, 14, $noreg, $noreg + renamable $d16 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.91) + VSTRD killed renamable $d16, $sp, 18, 14, $noreg :: (store 8 into %stack.23) + renamable $r2 = t2ADDri renamable $r0, 1360, 14, $noreg, $noreg + renamable $d16 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.89) + VSTRD killed renamable $d16, $sp, 16, 14, $noreg :: (store 8 into %stack.24) + renamable $r2 = t2ADDri renamable $r0, 1344, 14, $noreg, $noreg + renamable $d16 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.85) + VSTRD killed renamable $d16, $sp, 14, 14, $noreg :: (store 8 into %stack.25) + renamable $r2 = t2ADDri renamable $r0, 1352, 14, $noreg, $noreg + renamable $d16 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.87) + VSTRD killed renamable $d16, $sp, 12, 14, $noreg :: (store 8 into %stack.26) + renamable $r2 = t2ADDri renamable $r0, 1336, 14, $noreg, $noreg + renamable $d16 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.83) + VSTRD killed renamable $d16, $sp, 10, 14, $noreg :: (store 8 into %stack.27) + renamable $r2 = t2ADDri renamable $r0, 1328, 14, $noreg, $noreg + renamable $d16 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.81) + VSTRD killed renamable $d16, $sp, 8, 14, $noreg :: (store 8 into %stack.28) + renamable $r2 = t2ADDri renamable $r0, 1320, 14, $noreg, $noreg + renamable $d16 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.79) + VSTRD killed renamable $d16, $sp, 6, 14, $noreg :: (store 8 into %stack.29) + renamable $r2 = t2ADDri renamable $r0, 1312, 14, $noreg, $noreg + renamable $d16 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.77) + VSTRD killed renamable $d16, $sp, 4, 14, $noreg :: (store 8 into %stack.30) + renamable $r2 = t2ADDri renamable $r0, 1304, 14, $noreg, $noreg + renamable $d16 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.75) + VSTRD killed renamable $d16, $sp, 2, 14, $noreg :: (store 8 into %stack.31) + renamable $r2 = t2ADDri renamable $r0, 1296, 14, $noreg, $noreg + renamable $d16 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.73) + VSTRD killed renamable $d16, $sp, 0, 14, $noreg :: (store 8 into %stack.32) + renamable $r2 = t2ADDri renamable $r0, 1288, 14, $noreg, $noreg + renamable $d14 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.71) + renamable $r2 = t2ADDri renamable $r0, 1280, 14, $noreg, $noreg + renamable $d13 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.69) + renamable $r2 = t2ADDri renamable $r0, 1272, 14, $noreg, $noreg + renamable $d12 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.67) + renamable $r2 = t2ADDri renamable $r0, 1264, 14, $noreg, $noreg + renamable $d11 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.65) + renamable $r2 = t2ADDri renamable $r0, 1256, 14, $noreg, $noreg + renamable $d10 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.63) + renamable $r2 = t2ADDri renamable $r0, 1248, 14, $noreg, $noreg + renamable $d9 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.61) + renamable $r2 = t2ADDri renamable $r0, 1240, 14, $noreg, $noreg + renamable $d8 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.59) + renamable $r2 = t2ADDri renamable $r0, 1232, 14, $noreg, $noreg + renamable $d7 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.57) + renamable $r2 = t2ADDri renamable $r0, 1224, 14, $noreg, $noreg + renamable $d6 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.55) + renamable $r2 = t2ADDri renamable $r0, 1216, 14, $noreg, $noreg + renamable $d5 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.53) + renamable $r2 = t2ADDri renamable $r0, 1208, 14, $noreg, $noreg + renamable $d4 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.51) + renamable $r2 = t2ADDri renamable $r0, 1192, 14, $noreg, $noreg + renamable $d3 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.47) + renamable $r2 = t2ADDri renamable $r0, 1200, 14, $noreg, $noreg + renamable $d2 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.49) + renamable $r2 = t2ADDri renamable $r0, 1184, 14, $noreg, $noreg + renamable $d1 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.45) + renamable $r2 = t2ADDri renamable $r0, 1176, 14, $noreg, $noreg + renamable $d0 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.43) + renamable $r2 = t2ADDri renamable $r0, 1168, 14, $noreg, $noreg + renamable $d31 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.41) + renamable $r2 = t2ADDri renamable $r0, 1160, 14, $noreg, $noreg + renamable $d30 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.39) + renamable $r2 = t2ADDri renamable $r0, 1152, 14, $noreg, $noreg + renamable $d29 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.37) + renamable $r2 = t2ADDri renamable $r0, 1144, 14, $noreg, $noreg + renamable $d28 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.35) + renamable $r2 = t2ADDri renamable $r0, 1136, 14, $noreg, $noreg + renamable $d27 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.33) + renamable $r2 = t2ADDri renamable $r0, 1128, 14, $noreg, $noreg + renamable $d26 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.31) + renamable $r2 = t2ADDri renamable $r0, 1120, 14, $noreg, $noreg + renamable $d25 = VLDRD killed renamable $r2, 0, 14, $noreg :: (load 8 from %ir.29) + renamable $d24 = VLDRD killed renamable $r1, 0, 14, $noreg :: (load 8 from %ir.27) + renamable $r1 = t2ADDri renamable $r0, 1104, 14, $noreg, $noreg + renamable $d23 = VLDRD killed renamable $r1, 0, 14, $noreg :: (load 8 from %ir.25) + renamable $d22 = VLDRD killed renamable $r5, 0, 14, $noreg :: (load 8 from %ir.23) + renamable $r1 = t2ADDri renamable $r0, 1088, 14, $noreg, $noreg + renamable $d21 = VLDRD killed renamable $r1, 0, 14, $noreg :: (load 8 from %ir.21) + renamable $d20 = VLDRD killed renamable $r3, 0, 14, $noreg :: (load 8 from %ir.19) + renamable $r1 = t2ADDri renamable $r0, 1072, 14, $noreg, $noreg + renamable $d19 = VLDRD killed renamable $r1, 0, 14, $noreg :: (load 8 from %ir.17) + renamable $d18 = VLDRD killed renamable $lr, 0, 14, $noreg :: (load 8 from %ir.15) + renamable $r1 = t2ADDri renamable $r0, 1056, 14, $noreg, $noreg + renamable $d17 = VLDRD killed renamable $r1, 0, 14, $noreg :: (load 8 from %ir.13) + renamable $d16 = VLDRD killed renamable $r12, 0, 14, $noreg :: (load 8 from %ir.11) + renamable $r0 = t2ADDri killed renamable $r0, 1040, 14, $noreg, $noreg + renamable $d15 = VLDRD killed renamable $r0, 0, 14, $noreg :: (load 8 from %ir.9) + VSTRD killed renamable $d15, renamable $r4, 0, 14, $noreg :: (store 8 into %ir.137) + VSTRD killed renamable $d16, renamable $r4, 2, 14, $noreg :: (store 8 into %ir.138) + VSTRD killed renamable $d17, renamable $r4, 4, 14, $noreg :: (store 8 into %ir.139) + VSTRD killed renamable $d18, renamable $r4, 6, 14, $noreg :: (store 8 into %ir.140) + VSTRD killed renamable $d19, renamable $r4, 8, 14, $noreg :: (store 8 into %ir.141) + VSTRD killed renamable $d20, renamable $r4, 10, 14, $noreg :: (store 8 into %ir.142) + VSTRD killed renamable $d21, renamable $r4, 12, 14, $noreg :: (store 8 into %ir.143) + VSTRD killed renamable $d22, renamable $r4, 14, 14, $noreg :: (store 8 into %ir.144) + VSTRD killed renamable $d23, renamable $r4, 16, 14, $noreg :: (store 8 into %ir.145) + VSTRD killed renamable $d24, renamable $r4, 18, 14, $noreg :: (store 8 into %ir.146) + VSTRD killed renamable $d25, renamable $r4, 20, 14, $noreg :: (store 8 into %ir.147) + VSTRD killed renamable $d26, renamable $r4, 22, 14, $noreg :: (store 8 into %ir.148) + VSTRD killed renamable $d27, renamable $r4, 24, 14, $noreg :: (store 8 into %ir.149) + VSTRD killed renamable $d28, renamable $r4, 26, 14, $noreg :: (store 8 into %ir.150) + VSTRD killed renamable $d29, renamable $r4, 28, 14, $noreg :: (store 8 into %ir.151) + VSTRD killed renamable $d30, renamable $r4, 30, 14, $noreg :: (store 8 into %ir.152) + VSTRD killed renamable $d31, renamable $r4, 32, 14, $noreg :: (store 8 into %ir.153) + VSTRD killed renamable $d0, renamable $r4, 34, 14, $noreg :: (store 8 into %ir.154) + VSTRD killed renamable $d1, renamable $r4, 36, 14, $noreg :: (store 8 into %ir.155) + VSTRD killed renamable $d3, renamable $r4, 38, 14, $noreg :: (store 8 into %ir.156) + VSTRD killed renamable $d2, renamable $r4, 40, 14, $noreg :: (store 8 into %ir.157) + VSTRD killed renamable $d4, renamable $r4, 42, 14, $noreg :: (store 8 into %ir.158) + VSTRD killed renamable $d5, renamable $r4, 44, 14, $noreg :: (store 8 into %ir.159) + VSTRD killed renamable $d6, renamable $r4, 46, 14, $noreg :: (store 8 into %ir.160) + VSTRD killed renamable $d7, renamable $r4, 48, 14, $noreg :: (store 8 into %ir.161) + VSTRD killed renamable $d8, renamable $r4, 50, 14, $noreg :: (store 8 into %ir.162) + VSTRD killed renamable $d9, renamable $r4, 52, 14, $noreg :: (store 8 into %ir.163) + VSTRD killed renamable $d10, renamable $r4, 54, 14, $noreg :: (store 8 into %ir.164) + VSTRD killed renamable $d11, renamable $r4, 56, 14, $noreg :: (store 8 into %ir.165) + VSTRD killed renamable $d12, renamable $r4, 58, 14, $noreg :: (store 8 into %ir.166) + VSTRD killed renamable $d13, renamable $r4, 60, 14, $noreg :: (store 8 into %ir.167) + VSTRD killed renamable $d14, renamable $r4, 62, 14, $noreg :: (store 8 into %ir.168) + renamable $d16 = VLDRD $sp, 0, 14, $noreg :: (load 8 from %stack.32) + VSTRD killed renamable $d16, renamable $r4, 64, 14, $noreg :: (store 8 into %ir.169) + renamable $d16 = VLDRD $sp, 2, 14, $noreg :: (load 8 from %stack.31) + VSTRD killed renamable $d16, renamable $r4, 66, 14, $noreg :: (store 8 into %ir.170) + renamable $d16 = VLDRD $sp, 4, 14, $noreg :: (load 8 from %stack.30) + VSTRD killed renamable $d16, renamable $r4, 68, 14, $noreg :: (store 8 into %ir.171) + renamable $d16 = VLDRD $sp, 6, 14, $noreg :: (load 8 from %stack.29) + VSTRD killed renamable $d16, renamable $r4, 70, 14, $noreg :: (store 8 into %ir.172) + renamable $d16 = VLDRD $sp, 8, 14, $noreg :: (load 8 from %stack.28) + VSTRD killed renamable $d16, renamable $r4, 72, 14, $noreg :: (store 8 into %ir.173) + renamable $d16 = VLDRD $sp, 10, 14, $noreg :: (load 8 from %stack.27) + VSTRD killed renamable $d16, renamable $r4, 74, 14, $noreg :: (store 8 into %ir.174) + renamable $d16 = VLDRD $sp, 14, 14, $noreg :: (load 8 from %stack.25) + VSTRD killed renamable $d16, renamable $r4, 76, 14, $noreg :: (store 8 into %ir.175) + renamable $d16 = VLDRD $sp, 12, 14, $noreg :: (load 8 from %stack.26) + VSTRD killed renamable $d16, renamable $r4, 78, 14, $noreg :: (store 8 into %ir.176) + renamable $d16 = VLDRD $sp, 16, 14, $noreg :: (load 8 from %stack.24) + VSTRD killed renamable $d16, renamable $r4, 80, 14, $noreg :: (store 8 into %ir.177) + renamable $d16 = VLDRD $sp, 18, 14, $noreg :: (load 8 from %stack.23) + VSTRD killed renamable $d16, renamable $r4, 82, 14, $noreg :: (store 8 into %ir.178) + renamable $d16 = VLDRD $sp, 20, 14, $noreg :: (load 8 from %stack.22) + VSTRD killed renamable $d16, renamable $r4, 84, 14, $noreg :: (store 8 into %ir.179) + renamable $d16 = VLDRD $sp, 22, 14, $noreg :: (load 8 from %stack.21) + VSTRD killed renamable $d16, renamable $r4, 86, 14, $noreg :: (store 8 into %ir.180) + renamable $d16 = VLDRD $sp, 24, 14, $noreg :: (load 8 from %stack.20) + VSTRD killed renamable $d16, renamable $r4, 88, 14, $noreg :: (store 8 into %ir.181) + renamable $d16 = VLDRD $sp, 26, 14, $noreg :: (load 8 from %stack.19) + VSTRD killed renamable $d16, renamable $r4, 90, 14, $noreg :: (store 8 into %ir.182) + renamable $d16 = VLDRD $sp, 28, 14, $noreg :: (load 8 from %stack.18) + VSTRD killed renamable $d16, renamable $r4, 92, 14, $noreg :: (store 8 into %ir.183) + renamable $d16 = VLDRD $sp, 30, 14, $noreg :: (load 8 from %stack.17) + VSTRD killed renamable $d16, renamable $r4, 94, 14, $noreg :: (store 8 into %ir.184) + renamable $d16 = VLDRD $sp, 32, 14, $noreg :: (load 8 from %stack.16) + VSTRD killed renamable $d16, renamable $r4, 96, 14, $noreg :: (store 8 into %ir.185) + renamable $d16 = VLDRD $sp, 34, 14, $noreg :: (load 8 from %stack.15) + VSTRD killed renamable $d16, renamable $r4, 98, 14, $noreg :: (store 8 into %ir.186) + renamable $d16 = VLDRD $sp, 36, 14, $noreg :: (load 8 from %stack.14) + VSTRD killed renamable $d16, renamable $r4, 100, 14, $noreg :: (store 8 into %ir.187) + renamable $d16 = VLDRD $sp, 38, 14, $noreg :: (load 8 from %stack.13) + VSTRD killed renamable $d16, renamable $r4, 102, 14, $noreg :: (store 8 into %ir.188) + renamable $d16 = VLDRD $sp, 40, 14, $noreg :: (load 8 from %stack.12) + VSTRD killed renamable $d16, renamable $r4, 104, 14, $noreg :: (store 8 into %ir.189) + renamable $d16 = VLDRD $sp, 42, 14, $noreg :: (load 8 from %stack.11) + VSTRD killed renamable $d16, renamable $r4, 106, 14, $noreg :: (store 8 into %ir.190) + renamable $d16 = VLDRD $sp, 44, 14, $noreg :: (load 8 from %stack.10) + VSTRD killed renamable $d16, renamable $r4, 108, 14, $noreg :: (store 8 into %ir.191) + renamable $d16 = VLDRD $sp, 46, 14, $noreg :: (load 8 from %stack.9) + VSTRD killed renamable $d16, renamable $r4, 110, 14, $noreg :: (store 8 into %ir.192) + renamable $d16 = VLDRD $sp, 48, 14, $noreg :: (load 8 from %stack.8) + VSTRD killed renamable $d16, renamable $r4, 112, 14, $noreg :: (store 8 into %ir.193) + renamable $d16 = VLDRD $sp, 52, 14, $noreg :: (load 8 from %stack.6) + VSTRD killed renamable $d16, renamable $r4, 114, 14, $noreg :: (store 8 into %ir.194) + renamable $d16 = VLDRD $sp, 50, 14, $noreg :: (load 8 from %stack.7) + VSTRD killed renamable $d16, renamable $r4, 116, 14, $noreg :: (store 8 into %ir.195) + renamable $d16 = VLDRD $sp, 54, 14, $noreg :: (load 8 from %stack.5) + VSTRD killed renamable $d16, renamable $r4, 118, 14, $noreg :: (store 8 into %ir.196) + renamable $d16 = VLDRD $sp, 56, 14, $noreg :: (load 8 from %stack.4) + VSTRD killed renamable $d16, renamable $r4, 120, 14, $noreg :: (store 8 into %ir.197) + renamable $d16 = VLDRD $sp, 58, 14, $noreg :: (load 8 from %stack.3) + VSTRD killed renamable $d16, renamable $r4, 122, 14, $noreg :: (store 8 into %ir.198) + renamable $d16 = VLDRD $sp, 60, 14, $noreg :: (load 8 from %stack.2) + VSTRD killed renamable $d16, renamable $r4, 124, 14, $noreg :: (store 8 into %ir.199) + renamable $d16 = VLDRD $sp, 62, 14, $noreg :: (load 8 from %stack.1) + VSTRD killed renamable $d16, killed renamable $r4, 126, 14, $noreg :: (store 8 into %ir.200) + $sp = t2ADDri killed $sp, 776, 14, $noreg, $noreg + $sp = VLDMDIA_UPD $sp, 14, $noreg, def $d8, def $d9, def $d10, def $d11, def $d12, def $d13, def $d14, def $d15 + $sp = t2LDMIA_RET $sp, 14, $noreg, def $r4, def $r5, def $r7, def $pc + +...