From 0e71c6d5caf297cf13d968fbe2c89f7528f56ab3 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Mon, 14 May 2018 00:06:49 +0000 Subject: [PATCH] [X86] Remove and autoupgrade the cvtusi2sd intrinsic. Use uitofp+insertelement instead. llvm-svn: 332206 --- llvm/include/llvm/IR/IntrinsicsX86.td | 3 --- llvm/lib/IR/AutoUpgrade.cpp | 5 +++++ llvm/lib/Target/X86/X86InstrAVX512.td | 7 ------- llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp | 1 - llvm/test/CodeGen/X86/avx512-intrinsics-upgrade.ll | 11 +++++++++++ llvm/test/CodeGen/X86/avx512-intrinsics.ll | 11 ----------- 6 files changed, 16 insertions(+), 22 deletions(-) diff --git a/llvm/include/llvm/IR/IntrinsicsX86.td b/llvm/include/llvm/IR/IntrinsicsX86.td index aa8df70..8be8aed 100644 --- a/llvm/include/llvm/IR/IntrinsicsX86.td +++ b/llvm/include/llvm/IR/IntrinsicsX86.td @@ -3611,9 +3611,6 @@ let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.". Intrinsic<[llvm_i32_ty], [llvm_v2f64_ty, llvm_i32_ty], [IntrNoMem]>; def int_x86_avx512_cvttsd2usi64 : GCCBuiltin<"__builtin_ia32_vcvttsd2usi64">, Intrinsic<[llvm_i64_ty], [llvm_v2f64_ty, llvm_i32_ty], [IntrNoMem]>; - def int_x86_avx512_cvtusi2sd : GCCBuiltin<"__builtin_ia32_cvtusi2sd32">, - Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, - llvm_i32_ty], [IntrNoMem]>; def int_x86_avx512_cvtusi642sd : GCCBuiltin<"__builtin_ia32_cvtusi2sd64">, Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_i64_ty, llvm_i32_ty], [IntrNoMem]>; diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp index 0a3ecae..43ed98f 100644 --- a/llvm/lib/IR/AutoUpgrade.cpp +++ b/llvm/lib/IR/AutoUpgrade.cpp @@ -181,6 +181,7 @@ static bool ShouldUpgradeX86Intrinsic(Function *F, StringRef Name) { Name == "avx512.mask.cvttps2dq.256" || // Added in 7.0 Name == "avx512.mask.cvtps2pd.128" || // Added in 7.0 Name == "avx512.mask.cvtps2pd.256" || // Added in 7.0 + Name == "avx512.cvtusi2sd" || // Added in 7.0 Name == "avx512.mask.permvar.sf.256" || // Added in 7.0 Name == "avx512.mask.permvar.si.256" || // Added in 7.0 Name == "sse2.pmulu.dq" || // Added in 7.0 @@ -1566,6 +1567,10 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { Rep = Builder.CreateSIToFP(CI->getArgOperand(1), CI->getType()->getVectorElementType()); Rep = Builder.CreateInsertElement(CI->getArgOperand(0), Rep, (uint64_t)0); + } else if (IsX86 && Name == "avx512.cvtusi2sd") { + Rep = Builder.CreateUIToFP(CI->getArgOperand(1), + CI->getType()->getVectorElementType()); + Rep = Builder.CreateInsertElement(CI->getArgOperand(0), Rep, (uint64_t)0); } else if (IsX86 && Name == "sse2.cvtss2sd") { Rep = Builder.CreateExtractElement(CI->getArgOperand(1), (uint64_t)0); Rep = Builder.CreateFPExt(Rep, CI->getType()->getVectorElementType()); diff --git a/llvm/lib/Target/X86/X86InstrAVX512.td b/llvm/lib/Target/X86/X86InstrAVX512.td index 050c2e4..48c1913 100644 --- a/llvm/lib/Target/X86/X86InstrAVX512.td +++ b/llvm/lib/Target/X86/X86InstrAVX512.td @@ -6921,13 +6921,6 @@ let Predicates = [HasAVX512] in { (VCVTSD2SI64Zrm_Int sse_load_f64:$src)>; } // HasAVX512 -let Predicates = [HasAVX512] in { - def : Pat<(int_x86_avx512_cvtusi2sd VR128X:$src1, GR32:$src2), - (VCVTUSI2SDZrr_Int VR128X:$src1, GR32:$src2)>; - def : Pat<(int_x86_avx512_cvtusi2sd VR128X:$src1, (loadi32 addr:$src2)), - (VCVTUSI2SDZrm_Int VR128X:$src1, addr:$src2)>; -} // Predicates = [HasAVX512] - // Patterns used for matching vcvtsi2s{s,d} intrinsic sequences from clang // which produce unnecessary vmovs{s,d} instructions let Predicates = [HasAVX512] in { diff --git a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp index 5c1e263..e18ea71 100644 --- a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp @@ -2556,7 +2556,6 @@ struct MemorySanitizerVisitor : public InstVisitor { case Intrinsic::x86_avx512_cvttss2usi: case Intrinsic::x86_avx512_cvttsd2usi64: case Intrinsic::x86_avx512_cvttsd2usi: - case Intrinsic::x86_avx512_cvtusi2sd: case Intrinsic::x86_avx512_cvtusi2ss: case Intrinsic::x86_avx512_cvtusi642sd: case Intrinsic::x86_avx512_cvtusi642ss: diff --git a/llvm/test/CodeGen/X86/avx512-intrinsics-upgrade.ll b/llvm/test/CodeGen/X86/avx512-intrinsics-upgrade.ll index 3d7cfac..eed3078 100644 --- a/llvm/test/CodeGen/X86/avx512-intrinsics-upgrade.ll +++ b/llvm/test/CodeGen/X86/avx512-intrinsics-upgrade.ll @@ -4120,3 +4120,14 @@ define <8 x i64> @test_mul_epu32_rmbkz(<16 x i32> %a, i64* %ptr_b, i8 %mask) { } declare <8 x i64> @llvm.x86.avx512.pmulu.dq.512(<16 x i32>, <16 x i32>) + +define <2 x double> @test_x86_avx512_mm_cvtu32_sd(<2 x double> %a, i32 %b) +; CHECK-LABEL: test_x86_avx512_mm_cvtu32_sd: +; CHECK: ## %bb.0: +; CHECK-NEXT: vcvtusi2sdl %edi, %xmm0, %xmm0 +; CHECK-NEXT: retq +{ + %res = call <2 x double> @llvm.x86.avx512.cvtusi2sd(<2 x double> %a, i32 %b) ; <<<2 x double>> [#uses=1] + ret <2 x double> %res +} +declare <2 x double> @llvm.x86.avx512.cvtusi2sd(<2 x double>, i32) nounwind readnone diff --git a/llvm/test/CodeGen/X86/avx512-intrinsics.ll b/llvm/test/CodeGen/X86/avx512-intrinsics.ll index 1e9ba6c..e91f732 100644 --- a/llvm/test/CodeGen/X86/avx512-intrinsics.ll +++ b/llvm/test/CodeGen/X86/avx512-intrinsics.ll @@ -1954,17 +1954,6 @@ define <4 x float> @_mm_cvtu64_ss(<4 x float> %a, i64 %b) } declare <4 x float> @llvm.x86.avx512.cvtusi642ss(<4 x float>, i64, i32) nounwind readnone -define <2 x double> @test_x86_avx512_mm_cvtu32_sd(<2 x double> %a, i32 %b) -; CHECK-LABEL: test_x86_avx512_mm_cvtu32_sd: -; CHECK: ## %bb.0: -; CHECK-NEXT: vcvtusi2sdl %edi, %xmm0, %xmm0 -; CHECK-NEXT: retq -{ - %res = call <2 x double> @llvm.x86.avx512.cvtusi2sd(<2 x double> %a, i32 %b) ; <<<2 x double>> [#uses=1] - ret <2 x double> %res -} -declare <2 x double> @llvm.x86.avx512.cvtusi2sd(<2 x double>, i32) nounwind readnone - define <2 x double> @test_x86_avx512_mm_cvtu64_sd(<2 x double> %a, i64 %b) ; CHECK-LABEL: test_x86_avx512_mm_cvtu64_sd: ; CHECK: ## %bb.0: -- 2.7.4