forked from OSchip/llvm-project
[DAGCombiner] Do not remove the load of stored values when optimizations are disabled
This combiner breaks debug experience and should not be run when optimizations are disabled. For example: int main() { int j = 0; j += 2; if (j == 2) return 0; return 5; } When debugging this code compiled in /O0, it should be valid to break at line "j+=2;" and edit the value of j. It should change the return value of the function. Differential Revision: https://reviews.llvm.org/D19268 llvm-svn: 284014
This commit is contained in:
parent
c215c3fd14
commit
081385a74e
|
@ -10196,7 +10196,8 @@ SDValue DAGCombiner::visitLOAD(SDNode *N) {
|
|||
// 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<StoreSDNode>(Chain);
|
||||
if (PrevST->getBasePtr() == Ptr &&
|
||||
|
|
|
@ -21,8 +21,9 @@ entry:
|
|||
; 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]
|
||||
|
|
|
@ -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
|
||||
}
|
|
@ -49,10 +49,9 @@ declare swiftcc { i16, i8 } @gen(i32)
|
|||
; 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)
|
||||
|
|
|
@ -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]
|
||||
|
||||
|
|
|
@ -46,6 +46,7 @@ define <16 x float> @makefloat(float %f1, float %f2, float %f3, float %f4, float
|
|||
; 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 @@ define <16 x float> @makefloat(float %f1, float %f2, float %f3, float %f4, float
|
|||
; 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 @@ define <16 x float> @makefloat(float %f1, float %f2, float %f3, float %f4, float
|
|||
; 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 @@ define <16 x float> @makefloat(float %f1, float %f2, float %f3, float %f4, float
|
|||
; 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
|
||||
|
|
Loading…
Reference in New Issue