From 87689cfc54993959adb20b89a56bc58aad18ca56 Mon Sep 17 00:00:00 2001 From: Duncan Sands Date: Fri, 19 Nov 2010 09:20:39 +0000 Subject: [PATCH] Remove threading of Xor over selects and phis, with an explanation of why such threading is pointless. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@119798 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/InstructionSimplify.cpp | 31 ++++++++++++++++------------ 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/lib/Analysis/InstructionSimplify.cpp b/lib/Analysis/InstructionSimplify.cpp index 7848d508665..97612f46d32 100644 --- a/lib/Analysis/InstructionSimplify.cpp +++ b/lib/Analysis/InstructionSimplify.cpp @@ -250,6 +250,16 @@ Value *llvm::SimplifyAddInst(Value *Op0, Value *Op1, bool isNSW, bool isNUW, } // FIXME: Could pull several more out of instcombine. + + // Threading Add over selects and phi nodes is pointless, so don't bother. + // Threading over the select in "A + select(cond, B, C)" means evaluating + // "A+B" and "A+C" and seeing if they are equal; but they are equal if and + // only if B and C are equal. If B and C are equal then (since we assume + // that operands have already been simplified) "select(cond, B, C)" should + // have been simplified to the common value of B and C already. Analysing + // "A+B" and "A+C" thus gains nothing, but costs compile time. Similarly + // for threading over phi nodes. + return 0; } @@ -454,19 +464,14 @@ static Value *SimplifyXorInst(Value *Op0, Value *Op1, const TargetData *TD, (A == Op0 || B == Op0)) return A == Op0 ? B : A; - // If the operation is with the result of a select instruction, check whether - // operating on either branch of the select always yields the same value. - if (MaxRecurse && (isa(Op0) || isa(Op1))) - if (Value *V = ThreadBinOpOverSelect(Instruction::Xor, Op0, Op1, TD, DT, - MaxRecurse-1)) - return V; - - // If the operation is with the result of a phi instruction, check whether - // operating on all incoming values of the phi always yields the same value. - if (MaxRecurse && (isa(Op0) || isa(Op1))) - if (Value *V = ThreadBinOpOverPHI(Instruction::Xor, Op0, Op1, TD, DT, - MaxRecurse-1)) - return V; + // Threading Xor over selects and phi nodes is pointless, so don't bother. + // Threading over the select in "A ^ select(cond, B, C)" means evaluating + // "A^B" and "A^C" and seeing if they are equal; but they are equal if and + // only if B and C are equal. If B and C are equal then (since we assume + // that operands have already been simplified) "select(cond, B, C)" should + // have been simplified to the common value of B and C already. Analysing + // "A^B" and "A^C" thus gains nothing, but costs compile time. Similarly + // for threading over phi nodes. return 0; } -- 2.34.1