From: Simon Dardis Date: Wed, 16 Nov 2016 11:29:07 +0000 (+0000) Subject: [mips] Fix unsigned/signed type error X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=684785870d2beef68f152c860d660cf09d6c1996;p=llvm [mips] Fix unsigned/signed type error MipsFastISel uses a a class to represent addresses with a signed member to represent the offset. MipsFastISel::emitStore, emitLoad and computeAddress all treated the offset as being positive. In cases where the offset was actually negative and a frame pointer was used, this would cause the constant synthesis routine to crash as it would generate an unexpected instruction sequence when frame indexes are replaced. Reviewers: vkalintiris Differential Revision: https://reviews.llvm.org/D26192 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@287099 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/Mips/MipsFastISel.cpp b/lib/Target/Mips/MipsFastISel.cpp index 895d0f7a607..cfce60cad51 100644 --- a/lib/Target/Mips/MipsFastISel.cpp +++ b/lib/Target/Mips/MipsFastISel.cpp @@ -438,7 +438,7 @@ bool MipsFastISel::computeAddress(const Value *Obj, Address &Addr) { } case Instruction::GetElementPtr: { Address SavedAddr = Addr; - uint64_t TmpOffset = Addr.getOffset(); + int64_t TmpOffset = Addr.getOffset(); // Iterate through the GEP folding the constants into offsets where // we can. gep_type_iterator GTI = gep_type_begin(U); @@ -756,7 +756,7 @@ bool MipsFastISel::emitLoad(MVT VT, unsigned &ResultReg, Address &Addr, if (Addr.isFIBase()) { unsigned FI = Addr.getFI(); unsigned Align = 4; - unsigned Offset = Addr.getOffset(); + int64_t Offset = Addr.getOffset(); MachineFrameInfo &MFI = MF->getFrameInfo(); MachineMemOperand *MMO = MF->getMachineMemOperand( MachinePointerInfo::getFixedStack(*MF, FI), MachineMemOperand::MOLoad, @@ -807,7 +807,7 @@ bool MipsFastISel::emitStore(MVT VT, unsigned SrcReg, Address &Addr, if (Addr.isFIBase()) { unsigned FI = Addr.getFI(); unsigned Align = 4; - unsigned Offset = Addr.getOffset(); + int64_t Offset = Addr.getOffset(); MachineFrameInfo &MFI = MF->getFrameInfo(); MachineMemOperand *MMO = MF->getMachineMemOperand( MachinePointerInfo::getFixedStack(*MF, FI), MachineMemOperand::MOStore, diff --git a/test/CodeGen/Mips/Fast-ISel/stackloadstore.ll b/test/CodeGen/Mips/Fast-ISel/stackloadstore.ll new file mode 100644 index 00000000000..421f8ff2dba --- /dev/null +++ b/test/CodeGen/Mips/Fast-ISel/stackloadstore.ll @@ -0,0 +1,18 @@ +; RUN: llc < %s -march=mipsel -mcpu=mips32 -fast-isel -disable-fp-elim -relocation-model=pic < %s + +; Test that negative array access don't crash constant synthesis when fast isel +; generates negative offsets. + +define i16 @test() { + %a = alloca [4 x i16], align 4 + %arrayidx = getelementptr inbounds [4 x i16], [4 x i16]* %a, i32 0, i32 -2 + %b = load i16, i16* %arrayidx, align 2 + ret i16 %b +} + +define void @test2() { + %a = alloca [4 x i16], align 4 + %arrayidx = getelementptr inbounds [4 x i16], [4 x i16]* %a, i32 0, i32 -2 + store i16 2, i16* %arrayidx, align 2 + ret void +}