Index: llvm/trunk/lib/Target/ARM/ARMLoadStoreOptimizer.cpp =================================================================== --- llvm/trunk/lib/Target/ARM/ARMLoadStoreOptimizer.cpp +++ llvm/trunk/lib/Target/ARM/ARMLoadStoreOptimizer.cpp @@ -2047,6 +2047,11 @@ INITIALIZE_PASS(ARMPreAllocLoadStoreOpt, "arm-prera-ldst-opt", ARM_PREALLOC_LOAD_STORE_OPT_NAME, false, false) +// Limit the number of instructions to be rescheduled. +// FIXME: tune this limit, and/or come up with some better heuristics. +static cl::opt InstReorderLimit("arm-prera-ldst-opt-reorder-limit", + cl::init(8), cl::Hidden); + bool ARMPreAllocLoadStoreOpt::runOnMachineFunction(MachineFunction &Fn) { if (AssumeMisalignedLoadStores || skipFunction(Fn.getFunction())) return false; @@ -2222,7 +2227,7 @@ } // Don't try to reschedule too many instructions. - if (NumMove == 8) // FIXME: Tune this limit. + if (NumMove == InstReorderLimit) break; // Found a mergable instruction; save information about it. Index: llvm/trunk/test/CodeGen/ARM/prera-ldst-insertpt.mir =================================================================== --- llvm/trunk/test/CodeGen/ARM/prera-ldst-insertpt.mir +++ llvm/trunk/test/CodeGen/ARM/prera-ldst-insertpt.mir @@ -1,4 +1,6 @@ # RUN: llc -run-pass arm-prera-ldst-opt %s -o - | FileCheck %s +# RUN: llc -run-pass arm-prera-ldst-opt -arm-prera-ldst-opt-reorder-limit=3 %s -o - | FileCheck %s +# RUN: llc -run-pass arm-prera-ldst-opt -arm-prera-ldst-opt-reorder-limit=2 %s -o - | FileCheck %s --check-prefix=CHECK-LIMIT --- | target triple = "thumbv7---eabi" @@ -79,12 +81,18 @@ ; Make sure we move the paired stores next to each other, and ; insert them in an appropriate location. - ; CHECK: t2STRi12 {{.*}}, 0 + ; CHECK: t2STRi12 {{.*}}, 0 ; CHECK-NEXT: t2STRi12 {{.*}}, 4 ; CHECK-NEXT: t2STRi12 {{.*}}, 8 ; CHECK-NEXT: t2MUL ; CHECK-NEXT: t2MOVi32imm + ; CHECK-LIMIT-LABEL: name: b + ; CHECK-LIMIT: t2STRi12 {{.*}}, 0 + ; CHECK-LIMIT-NEXT: t2STRi12 {{.*}}, 4 + ; CHECK-LIMIT-NEXT: t2MUL + ; CHECK-LIMIT-NEXT: t2STRi12 {{.*}}, 8 + %4 : rgpr = t2MUL %1, %1, 14, $noreg %5 : rgpr = t2MOVi32imm -858993459 %6 : rgpr, %7 : rgpr = t2UMULL killed %3, %5, 14, $noreg