mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-30 16:17:05 +00:00 
			
		
		
		
	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
This commit is contained in:
		| @@ -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<SelectInst>(Op0) || isa<SelectInst>(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<PHINode>(Op0) || isa<PHINode>(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; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user