Index: lib/CodeGen/SelectionDAG/DAGCombiner.cpp =================================================================== --- lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -10168,7 +10168,8 @@ // value. // TODO: Handle store large -> read small portion. // TODO: Handle TRUNCSTORE/LOADEXT - if (ISD::isNormalLoad(N) && !LD->isVolatile()) { + if (OptLevel != CodeGenOpt::None && + ISD::isNormalLoad(N) && !LD->isVolatile()) { if (ISD::isNON_TRUNCStore(Chain.getNode())) { StoreSDNode *PrevST = cast(Chain); if (PrevST->getBasePtr() == Ptr && Index: test/CodeGen/ARM/alloc-no-stack-realign.ll =================================================================== --- test/CodeGen/ARM/alloc-no-stack-realign.ll +++ test/CodeGen/ARM/alloc-no-stack-realign.ll @@ -21,8 +21,9 @@ ; NO-REALIGN: vst1.64 {{{d[0-9]+, d[0-9]+}}}, [r[[R2]]:128] ; NO-REALIGN: add r[[R2:[0-9]+]], r[[R1]], #32 ; NO-REALIGN: vst1.64 {{{d[0-9]+, d[0-9]+}}}, [r[[R2]]:128] -; NO-REALIGN: vst1.32 {{{d[0-9]+, d[0-9]+}}}, [r[[R1]]:128]! -; NO-REALIGN: vst1.64 {{{d[0-9]+, d[0-9]+}}}, [r[[R1]]:128] +; NO-REALIGN: mov r[[R3:[0-9]+]], r[[R1]] +; NO-REALIGN: vst1.32 {{{d[0-9]+, d[0-9]+}}}, [r[[R3]]:128]! +; NO-REALIGN: vst1.64 {{{d[0-9]+, d[0-9]+}}}, [r[[R3]]:128] ; NO-REALIGN: add r[[R2:[0-9]+]], r[[R0:0]], #48 ; NO-REALIGN: vst1.64 {{{d[0-9]+, d[0-9]+}}}, [r[[R2]]:128] Index: test/CodeGen/ARM/dag-combine-ldst.ll =================================================================== --- test/CodeGen/ARM/dag-combine-ldst.ll +++ test/CodeGen/ARM/dag-combine-ldst.ll @@ -0,0 +1,41 @@ +; RUN: llc < %s -mtriple=arm-eabi -mattr=+v4t -O0 | FileCheck %s -check-prefix=CHECK_O0 +; RUN: llc < %s -mtriple=arm-eabi -mattr=+v4t -O1 | FileCheck %s -check-prefix=CHECK_O1 + +; In /O0, the addition must not be eliminated. This happens when the load +; and store are folded by the DAGCombiner. In /O1 and above, the optimization +; must be executed. + +; CHECK-LABEL: {{^}}main +; CHECK: mov [[TMP:r[0-9]+]], #0 +; CHECK-NEXT: str [[TMP]], [sp, #4] +; CHECK-NEXT: str [[TMP]], [sp] +; CHECK_O0: ldr [[TMP:r[0-9]+]], [sp] +; CHECK_O0-NEXT: add [[TMP]], [[TMP]], #2 +; CHECK_O1-NOT: ldr [[TMP:r[0-9]+]], [sp] +; CHECK_O1-NOT: add [[TMP]], [[TMP]], #2 + +define i32 @main() { +bb: + %tmp = alloca i32, align 4 + %tmp1 = alloca i32, align 4 + store i32 0, i32* %tmp, align 4 + store i32 0, i32* %tmp1, align 4 + %tmp2 = load i32, i32* %tmp1, align 4 + %tmp3 = add nsw i32 %tmp2, 2 + store i32 %tmp3, i32* %tmp1, align 4 + %tmp4 = load i32, i32* %tmp1, align 4 + %tmp5 = icmp eq i32 %tmp4, 2 + br i1 %tmp5, label %bb6, label %bb7 + +bb6: ; preds = %bb + store i32 0, i32* %tmp, align 4 + br label %bb8 + +bb7: ; preds = %bb + store i32 5, i32* %tmp, align 4 + br label %bb8 + +bb8: ; preds = %bb7, %bb6 + %tmp9 = load i32, i32* %tmp, align 4 + ret i32 %tmp9 +} Index: test/CodeGen/SystemZ/swift-return.ll =================================================================== --- test/CodeGen/SystemZ/swift-return.ll +++ test/CodeGen/SystemZ/swift-return.ll @@ -49,10 +49,9 @@ ; CHECK: a %r2, 172(%r15) ; CHECK: a %r2, 176(%r15) ; CHECK-O0-LABEL: test2: -; CHECK-O0: la %[[REG1:r[0-9]+]], 168(%r15) ; CHECK-O0: st %r2, [[SPILL1:[0-9]+]](%r15) -; CHECK-O0: lgr %r2, %[[REG1]] ; CHECK-O0: l %r3, [[SPILL1]](%r15) +; CHECK-O0: la %r2, 168(%r15) ; CHECK-O0: brasl %r14, gen2 ; CHECK-O0-DAG: l %r{{.*}}, 184(%r15) ; CHECK-O0-DAG: l %r{{.*}}, 180(%r15) Index: test/CodeGen/X86/inline-asm-tied.ll =================================================================== --- test/CodeGen/X86/inline-asm-tied.ll +++ test/CodeGen/X86/inline-asm-tied.ll @@ -1,8 +1,9 @@ ; RUN: llc < %s -mtriple=i386-apple-darwin9 -O0 -optimize-regalloc -regalloc=basic -no-integrated-as | FileCheck %s ; rdar://6992609 -; CHECK: movl [[EDX:%e..]], 4(%esp) -; CHECK: movl [[EDX]], 4(%esp) +; CHECK: movl %ecx, 4([[ESP:%e..]]) +; CHECK: movl 4([[ESP]]), [[EDX:%e..]] +; CHECK: movl [[EDX]], 4([[ESP]]) target triple = "i386-apple-darwin9.0" @llvm.used = appending global [1 x i8*] [i8* bitcast (i64 (i64)* @_OSSwapInt64 to i8*)], section "llvm.metadata" ; <[1 x i8*]*> [#uses=0]