[llvm] r330126 - [InstCombine] simplify fneg+fadd folds; NFC

Mikael Holmén via llvm-commits llvm-commits at lists.llvm.org
Sun May 27 23:20:42 PDT 2018


I wrote a PR about it:
  https://bugs.llvm.org/show_bug.cgi?id=37605

Regards,
Mikael

On 05/25/2018 03:16 PM, Mikael Holmén via llvm-commits wrote:
> Hi Sanjay,
> 
> It seems that with this change instcombine can't decide if it prefers 
> fadd or fsub and then ping-pongs for a case we found when compiling 
> csmith-generated code.
> 
> Reproduce with
>   opt -S -o - tr16071.ll -instcombine
> 
> With -debug we see
> 
> INSTCOMBINE ITERATION #1 on test
> IC: DCE:   %1 = select i1 %tobool, i1 true, i1 undef
> IC: ADDING: 5 instrs to worklist
> IC: Visiting:   %0 = load i16, i16* @c, align 1
> IC: Visiting:   %conv = sitofp i16 %0 to float
> IC: Visiting:   %sub = fsub float %conv, bitcast (i32 ptrtoint (i16* @b 
> to i32) to float)
> IC: Old =   %sub = fsub float %conv, bitcast (i32 ptrtoint (i16* @b to 
> i32) to float)
>      New =   <badref> = fadd float %conv, fsub (float -0.000000e+00, 
> float bitcast (i32 ptrtoint (i16* @b to i32) to float))
> IC: ADD:   %sub = fadd float %conv, fsub (float -0.000000e+00, float 
> bitcast (i32 ptrtoint (i16* @b to i32) to float))
> IC: ERASE   %1 = fsub float %conv, bitcast (i32 ptrtoint (i16* @b to 
> i32) to float)
> IC: ADD:   %conv = sitofp i16 %0 to float
> IC: Visiting:   %conv = sitofp i16 %0 to float
> IC: Visiting:   %sub = fadd float %conv, fsub (float -0.000000e+00, 
> float bitcast (i32 ptrtoint (i16* @b to i32) to float))
> IC: Old =   %sub = fadd float %conv, fsub (float -0.000000e+00, float 
> bitcast (i32 ptrtoint (i16* @b to i32) to float))
>      New =   <badref> = fsub float %conv, bitcast (i32 ptrtoint (i16* @b 
> to i32) to float)
> IC: ADD:   %sub = fsub float %conv, bitcast (i32 ptrtoint (i16* @b to 
> i32) to float)
> IC: ERASE   %1 = fadd float %conv, fsub (float -0.000000e+00, float 
> bitcast (i32 ptrtoint (i16* @b to i32) to float))
> IC: ADD:   %conv = sitofp i16 %0 to float
> IC: Visiting:   %conv = sitofp i16 %0 to float
> IC: Visiting:   %sub = fsub float %conv, bitcast (i32 ptrtoint (i16* @b 
> to i32) to float)
> IC: Old =   %sub = fsub float %conv, bitcast (i32 ptrtoint (i16* @b to 
> i32) to float)
>      New =   <badref> = fadd float %conv, fsub (float -0.000000e+00, 
> float bitcast (i32 ptrtoint (i16* @b to i32) to float))
> IC: ADD:   %sub = fadd float %conv, fsub (float -0.000000e+00, float 
> bitcast (i32 ptrtoint (i16* @b to i32) to float))
> IC: ERASE   %1 = fsub float %conv, bitcast (i32 ptrtoint (i16* @b to 
> i32) to float)
> IC: ADD:   %conv = sitofp i16 %0 to float
> [...]
> 
> Regards,
> Mikael
> 
> On 04/16/2018 04:13 PM, Sanjay Patel via llvm-commits wrote:
>> Author: spatel
>> Date: Mon Apr 16 07:13:57 2018
>> New Revision: 330126
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=330126&view=rev
>> Log:
>> [InstCombine] simplify fneg+fadd folds; NFC
>>
>> Two cleanups:
>> 1. As noted in D45453, we had tests that don't need FMF that were 
>> misplaced in the 'fast-math.ll' test file.
>> 2. This removes the final uses of dyn_castFNegVal, so that can be 
>> deleted. We use 'match' now.
>>
>> Added:
>>      llvm/trunk/test/Transforms/InstCombine/fadd.ll
>> Modified:
>>      llvm/trunk/lib/Transforms/InstCombine/InstCombineAddSub.cpp
>>      llvm/trunk/lib/Transforms/InstCombine/InstCombineInternal.h
>>      llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp
>>      llvm/trunk/test/Transforms/InstCombine/fast-math.ll
>>
>> Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineAddSub.cpp
>> URL: 
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineAddSub.cpp?rev=330126&r1=330125&r2=330126&view=diff 
>>
>> ============================================================================== 
>>
>> --- llvm/trunk/lib/Transforms/InstCombine/InstCombineAddSub.cpp 
>> (original)
>> +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineAddSub.cpp Mon 
>> Apr 16 07:13:57 2018
>> @@ -1308,14 +1308,13 @@ Instruction *InstCombiner::visitFAdd(Bin
>>     if (Instruction *FoldedFAdd = foldBinOpIntoSelectOrPhi(I))
>>       return FoldedFAdd;
>> -  // -A + B  -->  B - A
>> -  if (Value *LHSV = dyn_castFNegVal(LHS))
>> -    return BinaryOperator::CreateFSubFMF(RHS, LHSV, &I);
>> -
>> -  // A + -B  -->  A - B
>> -  if (!isa<Constant>(RHS))
>> -    if (Value *V = dyn_castFNegVal(RHS))
>> -      return BinaryOperator::CreateFSubFMF(LHS, V, &I);
>> +  Value *X;
>> +  // (-X) + Y --> Y - X
>> +  if (match(LHS, m_FNeg(m_Value(X))))
>> +    return BinaryOperator::CreateFSubFMF(RHS, X, &I);
>> +  // Y + (-X) --> Y - X
>> +  if (match(RHS, m_FNeg(m_Value(X))))
>> +    return BinaryOperator::CreateFSubFMF(LHS, X, &I);
>>     // Check for (fadd double (sitofp x), y), see if we can merge this 
>> into an
>>     // integer add followed by a promotion.
>>
>> Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineInternal.h
>> URL: 
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineInternal.h?rev=330126&r1=330125&r2=330126&view=diff 
>>
>> ============================================================================== 
>>
>> --- llvm/trunk/lib/Transforms/InstCombine/InstCombineInternal.h 
>> (original)
>> +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineInternal.h Mon 
>> Apr 16 07:13:57 2018
>> @@ -376,7 +376,6 @@ private:
>>     bool shouldChangeType(unsigned FromBitWidth, unsigned ToBitWidth) 
>> const;
>>     bool shouldChangeType(Type *From, Type *To) const;
>>     Value *dyn_castNegVal(Value *V) const;
>> -  Value *dyn_castFNegVal(Value *V, bool NoSignedZero = false) const;
>>     Type *FindElementAtOffset(PointerType *PtrTy, int64_t Offset,
>>                               SmallVectorImpl<Value *> &NewIndices);
>>
>> Modified: llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp
>> URL: 
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp?rev=330126&r1=330125&r2=330126&view=diff 
>>
>> ============================================================================== 
>>
>> --- llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp 
>> (original)
>> +++ llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp Mon 
>> Apr 16 07:13:57 2018
>> @@ -790,23 +790,6 @@ Value *InstCombiner::dyn_castNegVal(Valu
>>     return nullptr;
>>   }
>> -/// Given a 'fsub' instruction, return the RHS of the instruction if 
>> the LHS is
>> -/// a constant negative zero (which is the 'negate' form).
>> -Value *InstCombiner::dyn_castFNegVal(Value *V, bool IgnoreZeroSign) 
>> const {
>> -  if (BinaryOperator::isFNeg(V, IgnoreZeroSign))
>> -    return BinaryOperator::getFNegArgument(V);
>> -
>> -  // Constants can be considered to be negated values if they can be 
>> folded.
>> -  if (ConstantFP *C = dyn_cast<ConstantFP>(V))
>> -    return ConstantExpr::getFNeg(C);
>> -
>> -  if (ConstantDataVector *C = dyn_cast<ConstantDataVector>(V))
>> -    if (C->getType()->getElementType()->isFloatingPointTy())
>> -      return ConstantExpr::getFNeg(C);
>> -
>> -  return nullptr;
>> -}
>> -
>>   static Value *foldOperationIntoSelectOperand(Instruction &I, Value *SO,
>>                                                InstCombiner::BuilderTy 
>> &Builder) {
>>     if (auto *Cast = dyn_cast<CastInst>(&I))
>>
>> Added: llvm/trunk/test/Transforms/InstCombine/fadd.ll
>> URL: 
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/fadd.ll?rev=330126&view=auto 
>>
>> ============================================================================== 
>>
>> --- llvm/trunk/test/Transforms/InstCombine/fadd.ll (added)
>> +++ llvm/trunk/test/Transforms/InstCombine/fadd.ll Mon Apr 16 07:13:57 
>> 2018
>> @@ -0,0 +1,27 @@
>> +; NOTE: Assertions have been autogenerated by 
>> utils/update_test_checks.py
>> +; RUN: opt < %s -instcombine -S | FileCheck %s
>> +
>> +; -x + y => y - x
>> +
>> +define float @fneg_op0(float %x, float %y) {
>> +; CHECK-LABEL: @fneg_op0(
>> +; CHECK-NEXT:    [[ADD:%.*]] = fsub float [[Y:%.*]], [[X:%.*]]
>> +; CHECK-NEXT:    ret float [[ADD]]
>> +;
>> +  %neg = fsub float -0.0, %x
>> +  %add = fadd float %neg, %y
>> +  ret float %add
>> +}
>> +
>> +; x + -y => x - y
>> +
>> +define float @fneg_op1(float %x, float %y) {
>> +; CHECK-LABEL: @fneg_op1(
>> +; CHECK-NEXT:    [[ADD:%.*]] = fsub float [[X:%.*]], [[Y:%.*]]
>> +; CHECK-NEXT:    ret float [[ADD]]
>> +;
>> +  %neg = fsub float -0.0, %y
>> +  %add = fadd float %x, %neg
>> +  ret float %add
>> +}
>> +
>>
>> Modified: llvm/trunk/test/Transforms/InstCombine/fast-math.ll
>> URL: 
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/fast-math.ll?rev=330126&r1=330125&r2=330126&view=diff 
>>
>> ============================================================================== 
>>
>> --- llvm/trunk/test/Transforms/InstCombine/fast-math.ll (original)
>> +++ llvm/trunk/test/Transforms/InstCombine/fast-math.ll Mon Apr 16 
>> 07:13:57 2018
>> @@ -406,30 +406,6 @@ define float @fold13_reassoc(float %x) {
>>     ret float %sub
>>   }
>> -; -x + y => y - x
>> -; This is always safe.  No FMF required.
>> -define float @fold14(float %x, float %y) {
>> -; CHECK-LABEL: @fold14(
>> -; CHECK-NEXT:    [[ADD:%.*]] = fsub float [[Y:%.*]], [[X:%.*]]
>> -; CHECK-NEXT:    ret float [[ADD]]
>> -;
>> -  %neg = fsub float -0.0, %x
>> -  %add = fadd float %neg, %y
>> -  ret float %add
>> -}
>> -
>> -; x + -y => x - y
>> -; This is always safe.  No FMF required.
>> -define float @fold15(float %x, float %y) {
>> -; CHECK-LABEL: @fold15(
>> -; CHECK-NEXT:    [[ADD:%.*]] = fsub float [[X:%.*]], [[Y:%.*]]
>> -; CHECK-NEXT:    ret float [[ADD]]
>> -;
>> -  %neg = fsub float -0.0, %y
>> -  %add = fadd float %x, %neg
>> -  ret float %add
>> -}
>> -
>>   ; (select X+Y, X-Y) => X + (select Y, -Y)
>>   ; This is always safe.  No FMF required.
>>   define float @fold16(float %x, float %y) {
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
> 



More information about the llvm-commits mailing list