Author: jfb Date: Thu Jul 25 09:11:57 2019 New Revision: 367032 URL: http://llvm.org/viewvc/llvm-project?rev=367032&view=rev Log: Allow prefetching from non-zero address spaces
Summary: This is useful for targets which have prefetch instructions for non-default address spaces. <rdar://problem/42662136> Subscribers: nemanjai, javed.absar, hiraditya, kbarton, jkorous, dexonsmith, cfe-commits, llvm-commits, RKSimon, hfinkel, t.p.northover, craig.topper, anemet Tags: #clang, #llvm Differential Revision: https://reviews.llvm.org/D65254 Added: cfe/trunk/test/CodeGen/prefetch-addr-spaces.c Modified: cfe/trunk/lib/CodeGen/CGBuiltin.cpp cfe/trunk/lib/Sema/SemaExpr.cpp cfe/trunk/test/CodeGen/arm_acle.c cfe/trunk/test/CodeGen/builtins-arm.c cfe/trunk/test/CodeGen/builtins-arm64.c cfe/trunk/test/CodeGen/ppc-xmmintrin.c cfe/trunk/test/CodeGen/pr9614.c cfe/trunk/test/CodeGen/prefetchw-builtins.c cfe/trunk/test/CodeGen/sse-builtins.c Modified: cfe/trunk/lib/CodeGen/CGBuiltin.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBuiltin.cpp?rev=367032&r1=367031&r2=367032&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGBuiltin.cpp (original) +++ cfe/trunk/lib/CodeGen/CGBuiltin.cpp Thu Jul 25 09:11:57 2019 @@ -2133,7 +2133,7 @@ RValue CodeGenFunction::EmitBuiltinExpr( Locality = (E->getNumArgs() > 2) ? EmitScalarExpr(E->getArg(2)) : llvm::ConstantInt::get(Int32Ty, 3); Value *Data = llvm::ConstantInt::get(Int32Ty, 1); - Function *F = CGM.getIntrinsic(Intrinsic::prefetch); + Function *F = CGM.getIntrinsic(Intrinsic::prefetch, Address->getType()); return RValue::get(Builder.CreateCall(F, {Address, RW, Locality, Data})); } case Builtin::BI__builtin_readcyclecounter: { @@ -6021,7 +6021,7 @@ Value *CodeGenFunction::EmitARMBuiltinEx // Locality is not supported on ARM target Value *Locality = llvm::ConstantInt::get(Int32Ty, 3); - Function *F = CGM.getIntrinsic(Intrinsic::prefetch); + Function *F = CGM.getIntrinsic(Intrinsic::prefetch, Address->getType()); return Builder.CreateCall(F, {Address, RW, Locality, IsData}); } @@ -6960,7 +6960,7 @@ Value *CodeGenFunction::EmitAArch64Built // FIXME: We need AArch64 specific LLVM intrinsic if we want to specify // PLDL3STRM or PLDL2STRM. - Function *F = CGM.getIntrinsic(Intrinsic::prefetch); + Function *F = CGM.getIntrinsic(Intrinsic::prefetch, Address->getType()); return Builder.CreateCall(F, {Address, RW, Locality, IsData}); } @@ -10037,7 +10037,7 @@ Value *CodeGenFunction::EmitX86BuiltinEx Value *RW = ConstantInt::get(Int32Ty, (C->getZExtValue() >> 2) & 0x1); Value *Locality = ConstantInt::get(Int32Ty, C->getZExtValue() & 0x3); Value *Data = ConstantInt::get(Int32Ty, 1); - Function *F = CGM.getIntrinsic(Intrinsic::prefetch); + Function *F = CGM.getIntrinsic(Intrinsic::prefetch, Address->getType()); return Builder.CreateCall(F, {Address, RW, Locality, Data}); } case X86::BI_mm_clflush: { Modified: cfe/trunk/lib/Sema/SemaExpr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=367032&r1=367031&r2=367032&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) +++ cfe/trunk/lib/Sema/SemaExpr.cpp Thu Jul 25 09:11:57 2019 @@ -5375,8 +5375,8 @@ static FunctionDecl *rewriteBuiltinFunct QualType DeclType = FDecl->getType(); const FunctionProtoType *FT = dyn_cast<FunctionProtoType>(DeclType); - if (!Context.BuiltinInfo.hasPtrArgsOrResult(FDecl->getBuiltinID()) || - !FT || FT->isVariadic() || ArgExprs.size() != FT->getNumParams()) + if (!Context.BuiltinInfo.hasPtrArgsOrResult(FDecl->getBuiltinID()) || !FT || + ArgExprs.size() < FT->getNumParams()) return nullptr; bool NeedsNewDecl = false; @@ -5415,6 +5415,7 @@ static FunctionDecl *rewriteBuiltinFunct return nullptr; FunctionProtoType::ExtProtoInfo EPI; + EPI.Variadic = FT->isVariadic(); QualType OverloadTy = Context.getFunctionType(FT->getReturnType(), OverloadParams, EPI); DeclContext *Parent = FDecl->getParent(); Modified: cfe/trunk/test/CodeGen/arm_acle.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/arm_acle.c?rev=367032&r1=367031&r2=367032&view=diff ============================================================================== --- cfe/trunk/test/CodeGen/arm_acle.c (original) +++ cfe/trunk/test/CodeGen/arm_acle.c Thu Jul 25 09:11:57 2019 @@ -88,28 +88,28 @@ void test_swp(uint32_t x, volatile void /* 8.6 Memory prefetch intrinsics */ /* 8.6.1 Data prefetch */ // ARM-LABEL: test_pld -// ARM: call void @llvm.prefetch(i8* null, i32 0, i32 3, i32 1) +// ARM: call void @llvm.prefetch.p0i8(i8* null, i32 0, i32 3, i32 1) void test_pld() { __pld(0); } // ARM-LABEL: test_pldx -// AArch32: call void @llvm.prefetch(i8* null, i32 1, i32 3, i32 1) -// AArch64: call void @llvm.prefetch(i8* null, i32 1, i32 1, i32 1) +// AArch32: call void @llvm.prefetch.p0i8(i8* null, i32 1, i32 3, i32 1) +// AArch64: call void @llvm.prefetch.p0i8(i8* null, i32 1, i32 1, i32 1) void test_pldx() { __pldx(1, 2, 0, 0); } /* 8.6.2 Instruction prefetch */ // ARM-LABEL: test_pli -// ARM: call void @llvm.prefetch(i8* null, i32 0, i32 3, i32 0) +// ARM: call void @llvm.prefetch.p0i8(i8* null, i32 0, i32 3, i32 0) void test_pli() { __pli(0); } // ARM-LABEL: test_plix -// AArch32: call void @llvm.prefetch(i8* null, i32 0, i32 3, i32 0) -// AArch64: call void @llvm.prefetch(i8* null, i32 0, i32 1, i32 0) +// AArch32: call void @llvm.prefetch.p0i8(i8* null, i32 0, i32 3, i32 0) +// AArch64: call void @llvm.prefetch.p0i8(i8* null, i32 0, i32 1, i32 0) void test_plix() { __plix(2, 0, 0); } Modified: cfe/trunk/test/CodeGen/builtins-arm.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/builtins-arm.c?rev=367032&r1=367031&r2=367032&view=diff ============================================================================== --- cfe/trunk/test/CodeGen/builtins-arm.c (original) +++ cfe/trunk/test/CodeGen/builtins-arm.c Thu Jul 25 09:11:57 2019 @@ -92,14 +92,13 @@ unsigned rbit(unsigned a) { void prefetch(int i) { __builtin_arm_prefetch(&i, 0, 1); -// CHECK: call {{.*}} @llvm.prefetch(i8* %{{.*}}, i32 0, i32 3, i32 1) + // CHECK: call {{.*}} @llvm.prefetch.p0i8(i8* %{{.*}}, i32 0, i32 3, i32 1) __builtin_arm_prefetch(&i, 1, 1); -// CHECK: call {{.*}} @llvm.prefetch(i8* %{{.*}}, i32 1, i32 3, i32 1) - + // CHECK: call {{.*}} @llvm.prefetch.p0i8(i8* %{{.*}}, i32 1, i32 3, i32 1) __builtin_arm_prefetch(&i, 1, 0); -// CHECK: call {{.*}} @llvm.prefetch(i8* %{{.*}}, i32 1, i32 3, i32 0) + // CHECK: call {{.*}} @llvm.prefetch.p0i8(i8* %{{.*}}, i32 1, i32 3, i32 0) } void ldc(const void *i) { Modified: cfe/trunk/test/CodeGen/builtins-arm64.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/builtins-arm64.c?rev=367032&r1=367031&r2=367032&view=diff ============================================================================== --- cfe/trunk/test/CodeGen/builtins-arm64.c (original) +++ cfe/trunk/test/CodeGen/builtins-arm64.c Thu Jul 25 09:11:57 2019 @@ -46,16 +46,16 @@ void barriers() { void prefetch() { __builtin_arm_prefetch(0, 1, 2, 0, 1); // pstl3keep -// CHECK: call {{.*}} @llvm.prefetch(i8* null, i32 1, i32 1, i32 1) + // CHECK: call {{.*}} @llvm.prefetch.p0i8(i8* null, i32 1, i32 1, i32 1) __builtin_arm_prefetch(0, 0, 0, 1, 1); // pldl1keep -// CHECK: call {{.*}} @llvm.prefetch(i8* null, i32 0, i32 0, i32 1) + // CHECK: call {{.*}} @llvm.prefetch.p0i8(i8* null, i32 0, i32 0, i32 1) __builtin_arm_prefetch(0, 0, 0, 1, 1); // pldl1strm -// CHECK: call {{.*}} @llvm.prefetch(i8* null, i32 0, i32 0, i32 1) + // CHECK: call {{.*}} @llvm.prefetch.p0i8(i8* null, i32 0, i32 0, i32 1) __builtin_arm_prefetch(0, 0, 0, 0, 0); // plil1keep -// CHECK: call {{.*}} @llvm.prefetch(i8* null, i32 0, i32 3, i32 0) + // CHECK: call {{.*}} @llvm.prefetch.p0i8(i8* null, i32 0, i32 3, i32 0) } int32_t jcvt(double v) { Modified: cfe/trunk/test/CodeGen/ppc-xmmintrin.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/ppc-xmmintrin.c?rev=367032&r1=367031&r2=367032&view=diff ============================================================================== --- cfe/trunk/test/CodeGen/ppc-xmmintrin.c (original) +++ cfe/trunk/test/CodeGen/ppc-xmmintrin.c Thu Jul 25 09:11:57 2019 @@ -1435,7 +1435,7 @@ test_prefetch() { // CHECK: store i8* {{[0-9a-zA-Z_%.]+}}, i8** {{[0-9a-zA-Z_%.]+}}, align 8 // CHECK-NEXT: store i32 {{[0-9a-zA-Z_%.]+}}, i32* {{[0-9a-zA-Z_%.]+}}, align 4 // CHECK-NEXT: [[REG715:[0-9a-zA-Z_%.]+]] = load i8*, i8** {{[0-9a-zA-Z_%.]+}}, align 8 -// CHECK-NEXT: call void @llvm.prefetch(i8* [[REG715]], i32 0, i32 3, i32 1) +// CHECK-NEXT: call void @llvm.prefetch.p0i8(i8* [[REG715]], i32 0, i32 3, i32 1) // CHECK-NEXT: ret void void __attribute__((noinline)) Modified: cfe/trunk/test/CodeGen/pr9614.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/pr9614.c?rev=367032&r1=367031&r2=367032&view=diff ============================================================================== --- cfe/trunk/test/CodeGen/pr9614.c (original) +++ cfe/trunk/test/CodeGen/pr9614.c Thu Jul 25 09:11:57 2019 @@ -34,7 +34,7 @@ void f(void) { // CHECK: call void @foo() // CHECK: call i32 @abs(i32 0) // CHECK: call i8* @strrchr( -// CHECK: call void @llvm.prefetch( +// CHECK: call void @llvm.prefetch.p0i8( // CHECK: call i8* @memchr( // CHECK: ret void @@ -42,4 +42,4 @@ void f(void) { // CHECK: declare i32 @abs(i32 // CHECK: declare i8* @strrchr(i8*, i32) // CHECK: declare i8* @memchr( -// CHECK: declare void @llvm.prefetch( +// CHECK: declare void @llvm.prefetch.p0i8( Added: cfe/trunk/test/CodeGen/prefetch-addr-spaces.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/prefetch-addr-spaces.c?rev=367032&view=auto ============================================================================== --- cfe/trunk/test/CodeGen/prefetch-addr-spaces.c (added) +++ cfe/trunk/test/CodeGen/prefetch-addr-spaces.c Thu Jul 25 09:11:57 2019 @@ -0,0 +1,6 @@ +// RUN: %clang_cc1 -triple x86_64-pc-linux -emit-llvm %s -o - | FileCheck %s + +void f(int __attribute__((address_space(1))) * a, ...) { + __builtin_prefetch(a, 0, 1); + // CHECK: call void @llvm.prefetch.p1i8(i8 addrspace(1)* {{%.+}}, i32 0, i32 1, i32 1) +} Modified: cfe/trunk/test/CodeGen/prefetchw-builtins.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/prefetchw-builtins.c?rev=367032&r1=367031&r2=367032&view=diff ============================================================================== --- cfe/trunk/test/CodeGen/prefetchw-builtins.c (original) +++ cfe/trunk/test/CodeGen/prefetchw-builtins.c Thu Jul 25 09:11:57 2019 @@ -5,12 +5,12 @@ void test_m_prefetch(void *p) { return _m_prefetch(p); -// CHECK-LABEL: define void @test_m_prefetch -// CHECK: call void @llvm.prefetch({{.*}}, i32 0, i32 3, i32 1) + // CHECK-LABEL: define void @test_m_prefetch + // CHECK: call void @llvm.prefetch.p0i8({{.*}}, i32 0, i32 3, i32 1) } void test_m_prefetch_w(void *p) { return _m_prefetchw(p); -// CHECK-LABEL: define void @test_m_prefetch_w -// CHECK: call void @llvm.prefetch({{.*}}, i32 1, i32 3, i32 1) + // CHECK-LABEL: define void @test_m_prefetch_w + // CHECK: call void @llvm.prefetch.p0i8({{.*}}, i32 1, i32 3, i32 1) } Modified: cfe/trunk/test/CodeGen/sse-builtins.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/sse-builtins.c?rev=367032&r1=367031&r2=367032&view=diff ============================================================================== --- cfe/trunk/test/CodeGen/sse-builtins.c (original) +++ cfe/trunk/test/CodeGen/sse-builtins.c Thu Jul 25 09:11:57 2019 @@ -503,7 +503,7 @@ __m128 test_mm_or_ps(__m128 A, __m128 B) void test_mm_prefetch(char const* p) { // CHECK-LABEL: test_mm_prefetch - // CHECK: call void @llvm.prefetch(i8* {{.*}}, i32 0, i32 0, i32 1) + // CHECK: call void @llvm.prefetch.p0i8(i8* {{.*}}, i32 0, i32 0, i32 1) _mm_prefetch(p, 0); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits