diff options
author | Chris Lattner <sabre@nondot.org> | 2011-01-14 00:01:01 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2011-01-14 00:01:01 +0000 |
commit | 0c34cb429ed90af168b1c2a8384401feb2e0085f (patch) | |
tree | aa24bdb6242d5b2eeba7eb4abc054b224b2dbadd /llvm/test/CodeGen/X86/fast-isel-gep.ll | |
parent | 088b30aa48aa8951ddfc04a23499671198b132f6 (diff) | |
download | bcm5719-llvm-0c34cb429ed90af168b1c2a8384401feb2e0085f.tar.gz bcm5719-llvm-0c34cb429ed90af168b1c2a8384401feb2e0085f.zip |
fix PR8961 - a fast isel miscompilation where we'd insert a new instruction
after sext's generated for addressing that got folded. Previously we compiled
test5 into:
_test5: ## @test5
## BB#0:
movq -8(%rsp), %rax ## 8-byte Reload
movq (%rdi,%rax), %rdi
addq %rdx, %rdi
movslq %esi, %rax
movq %rax, -8(%rsp) ## 8-byte Spill
movq %rdi, %rax
ret
which is insane and wrong. Now we produce:
_test5: ## @test5
## BB#0:
movslq %esi, %rax
movq (%rdi,%rax), %rax
addq %rdx, %rax
ret
llvm-svn: 123414
Diffstat (limited to 'llvm/test/CodeGen/X86/fast-isel-gep.ll')
-rw-r--r-- | llvm/test/CodeGen/X86/fast-isel-gep.ll | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/X86/fast-isel-gep.ll b/llvm/test/CodeGen/X86/fast-isel-gep.ll index 577dd7223a4..622a1ff831d 100644 --- a/llvm/test/CodeGen/X86/fast-isel-gep.ll +++ b/llvm/test/CodeGen/X86/fast-isel-gep.ll @@ -70,3 +70,20 @@ entry: ; X64: test4: ; X64: 128(%r{{.*}},%r{{.*}},8) } + +; PR8961 - Make sure the sext for the GEP addressing comes before the load that +; is folded. +define i64 @test5(i8* %A, i32 %I, i64 %B) nounwind { + %v8 = getelementptr i8* %A, i32 %I + %v9 = bitcast i8* %v8 to i64* + %v10 = load i64* %v9 + %v11 = add i64 %B, %v10 + ret i64 %v11 +; X64: test5: +; X64: movslq %esi, %rax +; X64-NEXT: movq (%rdi,%rax), %rax +; X64-NEXT: addq %rdx, %rax +; X64-NEXT: ret +} + + |