Index: lib/Target/Mips/MipsFastISel.cpp =================================================================== --- lib/Target/Mips/MipsFastISel.cpp +++ lib/Target/Mips/MipsFastISel.cpp @@ -110,7 +110,7 @@ } MachineInstrBuilder EmitInstLoad(unsigned Opc, unsigned DstReg, - unsigned MemReg, int64_t MemOffset) { + unsigned MemReg, int64_t MemOffset) { return EmitInst(Opc, DstReg).addReg(MemReg).addImm(MemOffset); } @@ -353,15 +353,23 @@ return 0; EmitInst(Mips::LW, DestReg).addReg(MFI->getGlobalBaseReg()).addGlobalAddress( GV, 0, MipsII::MO_GOT); + if ((GV->hasInternalLinkage() || + (GV->hasLocalLinkage() && !isa(GV)))) { + unsigned TempReg = createResultReg(RC); + EmitInst(Mips::ADDiu, TempReg).addReg(DestReg).addGlobalAddress( + GV, 0, MipsII::MO_ABS_LO); + DestReg = TempReg; + } return DestReg; } + unsigned MipsFastISel::MaterializeInt(const Constant *C, MVT VT) { if (VT != MVT::i32 && VT != MVT::i16 && VT != MVT::i8 && VT != MVT::i1) return 0; const TargetRegisterClass *RC = &Mips::GPR32RegClass; const ConstantInt *CI = cast(C); int64_t Imm; - if (CI->isNegative()) + if ((VT != MVT::i1) && CI->isNegative()) Imm = CI->getSExtValue(); else Imm = CI->getZExtValue(); Index: test/CodeGen/Mips/Fast-ISel/loadstrconst.ll =================================================================== --- /dev/null +++ test/CodeGen/Mips/Fast-ISel/loadstrconst.ll @@ -0,0 +1,19 @@ +; RUN: llc -march=mipsel -relocation-model=pic -O0 -mips-fast-isel -fast-isel-abort -mcpu=mips32r2 \ +; RUN: < %s | FileCheck %s + +@.str = private unnamed_addr constant [6 x i8] c"hello\00", align 1 +@s = common global i8* null, align 4 + +; Function Attrs: nounwind +define void @foo() #0 { +entry: + store i8* getelementptr inbounds ([6 x i8]* @.str, i32 0, i32 0), i8** @s, align 4 + ret void +; CHECK: .ent foo +; CHECK: lw $[[REG1:[0-9]+]], %got($.str)(${{[0-9]+}}) +; CHECK: addiu ${{[0-9]+}}, $[[REG1]], %lo($.str) + +} + +attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +