Index: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp =================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -10196,7 +10196,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: llvm/trunk/test/CodeGen/ARM/alloc-no-stack-realign.ll =================================================================== --- llvm/trunk/test/CodeGen/ARM/alloc-no-stack-realign.ll +++ llvm/trunk/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: llvm/trunk/test/CodeGen/ARM/dag-combine-ldst.ll =================================================================== --- llvm/trunk/test/CodeGen/ARM/dag-combine-ldst.ll +++ llvm/trunk/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 -check-prefix=CHECK_O0 +; RUN: llc < %s -mtriple=arm-eabi -mattr=+v4t -O1 | FileCheck %s -check-prefix=CHECK -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: llvm/trunk/test/CodeGen/SystemZ/swift-return.ll =================================================================== --- llvm/trunk/test/CodeGen/SystemZ/swift-return.ll +++ llvm/trunk/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: llvm/trunk/test/CodeGen/X86/inline-asm-tied.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/inline-asm-tied.ll +++ llvm/trunk/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] Index: llvm/trunk/test/CodeGen/X86/pr30430.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/pr30430.ll +++ llvm/trunk/test/CodeGen/X86/pr30430.ll @@ -46,6 +46,7 @@ ; CHECK-NEXT: vmovss {{.*#+}} xmm5 = mem[0],zero,zero,zero ; CHECK-NEXT: vmovss {{.*#+}} xmm6 = mem[0],zero,zero,zero ; CHECK-NEXT: vmovss {{.*#+}} xmm7 = mem[0],zero,zero,zero +; CHECK-NEXT: vmovss {{.*#+}} xmm8 = mem[0],zero,zero,zero ; CHECK-NEXT: vmovss {{.*#+}} xmm9 = mem[0],zero,zero,zero ; CHECK-NEXT: vmovss {{.*#+}} xmm10 = mem[0],zero,zero,zero ; CHECK-NEXT: vmovss {{.*#+}} xmm11 = mem[0],zero,zero,zero @@ -53,7 +54,6 @@ ; CHECK-NEXT: vmovss {{.*#+}} xmm13 = mem[0],zero,zero,zero ; CHECK-NEXT: vmovss {{.*#+}} xmm14 = mem[0],zero,zero,zero ; CHECK-NEXT: vmovss {{.*#+}} xmm15 = mem[0],zero,zero,zero -; CHECK-NEXT: vmovss %xmm8, {{[0-9]+}}(%rsp) ; CHECK-NEXT: vmovss %xmm0, {{[0-9]+}}(%rsp) ; CHECK-NEXT: vmovss %xmm1, {{[0-9]+}}(%rsp) ; CHECK-NEXT: vmovss %xmm2, {{[0-9]+}}(%rsp) @@ -62,6 +62,7 @@ ; CHECK-NEXT: vmovss %xmm5, {{[0-9]+}}(%rsp) ; CHECK-NEXT: vmovss %xmm6, {{[0-9]+}}(%rsp) ; CHECK-NEXT: vmovss %xmm7, {{[0-9]+}}(%rsp) +; CHECK-NEXT: vmovss %xmm8, {{[0-9]+}}(%rsp) ; CHECK-NEXT: vmovss %xmm9, {{[0-9]+}}(%rsp) ; CHECK-NEXT: vmovss %xmm10, {{[0-9]+}}(%rsp) ; CHECK-NEXT: vmovss %xmm11, {{[0-9]+}}(%rsp) @@ -94,7 +95,8 @@ ; CHECK-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero ; CHECK-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0] ; CHECK-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero -; CHECK-NEXT: vinsertps {{.*#+}} xmm1 = xmm15[0],xmm1[0],xmm15[2,3] +; CHECK-NEXT: vmovss {{.*#+}} xmm3 = mem[0],zero,zero,zero +; CHECK-NEXT: vinsertps {{.*#+}} xmm1 = xmm3[0],xmm1[0],xmm3[2,3] ; CHECK-NEXT: vmovss {{.*#+}} xmm3 = mem[0],zero,zero,zero ; CHECK-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm3[0],xmm1[3] ; CHECK-NEXT: vmovss {{.*#+}} xmm3 = mem[0],zero,zero,zero