From: Chris Lattner Date: Tue, 15 Sep 2009 18:27:02 +0000 (+0000) Subject: fix PR4984 by ensuring that fastisel adds properly sign extended GEP displacement X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=dffb6e5aee9607d78732824f00bf0f4a8a6fba9b;p=oota-llvm.git fix PR4984 by ensuring that fastisel adds properly sign extended GEP displacement values to machineinstrs. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@81886 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/X86/X86InstrBuilder.h b/lib/Target/X86/X86InstrBuilder.h index bbcc32c58c1..54c84e7880f 100644 --- a/lib/Target/X86/X86InstrBuilder.h +++ b/lib/Target/X86/X86InstrBuilder.h @@ -47,7 +47,7 @@ struct X86AddressMode { unsigned Scale; unsigned IndexReg; - unsigned Disp; + int Disp; GlobalValue *GV; unsigned GVOpFlags; diff --git a/test/CodeGen/X86/fast-isel-gep.ll b/test/CodeGen/X86/fast-isel-gep.ll index fb24f199682..5b8acecc3c1 100644 --- a/test/CodeGen/X86/fast-isel-gep.ll +++ b/test/CodeGen/X86/fast-isel-gep.ll @@ -1,10 +1,9 @@ ; RUN: llc < %s -march=x86-64 -O0 | FileCheck %s --check-prefix=X64 ; RUN: llc < %s -march=x86 -O0 | FileCheck %s --check-prefix=X32 -; PR3181 ; GEP indices are interpreted as signed integers, so they ; should be sign-extended to 64 bits on 64-bit targets. - +; PR3181 define i32 @test1(i32 %t3, i32* %t1) nounwind { %t9 = getelementptr i32* %t1, i32 %t3 ; [#uses=1] %t15 = load i32* %t9 ; [#uses=1] @@ -31,3 +30,24 @@ define i32 @test2(i64 %t3, i32* %t1) nounwind { ; X64: movl (%rsi,%rdi,4), %eax ; X64: ret } + + + +; PR4984 +define i8 @test3(i8* %start) nounwind { +entry: + %A = getelementptr i8* %start, i64 -2 ; [#uses=1] + %B = load i8* %A, align 1 ; [#uses=1] + ret i8 %B + + +; X32: test3: +; X32: movl 4(%esp), %eax +; X32: movb -2(%eax), %al +; X32: ret + +; X64: test3: +; X64: movb -2(%rdi), %al +; X64: ret + +}