From e6915b85ed3ffde7f4fe1e8bafafa03c9caac55e Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Tue, 15 Nov 2016 05:04:51 +0000 Subject: [PATCH] [X86] Add LLVM version number for each intrinsic handled by auto upgrade for age tracking. One day we'd like to remove some of this autoupgrade support and it will be easier if we know how long some of it has been around. Differential Revision: https://reviews.llvm.org/D26321 llvm-svn: 286933 --- llvm/lib/IR/AutoUpgrade.cpp | 310 ++++++++++++++++++------------------ 1 file changed, 158 insertions(+), 152 deletions(-) diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp index a8ee8779db64a..ed19681af0504 100644 --- a/llvm/lib/IR/AutoUpgrade.cpp +++ b/llvm/lib/IR/AutoUpgrade.cpp @@ -226,155 +226,161 @@ static bool UpgradeIntrinsicFunction1(Function *F, Function *&NewFn) { if (IsX86) Name = Name.substr(4); + // All of the intrinsics matches below should be marked with which llvm + // version started autoupgrading them. At some point in the future we would + // like to use this information to remove upgrade code for some older + // intrinsics. It is currently undecided how we will determine that future + // point. if (IsX86 && - (Name.startswith("sse2.pcmpeq.") || - Name.startswith("sse2.pcmpgt.") || - Name.startswith("avx2.pcmpeq.") || - Name.startswith("avx2.pcmpgt.") || - Name.startswith("avx512.mask.pcmpeq.") || - Name.startswith("avx512.mask.pcmpgt.") || - Name == "sse41.pmaxsb" || - Name == "sse2.pmaxs.w" || - Name == "sse41.pmaxsd" || - Name == "sse2.pmaxu.b" || - Name == "sse41.pmaxuw" || - Name == "sse41.pmaxud" || - Name == "sse41.pminsb" || - Name == "sse2.pmins.w" || - Name == "sse41.pminsd" || - Name == "sse2.pminu.b" || - Name == "sse41.pminuw" || - Name == "sse41.pminud" || - Name == "avx512.mask.pshuf.b.128" || - Name == "avx512.mask.pshuf.b.256" || - Name.startswith("avx2.pmax") || - Name.startswith("avx2.pmin") || - Name.startswith("avx512.mask.pmax") || - Name.startswith("avx512.mask.pmin") || - Name.startswith("avx2.vbroadcast") || - Name.startswith("avx2.pbroadcast") || - Name.startswith("avx.vpermil.") || - Name.startswith("sse2.pshuf") || - Name.startswith("avx512.pbroadcast") || - Name.startswith("avx512.mask.broadcast.s") || - Name.startswith("avx512.mask.movddup") || - Name.startswith("avx512.mask.movshdup") || - Name.startswith("avx512.mask.movsldup") || - Name.startswith("avx512.mask.pshuf.d.") || - Name.startswith("avx512.mask.pshufl.w.") || - Name.startswith("avx512.mask.pshufh.w.") || - Name.startswith("avx512.mask.shuf.p") || - Name.startswith("avx512.mask.vpermil.p") || - Name.startswith("avx512.mask.perm.df.") || - Name.startswith("avx512.mask.perm.di.") || - Name.startswith("avx512.mask.punpckl") || - Name.startswith("avx512.mask.punpckh") || - Name.startswith("avx512.mask.unpckl.") || - Name.startswith("avx512.mask.unpckh.") || - Name.startswith("avx512.mask.pand.") || - Name.startswith("avx512.mask.pandn.") || - Name.startswith("avx512.mask.por.") || - Name.startswith("avx512.mask.pxor.") || - Name.startswith("avx512.mask.and.") || - Name.startswith("avx512.mask.andn.") || - Name.startswith("avx512.mask.or.") || - Name.startswith("avx512.mask.xor.") || - Name.startswith("avx512.mask.padd.") || - Name.startswith("avx512.mask.psub.") || - Name.startswith("avx512.mask.pmull.") || - Name == "avx512.mask.add.pd.128" || - Name == "avx512.mask.add.pd.256" || - Name == "avx512.mask.add.ps.128" || - Name == "avx512.mask.add.ps.256" || - Name == "avx512.mask.div.pd.128" || - Name == "avx512.mask.div.pd.256" || - Name == "avx512.mask.div.ps.128" || - Name == "avx512.mask.div.ps.256" || - Name == "avx512.mask.mul.pd.128" || - Name == "avx512.mask.mul.pd.256" || - Name == "avx512.mask.mul.ps.128" || - Name == "avx512.mask.mul.ps.256" || - Name == "avx512.mask.sub.pd.128" || - Name == "avx512.mask.sub.pd.256" || - Name == "avx512.mask.sub.ps.128" || - Name == "avx512.mask.sub.ps.256" || - Name.startswith("avx512.mask.psll.d") || - Name.startswith("avx512.mask.psll.q") || - Name.startswith("avx512.mask.psll.w") || - Name.startswith("avx512.mask.psra.d") || - Name.startswith("avx512.mask.psra.q") || - Name.startswith("avx512.mask.psra.w") || - Name.startswith("avx512.mask.psrl.d") || - Name.startswith("avx512.mask.psrl.q") || - Name.startswith("avx512.mask.psrl.w") || - Name.startswith("avx512.mask.pslli") || - Name.startswith("avx512.mask.psrai") || - Name.startswith("avx512.mask.psrli") || - Name == "avx512.mask.psllv2.di" || - Name == "avx512.mask.psllv4.di" || - Name == "avx512.mask.psllv4.si" || - Name == "avx512.mask.psllv8.si" || - Name == "avx512.mask.psrav4.si" || - Name == "avx512.mask.psrav8.si" || - Name == "avx512.mask.psrlv2.di" || - Name == "avx512.mask.psrlv4.di" || - Name == "avx512.mask.psrlv4.si" || - Name == "avx512.mask.psrlv8.si" || - Name.startswith("avx512.mask.psllv.") || - Name.startswith("avx512.mask.psrav.") || - Name.startswith("avx512.mask.psrlv.") || - Name.startswith("sse41.pmovsx") || - Name.startswith("sse41.pmovzx") || - Name.startswith("avx2.pmovsx") || - Name.startswith("avx2.pmovzx") || - Name.startswith("avx512.mask.pmovsx") || - Name.startswith("avx512.mask.pmovzx") || - Name == "sse2.cvtdq2pd" || - Name == "sse2.cvtps2pd" || - Name == "avx.cvtdq2.pd.256" || - Name == "avx.cvt.ps2.pd.256" || - Name.startswith("avx.vinsertf128.") || - Name == "avx2.vinserti128" || - Name.startswith("avx.vextractf128.") || - Name == "avx2.vextracti128" || - Name.startswith("sse4a.movnt.") || - Name.startswith("avx.movnt.") || - Name.startswith("avx512.storent.") || - Name == "sse2.storel.dq" || - Name.startswith("sse.storeu.") || - Name.startswith("sse2.storeu.") || - Name.startswith("avx.storeu.") || - Name.startswith("avx512.mask.storeu.") || - Name.startswith("avx512.mask.store.p") || - Name.startswith("avx512.mask.store.b.") || - Name.startswith("avx512.mask.store.w.") || - Name.startswith("avx512.mask.store.d.") || - Name.startswith("avx512.mask.store.q.") || - Name.startswith("avx512.mask.loadu.") || - Name.startswith("avx512.mask.load.") || - Name == "sse42.crc32.64.8" || - Name.startswith("avx.vbroadcast.s") || - Name.startswith("avx512.mask.palignr.") || - Name.startswith("sse2.psll.dq") || - Name.startswith("sse2.psrl.dq") || - Name.startswith("avx2.psll.dq") || - Name.startswith("avx2.psrl.dq") || - Name.startswith("avx512.psll.dq") || - Name.startswith("avx512.psrl.dq") || - Name == "sse41.pblendw" || - Name.startswith("sse41.blendp") || - Name.startswith("avx.blend.p") || - Name == "avx2.pblendw" || - Name.startswith("avx2.pblendd.") || - Name.startswith("avx.vbroadcastf128") || - Name == "avx2.vbroadcasti128" || - Name == "xop.vpcmov" || - (Name.startswith("xop.vpcom") && F->arg_size() == 2))) { + (Name.startswith("sse2.pcmpeq.") || // Added in 3.1 + Name.startswith("sse2.pcmpgt.") || // Added in 3.1 + Name.startswith("avx2.pcmpeq.") || // Added in 3.1 + Name.startswith("avx2.pcmpgt.") || // Added in 3.1 + Name.startswith("avx512.mask.pcmpeq.") || // Added in 3.9 + Name.startswith("avx512.mask.pcmpgt.") || // Added in 3.9 + Name == "sse41.pmaxsb" || // Added in 3.9 + Name == "sse2.pmaxs.w" || // Added in 3.9 + Name == "sse41.pmaxsd" || // Added in 3.9 + Name == "sse2.pmaxu.b" || // Added in 3.9 + Name == "sse41.pmaxuw" || // Added in 3.9 + Name == "sse41.pmaxud" || // Added in 3.9 + Name == "sse41.pminsb" || // Added in 3.9 + Name == "sse2.pmins.w" || // Added in 3.9 + Name == "sse41.pminsd" || // Added in 3.9 + Name == "sse2.pminu.b" || // Added in 3.9 + Name == "sse41.pminuw" || // Added in 3.9 + Name == "sse41.pminud" || // Added in 3.9 + Name == "avx512.mask.pshuf.b.128" || // Added in 4.0 + Name == "avx512.mask.pshuf.b.256" || // Added in 4.0 + Name.startswith("avx2.pmax") || // Added in 3.9 + Name.startswith("avx2.pmin") || // Added in 3.9 + Name.startswith("avx512.mask.pmax") || // Added in 4.0 + Name.startswith("avx512.mask.pmin") || // Added in 4.0 + Name.startswith("avx2.vbroadcast") || // Added in 3.8 + Name.startswith("avx2.pbroadcast") || // Added in 3.8 + Name.startswith("avx.vpermil.") || // Added in 3.1 + Name.startswith("sse2.pshuf") || // Added in 3.9 + Name.startswith("avx512.pbroadcast") || // Added in 3.9 + Name.startswith("avx512.mask.broadcast.s") || // Added in 3.9 + Name.startswith("avx512.mask.movddup") || // Added in 3.9 + Name.startswith("avx512.mask.movshdup") || // Added in 3.9 + Name.startswith("avx512.mask.movsldup") || // Added in 3.9 + Name.startswith("avx512.mask.pshuf.d.") || // Added in 3.9 + Name.startswith("avx512.mask.pshufl.w.") || // Added in 3.9 + Name.startswith("avx512.mask.pshufh.w.") || // Added in 3.9 + Name.startswith("avx512.mask.shuf.p") || // Added in 4.0 + Name.startswith("avx512.mask.vpermil.p") || // Added in 3.9 + Name.startswith("avx512.mask.perm.df.") || // Added in 3.9 + Name.startswith("avx512.mask.perm.di.") || // Added in 3.9 + Name.startswith("avx512.mask.punpckl") || // Added in 3.9 + Name.startswith("avx512.mask.punpckh") || // Added in 3.9 + Name.startswith("avx512.mask.unpckl.") || // Added in 3.9 + Name.startswith("avx512.mask.unpckh.") || // Added in 3.9 + Name.startswith("avx512.mask.pand.") || // Added in 3.9 + Name.startswith("avx512.mask.pandn.") || // Added in 3.9 + Name.startswith("avx512.mask.por.") || // Added in 3.9 + Name.startswith("avx512.mask.pxor.") || // Added in 3.9 + Name.startswith("avx512.mask.and.") || // Added in 3.9 + Name.startswith("avx512.mask.andn.") || // Added in 3.9 + Name.startswith("avx512.mask.or.") || // Added in 3.9 + Name.startswith("avx512.mask.xor.") || // Added in 3.9 + Name.startswith("avx512.mask.padd.") || // Added in 4.0 + Name.startswith("avx512.mask.psub.") || // Added in 4.0 + Name.startswith("avx512.mask.pmull.") || // Added in 4.0 + Name == "avx512.mask.add.pd.128" || // Added in 4.0 + Name == "avx512.mask.add.pd.256" || // Added in 4.0 + Name == "avx512.mask.add.ps.128" || // Added in 4.0 + Name == "avx512.mask.add.ps.256" || // Added in 4.0 + Name == "avx512.mask.div.pd.128" || // Added in 4.0 + Name == "avx512.mask.div.pd.256" || // Added in 4.0 + Name == "avx512.mask.div.ps.128" || // Added in 4.0 + Name == "avx512.mask.div.ps.256" || // Added in 4.0 + Name == "avx512.mask.mul.pd.128" || // Added in 4.0 + Name == "avx512.mask.mul.pd.256" || // Added in 4.0 + Name == "avx512.mask.mul.ps.128" || // Added in 4.0 + Name == "avx512.mask.mul.ps.256" || // Added in 4.0 + Name == "avx512.mask.sub.pd.128" || // Added in 4.0 + Name == "avx512.mask.sub.pd.256" || // Added in 4.0 + Name == "avx512.mask.sub.ps.128" || // Added in 4.0 + Name == "avx512.mask.sub.ps.256" || // Added in 4.0 + Name.startswith("avx512.mask.psll.d") || // Added in 4.0 + Name.startswith("avx512.mask.psll.q") || // Added in 4.0 + Name.startswith("avx512.mask.psll.w") || // Added in 4.0 + Name.startswith("avx512.mask.psra.d") || // Added in 4.0 + Name.startswith("avx512.mask.psra.q") || // Added in 4.0 + Name.startswith("avx512.mask.psra.w") || // Added in 4.0 + Name.startswith("avx512.mask.psrl.d") || // Added in 4.0 + Name.startswith("avx512.mask.psrl.q") || // Added in 4.0 + Name.startswith("avx512.mask.psrl.w") || // Added in 4.0 + Name.startswith("avx512.mask.pslli") || // Added in 4.0 + Name.startswith("avx512.mask.psrai") || // Added in 4.0 + Name.startswith("avx512.mask.psrli") || // Added in 4.0 + Name == "avx512.mask.psllv2.di" || // Added in 4.0 + Name == "avx512.mask.psllv4.di" || // Added in 4.0 + Name == "avx512.mask.psllv4.si" || // Added in 4.0 + Name == "avx512.mask.psllv8.si" || // Added in 4.0 + Name == "avx512.mask.psrav4.si" || // Added in 4.0 + Name == "avx512.mask.psrav8.si" || // Added in 4.0 + Name == "avx512.mask.psrlv2.di" || // Added in 4.0 + Name == "avx512.mask.psrlv4.di" || // Added in 4.0 + Name == "avx512.mask.psrlv4.si" || // Added in 4.0 + Name == "avx512.mask.psrlv8.si" || // Added in 4.0 + Name.startswith("avx512.mask.psllv.") || // Added in 4.0 + Name.startswith("avx512.mask.psrav.") || // Added in 4.0 + Name.startswith("avx512.mask.psrlv.") || // Added in 4.0 + Name.startswith("sse41.pmovsx") || // Added in 3.8 + Name.startswith("sse41.pmovzx") || // Added in 3.9 + Name.startswith("avx2.pmovsx") || // Added in 3.9 + Name.startswith("avx2.pmovzx") || // Added in 3.9 + Name.startswith("avx512.mask.pmovsx") || // Added in 4.0 + Name.startswith("avx512.mask.pmovzx") || // Added in 4.0 + Name == "sse2.cvtdq2pd" || // Added in 3.9 + Name == "sse2.cvtps2pd" || // Added in 3.9 + Name == "avx.cvtdq2.pd.256" || // Added in 3.9 + Name == "avx.cvt.ps2.pd.256" || // Added in 3.9 + Name.startswith("avx.vinsertf128.") || // Added in 3.7 + Name == "avx2.vinserti128" || // Added in 3.7 + Name.startswith("avx.vextractf128.") || // Added in 3.7 + Name == "avx2.vextracti128" || // Added in 3.7 + Name.startswith("sse4a.movnt.") || // Added in 3.9 + Name.startswith("avx.movnt.") || // Added in 3.2 + Name.startswith("avx512.storent.") || // Added in 3.9 + Name == "sse2.storel.dq" || // Added in 3.9 + Name.startswith("sse.storeu.") || // Added in 3.9 + Name.startswith("sse2.storeu.") || // Added in 3.9 + Name.startswith("avx.storeu.") || // Added in 3.9 + Name.startswith("avx512.mask.storeu.") || // Added in 3.9 + Name.startswith("avx512.mask.store.p") || // Added in 3.9 + Name.startswith("avx512.mask.store.b.") || // Added in 3.9 + Name.startswith("avx512.mask.store.w.") || // Added in 3.9 + Name.startswith("avx512.mask.store.d.") || // Added in 3.9 + Name.startswith("avx512.mask.store.q.") || // Added in 3.9 + Name.startswith("avx512.mask.loadu.") || // Added in 3.9 + Name.startswith("avx512.mask.load.") || // Added in 3.9 + Name == "sse42.crc32.64.8" || // Added in 3.4 + Name.startswith("avx.vbroadcast.s") || // Added in 3.5 + Name.startswith("avx512.mask.palignr.") || // Added in 3.9 + Name.startswith("sse2.psll.dq") || // Added in 3.7 + Name.startswith("sse2.psrl.dq") || // Added in 3.7 + Name.startswith("avx2.psll.dq") || // Added in 3.7 + Name.startswith("avx2.psrl.dq") || // Added in 3.7 + Name.startswith("avx512.psll.dq") || // Added in 3.9 + Name.startswith("avx512.psrl.dq") || // Added in 3.9 + Name == "sse41.pblendw" || // Added in 3.7 + Name.startswith("sse41.blendp") || // Added in 3.7 + Name.startswith("avx.blend.p") || // Added in 3.7 + Name == "avx2.pblendw" || // Added in 3.7 + Name.startswith("avx2.pblendd.") || // Added in 3.7 + Name.startswith("avx.vbroadcastf128") || // Added in 4.0 + Name == "avx2.vbroadcasti128" || // Added in 3.7 + Name == "xop.vpcmov" || // Added in 3.8 + (Name.startswith("xop.vpcom") && // Added in 3.2 + F->arg_size() == 2))) { NewFn = nullptr; return true; } // SSE4.1 ptest functions may have an old signature. - if (IsX86 && Name.startswith("sse41.ptest")) { + if (IsX86 && Name.startswith("sse41.ptest")) { // Added in 3.2 if (Name.substr(11) == "c") return UpgradeSSE41Function(F, Intrinsic::x86_sse41_ptestc, NewFn); if (Name.substr(11) == "z") @@ -384,26 +390,26 @@ static bool UpgradeIntrinsicFunction1(Function *F, Function *&NewFn) { } // Several blend and other instructions with masks used the wrong number of // bits. - if (IsX86 && Name == "sse41.insertps") + if (IsX86 && Name == "sse41.insertps") // Added in 3.6 return UpgradeX86IntrinsicsWith8BitMask(F, Intrinsic::x86_sse41_insertps, NewFn); - if (IsX86 && Name == "sse41.dppd") + if (IsX86 && Name == "sse41.dppd") // Added in 3.6 return UpgradeX86IntrinsicsWith8BitMask(F, Intrinsic::x86_sse41_dppd, NewFn); - if (IsX86 && Name == "sse41.dpps") + if (IsX86 && Name == "sse41.dpps") // Added in 3.6 return UpgradeX86IntrinsicsWith8BitMask(F, Intrinsic::x86_sse41_dpps, NewFn); - if (IsX86 && Name == "sse41.mpsadbw") + if (IsX86 && Name == "sse41.mpsadbw") // Added in 3.6 return UpgradeX86IntrinsicsWith8BitMask(F, Intrinsic::x86_sse41_mpsadbw, NewFn); - if (IsX86 && Name == "avx.dp.ps.256") + if (IsX86 && Name == "avx.dp.ps.256") // Added in 3.6 return UpgradeX86IntrinsicsWith8BitMask(F, Intrinsic::x86_avx_dp_ps_256, NewFn); - if (IsX86 && Name == "avx2.mpsadbw") + if (IsX86 && Name == "avx2.mpsadbw") // Added in 3.6 return UpgradeX86IntrinsicsWith8BitMask(F, Intrinsic::x86_avx2_mpsadbw, NewFn); - // frcz.ss/sd may need to have an argument dropped + // frcz.ss/sd may need to have an argument dropped. Added in 3.2 if (IsX86 && Name.startswith("xop.vfrcz.ss") && F->arg_size() == 2) { rename(F); NewFn = Intrinsic::getDeclaration(F->getParent(), @@ -417,7 +423,7 @@ static bool UpgradeIntrinsicFunction1(Function *F, Function *&NewFn) { return true; } // Upgrade any XOP PERMIL2 index operand still using a float/double vector. - if (IsX86 && Name.startswith("xop.vpermil2")) { + if (IsX86 && Name.startswith("xop.vpermil2")) { // Added in 3.9 auto Params = F->getFunctionType()->params(); auto Idx = Params[2]; if (Idx->getScalarType()->isFloatingPointTy()) {