Skip to content

Commit

Permalink
[X86] Add LLVM version number for each intrinsic handled by auto upgr…
Browse files Browse the repository at this point in the history
…ade 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
  • Loading branch information
topperc committed Nov 15, 2016
1 parent f7182fe commit e6915b8
Showing 1 changed file with 158 additions and 152 deletions.
310 changes: 158 additions & 152 deletions llvm/lib/IR/AutoUpgrade.cpp
Expand Up @@ -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")
Expand All @@ -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(),
Expand All @@ -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()) {
Expand Down

0 comments on commit e6915b8

Please sign in to comment.