mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-07 12:30:44 +00:00
Revert 85085. It causes infinite looping during llvm-gcc build.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@85090 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7e43439e81
commit
85def16079
@ -631,32 +631,9 @@ static inline Value *dyn_castFNegVal(Value *V) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// isFreeToInvert - Return true if the specified value is free to invert (apply
|
||||
/// ~ to). This happens in cases where the ~ can be eliminated.
|
||||
static inline bool isFreeToInvert(Value *V) {
|
||||
// ~(~(X)) -> X.
|
||||
if (BinaryOperator::isNot(V))
|
||||
return true;
|
||||
|
||||
// Constants can be considered to be not'ed values.
|
||||
if (isa<ConstantInt>(V))
|
||||
return true;
|
||||
|
||||
// Compares can be inverted if they have a single use.
|
||||
if (CmpInst *CI = dyn_cast<CmpInst>(V))
|
||||
return CI->hasOneUse();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline Value *dyn_castNotVal(Value *V) {
|
||||
// If this is not(not(x)) don't return that this is a not: we want the two
|
||||
// not's to be folded first.
|
||||
if (BinaryOperator::isNot(V)) {
|
||||
Value *Operand = BinaryOperator::getNotArgument(V);
|
||||
if (!isFreeToInvert(Operand))
|
||||
return Operand;
|
||||
}
|
||||
if (BinaryOperator::isNot(V))
|
||||
return BinaryOperator::getNotArgument(V);
|
||||
|
||||
// Constants can be considered to be not'ed values...
|
||||
if (ConstantInt *C = dyn_cast<ConstantInt>(V))
|
||||
@ -664,8 +641,6 @@ static inline Value *dyn_castNotVal(Value *V) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// dyn_castFoldableMul - If this value is a multiply that can be folded into
|
||||
// other computations (because it has a constant operand), return the
|
||||
// non-constant operand of the multiply, and set CST to point to the multiplier.
|
||||
@ -4191,7 +4166,7 @@ Instruction *InstCombiner::visitAnd(BinaryOperator &I) {
|
||||
if (Instruction *CastOp = dyn_cast<Instruction>(CI->getOperand(0))) {
|
||||
if ((isa<TruncInst>(CI) || isa<BitCastInst>(CI)) &&
|
||||
CastOp->getNumOperands() == 2)
|
||||
if (ConstantInt *AndCI =dyn_cast<ConstantInt>(CastOp->getOperand(1))){
|
||||
if (ConstantInt *AndCI = dyn_cast<ConstantInt>(CastOp->getOperand(1))) {
|
||||
if (CastOp->getOpcode() == Instruction::And) {
|
||||
// Change: and (cast (and X, C1) to T), C2
|
||||
// into : and (cast X to T), trunc_or_bitcast(C1)&C2
|
||||
@ -5089,13 +5064,12 @@ Instruction *InstCombiner::visitXor(BinaryOperator &I) {
|
||||
|
||||
// Is this a ~ operation?
|
||||
if (Value *NotOp = dyn_castNotVal(&I)) {
|
||||
// ~(~X & Y) --> (X | ~Y) - De Morgan's Law
|
||||
// ~(~X | Y) === (X & ~Y) - De Morgan's Law
|
||||
if (BinaryOperator *Op0I = dyn_cast<BinaryOperator>(NotOp)) {
|
||||
if (Op0I->getOpcode() == Instruction::And ||
|
||||
Op0I->getOpcode() == Instruction::Or) {
|
||||
// ~(~X & Y) --> (X | ~Y) - De Morgan's Law
|
||||
// ~(~X | Y) === (X & ~Y) - De Morgan's Law
|
||||
if (dyn_castNotVal(Op0I->getOperand(1)))
|
||||
Op0I->swapOperands();
|
||||
if (dyn_castNotVal(Op0I->getOperand(1))) Op0I->swapOperands();
|
||||
if (Value *Op0NotVal = dyn_castNotVal(Op0I->getOperand(0))) {
|
||||
Value *NotY =
|
||||
Builder->CreateNot(Op0I->getOperand(1),
|
||||
@ -5104,19 +5078,6 @@ Instruction *InstCombiner::visitXor(BinaryOperator &I) {
|
||||
return BinaryOperator::CreateOr(Op0NotVal, NotY);
|
||||
return BinaryOperator::CreateAnd(Op0NotVal, NotY);
|
||||
}
|
||||
|
||||
// ~(X & Y) --> (~X | ~Y) - De Morgan's Law
|
||||
// ~(X | Y) === (~X & ~Y) - De Morgan's Law
|
||||
if (isFreeToInvert(Op0I->getOperand(0)) &&
|
||||
isFreeToInvert(Op0I->getOperand(1))) {
|
||||
Value *NotX =
|
||||
Builder->CreateNot(Op0I->getOperand(0), "notlhs");
|
||||
Value *NotY =
|
||||
Builder->CreateNot(Op0I->getOperand(1), "notrhs");
|
||||
if (Op0I->getOpcode() == Instruction::And)
|
||||
return BinaryOperator::CreateOr(NotX, NotY);
|
||||
return BinaryOperator::CreateAnd(NotX, NotY);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
; This test makes sure that these instructions are properly eliminated.
|
||||
;
|
||||
; RUN: opt < %s -instcombine -S | FileCheck %s
|
||||
; XFAIL: *
|
||||
|
||||
define i32 @test1(i32 %A) {
|
||||
%B = or i32 %A, 0
|
||||
|
Loading…
Reference in New Issue
Block a user