1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 11:42:57 +01:00

Transform this:

%X = alloca ...
  %Y = alloca ...
    X == Y

into false.  This allows us to simplify some stuff in eon (and probably
many other C++ programs) where operator= was checking for self assignment.
Folding this allows us to SROA several additional structs.

llvm-svn: 17735
This commit is contained in:
Chris Lattner 2004-11-14 07:33:16 +00:00
parent d6d9a04344
commit fdd41995d8

View File

@ -1870,12 +1870,14 @@ Instruction *InstCombiner::visitSetCondInst(BinaryOperator &I) {
if (isa<UndefValue>(Op1)) // X setcc undef -> undef
return ReplaceInstUsesWith(I, UndefValue::get(Type::BoolTy));
// setcc <global/alloca*>, 0 - Global/Stack value addresses are never null!
if (isa<ConstantPointerNull>(Op1) &&
(isa<GlobalValue>(Op0) || isa<AllocaInst>(Op0)))
// setcc <global/alloca*/null>, <global/alloca*/null> - Global/Stack value
// addresses never equal each other! We already know that Op0 != Op1.
if ((isa<GlobalValue>(Op0) || isa<AllocaInst>(Op0) ||
isa<ConstantPointerNull>(Op0)) &&
(isa<GlobalValue>(Op1) || isa<AllocaInst>(Op1) ||
isa<ConstantPointerNull>(Op1)))
return ReplaceInstUsesWith(I, ConstantBool::get(!isTrueWhenEqual(I)));
// setcc's with boolean values can always be turned into bitwise operations
if (Ty == Type::BoolTy) {
switch (I.getOpcode()) {