From 05bd1b2eee9742e7b7d69ceaac321bc8f1020295 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 20 Aug 2002 18:24:26 +0000 Subject: [PATCH] - instcombine (~(a < b)) into (a >= b) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3406 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/InstructionCombining.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index 71c2cc6e3f5..30e143dec46 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -328,10 +328,18 @@ Instruction *InstCombiner::visitXor(BinaryOperator &I) { if (Op1C->isNullValue()) return ReplaceInstUsesWith(I, Op0); - // xor (xor X, -1), -1 = not (not X) = X - if (Op1C->isAllOnesValue()) + // Is this a "NOT" instruction? + if (Op1C->isAllOnesValue()) { + // xor (xor X, -1), -1 = not (not X) = X if (Value *X = dyn_castNotInst(Op0)) return ReplaceInstUsesWith(I, X); + + // xor (setcc A, B), true = not (setcc A, B) = setncc A, B + if (SetCondInst *SCI = dyn_cast(Op0)) + if (SCI->use_size() == 1) + return new SetCondInst(SCI->getInverseCondition(), + SCI->getOperand(0), SCI->getOperand(1)); + } } return Changed ? &I : 0;