Index: llvm/trunk/lib/Target/X86/X86FastISel.cpp =================================================================== --- llvm/trunk/lib/Target/X86/X86FastISel.cpp +++ llvm/trunk/lib/Target/X86/X86FastISel.cpp @@ -3271,7 +3271,7 @@ X86AddressMode AM; if (!X86SelectAddress(C, AM)) return 0; - unsigned Opc = Subtarget->is64Bit() ? X86::LEA64r : X86::LEA32r; + unsigned Opc = TLI.getPointerTy() == MVT::i32 ? X86::LEA32r : X86::LEA64r; const TargetRegisterClass* RC = TLI.getRegClassFor(TLI.getPointerTy()); unsigned ResultReg = createResultReg(RC); addFullAddress(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, Index: llvm/trunk/test/CodeGen/X86/fast-isel-x32.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/fast-isel-x32.ll +++ llvm/trunk/test/CodeGen/X86/fast-isel-x32.ll @@ -0,0 +1,14 @@ +; RUN: llc < %s -mtriple=x86_64-linux-gnux32 -fast-isel -fast-isel-abort -regalloc=fast | FileCheck %s +; RUN: llc < %s -mtriple=x86_64-nacl -fast-isel -fast-isel-abort -regalloc=fast | FileCheck %s + +; Test that alloca addresses are materialized with the right size instruction. + +declare void @bar(i32* %arg) + +; CHECK-LABEL: @foo +define void @foo() { + %a = alloca i32 +; CHECK: leal {{.*}}, %edi + call void @bar(i32* %a) + ret void +} Index: llvm/trunk/test/CodeGen/X86/fast-isel-x86-64.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/fast-isel-x86-64.ll +++ llvm/trunk/test/CodeGen/X86/fast-isel-x86-64.ll @@ -302,3 +302,13 @@ } declare i8* @foo23() + +declare void @takesi32ptr(i32* %arg) + +; CHECK-LABEL: allocamaterialize +define void @allocamaterialize() { + %a = alloca i32 +; CHECK: leaq {{.*}}, %rdi + call void @takesi32ptr(i32* %a) + ret void +}