diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -4002,7 +4002,8 @@ // (If function is requested for a definition, we always need to create a new // function, not just return a bitcast.) if (!IsForDefinition) - return llvm::ConstantExpr::getBitCast(Entry, Ty->getPointerTo()); + return llvm::ConstantExpr::getBitCast( + Entry, Ty->getPointerTo(Entry->getAddressSpace())); } // This function doesn't have a complete type (for example, the return diff --git a/clang/test/CodeGen/avr/alias-avr.c b/clang/test/CodeGen/avr/alias-avr.c --- a/clang/test/CodeGen/avr/alias-avr.c +++ b/clang/test/CodeGen/avr/alias-avr.c @@ -6,3 +6,8 @@ // CHECK: @multiply ={{.*}} alias i16 (i16, i16), ptr addrspace(1) @mul int multiply(int x, int y) __attribute__((alias("mul"))); + +// Make sure the correct address space is used when creating an alias that needs +// a pointer cast. +// CHECK: @smallmul = alias i8 (i16, i16), ptr addrspace(1) @mul +char smallmul(int a, int b) __attribute__((alias("mul")));