diff options
author | Chris Lattner <sabre@nondot.org> | 2011-04-22 21:59:37 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2011-04-22 21:59:37 +0000 |
commit | b686af053e6544191420978f6a3adc7e74ab0192 (patch) | |
tree | 7c76d9e2e5856a04e8f4002e6ec0613eae766c05 /test | |
parent | 597fa65373b824c840212cf238a73ae13dc35494 (diff) | |
download | external_llvm-b686af053e6544191420978f6a3adc7e74ab0192.zip external_llvm-b686af053e6544191420978f6a3adc7e74ab0192.tar.gz external_llvm-b686af053e6544191420978f6a3adc7e74ab0192.tar.bz2 |
Recommit the fix for rdar://9289512 with a couple tweaks to
fix bugs exposed by the gcc dejagnu testsuite:
1. The load may actually be used by a dead instruction, which
would cause an assert.
2. The load may not be used by the current chain of instructions,
and we could move it past a side-effecting instruction. Change
how we process uses to define the problem away.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@130018 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r-- | test/CodeGen/X86/fast-isel-x86-64.ll | 47 | ||||
-rw-r--r-- | test/CodeGen/X86/fast-isel.ll | 10 |
2 files changed, 57 insertions, 0 deletions
diff --git a/test/CodeGen/X86/fast-isel-x86-64.ll b/test/CodeGen/X86/fast-isel-x86-64.ll index 5762ef3..d45a54f 100644 --- a/test/CodeGen/X86/fast-isel-x86-64.ll +++ b/test/CodeGen/X86/fast-isel-x86-64.ll @@ -14,6 +14,28 @@ define i32 @test1(i32 %i) nounwind ssp { ; CHECK: andl $8, +; rdar://9289512 - The load should fold into the compare. +define void @test2(i64 %x) nounwind ssp { +entry: + %x.addr = alloca i64, align 8 + store i64 %x, i64* %x.addr, align 8 + %tmp = load i64* %x.addr, align 8 + %cmp = icmp sgt i64 %tmp, 42 + br i1 %cmp, label %if.then, label %if.end + +if.then: ; preds = %entry + br label %if.end + +if.end: ; preds = %if.then, %entry + ret void +; CHECK: test2: +; CHECK: movq %rdi, -8(%rsp) +; CHECK: cmpq $42, -8(%rsp) +} + + + + @G = external global i32 define i64 @test3() nounwind { %A = ptrtoint i32* @G to i64 @@ -178,3 +200,28 @@ block2: call void (...)* @test16callee(double 1.000000e+00) ret void } + + +declare void @foo() unnamed_addr ssp align 2 + +; Verify that we don't fold the load into the compare here. That would move it +; w.r.t. the call. +define i32 @test17(i32 *%P) ssp nounwind { +entry: + %tmp = load i32* %P + %cmp = icmp ne i32 %tmp, 5 + call void @foo() + br i1 %cmp, label %if.then, label %if.else + +if.then: ; preds = %entry + ret i32 1 + +if.else: ; preds = %entry + ret i32 2 +; CHECK: test17: +; CHECK: movl (%rdi), %eax +; CHECK: callq _foo +; CHECK: cmpl $5, %eax +; CHECK-NEXT: je +} + diff --git a/test/CodeGen/X86/fast-isel.ll b/test/CodeGen/X86/fast-isel.ll index 177c06b..a978aa7 100644 --- a/test/CodeGen/X86/fast-isel.ll +++ b/test/CodeGen/X86/fast-isel.ll @@ -92,3 +92,13 @@ define void @load_store_i1(i1* %p, i1* %q) nounwind { store i1 %t, i1* %q ret void } + + +@crash_test1x = external global <2 x i32>, align 8 + +define void @crash_test1() nounwind ssp { + %tmp = load <2 x i32>* @crash_test1x, align 8 + %neg = xor <2 x i32> %tmp, <i32 -1, i32 -1> + ret void +} + |