forked from OSchip/llvm-project
				
			Turn X-(X-Y) into Y. According to my auto-simplifier this is the most common
simplification present in fully optimized code (I think instcombine fails to transform some of these when "X-Y" has more than one use). Fires here and there all over the test-suite, for example it eliminates 8 subtractions in the final IR for 445.gobmk, 2 subs in 447.dealII, 2 in paq8p etc. llvm-svn: 123442
This commit is contained in:
		
							parent
							
								
									571fd9a606
								
							
						
					
					
						commit
						d6f1a9584d
					
				| 
						 | 
					@ -593,11 +593,25 @@ static Value *SimplifySubInst(Value *Op0, Value *Op1, bool isNSW, bool isNUW,
 | 
				
			||||||
      match(Op0, m_Add(m_Specific(Op1), m_Value(X))))
 | 
					      match(Op0, m_Add(m_Specific(Op1), m_Value(X))))
 | 
				
			||||||
    return X;
 | 
					    return X;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /// i1 sub -> xor.
 | 
					  // i1 sub -> xor.
 | 
				
			||||||
  if (MaxRecurse && Op0->getType()->isIntegerTy(1))
 | 
					  if (MaxRecurse && Op0->getType()->isIntegerTy(1))
 | 
				
			||||||
    if (Value *V = SimplifyXorInst(Op0, Op1, TD, DT, MaxRecurse-1))
 | 
					    if (Value *V = SimplifyXorInst(Op0, Op1, TD, DT, MaxRecurse-1))
 | 
				
			||||||
      return V;
 | 
					      return V;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // X - (X - Y) -> Y.  More generally Z - (X - Y) -> (Z - X) + Y if everything
 | 
				
			||||||
 | 
					  // simplifies.
 | 
				
			||||||
 | 
					  Value *Y = 0, *Z = Op0;
 | 
				
			||||||
 | 
					  if (MaxRecurse && match(Op1, m_Sub(m_Value(X), m_Value(Y)))) // Z - (X - Y)
 | 
				
			||||||
 | 
					    // See if "V === Z - X" simplifies.
 | 
				
			||||||
 | 
					    if (Value *V = SimplifyBinOp(Instruction::Sub, Z, X, TD, DT, MaxRecurse-1))
 | 
				
			||||||
 | 
					      // It does!  Now see if "W === V + Y" simplifies.
 | 
				
			||||||
 | 
					      if (Value *W = SimplifyBinOp(Instruction::Add, V, Y, TD, DT,
 | 
				
			||||||
 | 
					                                   MaxRecurse-1)) {
 | 
				
			||||||
 | 
					        // It does, we successfully reassociated!
 | 
				
			||||||
 | 
					        ++NumReassoc;
 | 
				
			||||||
 | 
					        return W;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Mul distributes over Sub.  Try some generic simplifications based on this.
 | 
					  // Mul distributes over Sub.  Try some generic simplifications based on this.
 | 
				
			||||||
  if (Value *V = FactorizeBinOp(Instruction::Sub, Op0, Op1, Instruction::Mul,
 | 
					  if (Value *V = FactorizeBinOp(Instruction::Sub, Op0, Op1, Instruction::Mul,
 | 
				
			||||||
                                TD, DT, MaxRecurse))
 | 
					                                TD, DT, MaxRecurse))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -62,3 +62,11 @@ define i32 @xor2(i32 %x, i32 %y) {
 | 
				
			||||||
  ret i32 %l
 | 
					  ret i32 %l
 | 
				
			||||||
; CHECK: ret i32 %y
 | 
					; CHECK: ret i32 %y
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i32 @sub1(i32 %x, i32 %y) {
 | 
				
			||||||
 | 
					; CHECK: @sub1
 | 
				
			||||||
 | 
					  %d = sub i32 %x, %y
 | 
				
			||||||
 | 
					  %r = sub i32 %x, %d
 | 
				
			||||||
 | 
					  ret i32 %r
 | 
				
			||||||
 | 
					; CHECK: ret i32 %y
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue