From 8e7aea026a2b54464c88d9ae4c249ffbb0cad03c Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 13 May 2004 15:26:48 +0000 Subject: Two more improvements for null pointer handling: storing a null pointer and passing a null pointer into a function. For this testcase: void %test(int** %X) { store int* null, int** %X call void %test(int** null) ret void } we now generate this: test: sub %ESP, 12 mov %EAX, DWORD PTR [%ESP + 16] mov DWORD PTR [%EAX], 0 mov DWORD PTR [%ESP], 0 call test add %ESP, 12 ret instead of this: test: sub %ESP, 12 mov %EAX, DWORD PTR [%ESP + 16] mov %ECX, 0 mov DWORD PTR [%EAX], %ECX mov %EAX, 0 mov DWORD PTR [%ESP], %EAX call test add %ESP, 12 ret llvm-svn: 13558 --- llvm/lib/Target/X86/InstSelectSimple.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'llvm/lib/Target/X86/InstSelectSimple.cpp') diff --git a/llvm/lib/Target/X86/InstSelectSimple.cpp b/llvm/lib/Target/X86/InstSelectSimple.cpp index 9306b2c3e0b..e0e641e1ac9 100644 --- a/llvm/lib/Target/X86/InstSelectSimple.cpp +++ b/llvm/lib/Target/X86/InstSelectSimple.cpp @@ -1500,6 +1500,9 @@ void ISel::doCall(const ValueRecord &Ret, MachineInstr *CallMI, unsigned Val = cast(Args[i].Val)->getRawValue(); addRegOffset(BuildMI(BB, X86::MOV32mi, 5), X86::ESP, ArgOffset).addImm(Val); + } else if (Args[i].Val && isa(Args[i].Val)) { + addRegOffset(BuildMI(BB, X86::MOV32mi, 5), + X86::ESP, ArgOffset).addImm(0); } else { ArgReg = Args[i].Val ? getReg(Args[i].Val) : Args[i].Reg; addRegOffset(BuildMI(BB, X86::MOV32mr, 5), @@ -2984,13 +2987,19 @@ void ISel::visitStoreInst(StoreInst &I) { X86::MOV8mi, X86::MOV16mi, X86::MOV32mi }; unsigned Opcode = Opcodes[Class]; - if (AllocaFrameIdx != ~0U) { + if (AllocaFrameIdx != ~0U) addFrameReference(BuildMI(BB, Opcode, 5), AllocaFrameIdx).addImm(Val); - } else { + else addFullAddress(BuildMI(BB, Opcode, 5), BaseReg, Scale, IndexReg, Disp).addImm(Val); - } } + } else if (isa(I.getOperand(0))) { + if (AllocaFrameIdx != ~0U) + addFrameReference(BuildMI(BB, X86::MOV32mi, 5), AllocaFrameIdx).addImm(0); + else + addFullAddress(BuildMI(BB, X86::MOV32mi, 5), + BaseReg, Scale, IndexReg, Disp).addImm(0); + } else if (ConstantBool *CB = dyn_cast(I.getOperand(0))) { if (AllocaFrameIdx != ~0U) addFrameReference(BuildMI(BB, X86::MOV8mi, 5), -- cgit v1.2.3