Switch llvm.cttz and llvm.ctlz to accept a second i1 parameter which
authorChandler Carruth <chandlerc@gmail.com>
Mon, 12 Dec 2011 04:26:04 +0000 (04:26 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Mon, 12 Dec 2011 04:26:04 +0000 (04:26 +0000)
commitccbf1e36d34c2d66600748bdd8767dc122629a58
tree0da7fdd6443280bb7511025247baf08f1c27df04
parent9f756cf4e293e5ac75db4636f7ea45ee85123f25
Switch llvm.cttz and llvm.ctlz to accept a second i1 parameter which
indicates whether the intrinsic has a defined result for a first
argument equal to zero. This will eventually allow these intrinsics to
accurately model the semantics of GCC's __builtin_ctz and __builtin_clz
and the X86 instructions (prior to AVX) which implement them.

This patch merely sets the stage by extending the signature of these
intrinsics and establishing auto-upgrade logic so that the old spelling
still works both in IR and in bitcode. The upgrade logic preserves the
existing (inefficient) semantics. This patch should not change any
behavior. CodeGen isn't updated because it can use the existing
semantics regardless of the flag's value.

Note that this will be followed by API updates to Clang and DragonEgg.

Reviewed by Nick Lewycky!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@146357 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/Intrinsics.td
lib/Analysis/ConstantFolding.cpp
lib/Transforms/Scalar/SimplifyLibCalls.cpp
lib/VMCore/AutoUpgrade.cpp