summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/X86/fast-isel-gep.ll
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2011-01-14 00:01:01 +0000
committerChris Lattner <sabre@nondot.org>2011-01-14 00:01:01 +0000
commit0c34cb429ed90af168b1c2a8384401feb2e0085f (patch)
treeaa24bdb6242d5b2eeba7eb4abc054b224b2dbadd /llvm/test/CodeGen/X86/fast-isel-gep.ll
parent088b30aa48aa8951ddfc04a23499671198b132f6 (diff)
downloadbcm5719-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.ll17
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
+}
+
+
OpenPOWER on IntegriCloud