[llvm] r199528 - Fix more instances of dropped fast math flags when optimizing FADD instructions. All found by inspection (aka grep).

Owen Anderson resistor at mac.com
Fri Jan 17 16:48:14 PST 2014


Author: resistor
Date: Fri Jan 17 18:48:14 2014
New Revision: 199528

URL: http://llvm.org/viewvc/llvm-project?rev=199528&view=rev
Log:
Fix more instances of dropped fast math flags when optimizing FADD instructions.  All found by inspection (aka grep).

Modified:
    llvm/trunk/include/llvm/IR/Operator.h
    llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp
    llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp
    llvm/trunk/lib/Transforms/InstCombine/InstCombineVectorOps.cpp
    llvm/trunk/test/Transforms/InstCombine/fast-math.ll
    llvm/trunk/test/Transforms/InstCombine/fpcast.ll

Modified: llvm/trunk/include/llvm/IR/Operator.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Operator.h?rev=199528&r1=199527&r2=199528&view=diff
==============================================================================
--- llvm/trunk/include/llvm/IR/Operator.h (original)
+++ llvm/trunk/include/llvm/IR/Operator.h Fri Jan 17 18:48:14 2014
@@ -210,6 +210,10 @@ public:
     setNoSignedZeros();
     setAllowReciprocal();
   }
+
+  void operator&=(const FastMathFlags &OtherFlags) {
+    Flags &= OtherFlags.Flags;
+  }
 };
 
 

Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp?rev=199528&r1=199527&r2=199528&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp Fri Jan 17 18:48:14 2014
@@ -1232,7 +1232,10 @@ Instruction *InstCombiner::visitFPTrunc(
             LHSOrig = Builder->CreateFPExt(LHSOrig, CI.getType());
           if (RHSOrig->getType() != CI.getType())
             RHSOrig = Builder->CreateFPExt(RHSOrig, CI.getType());
-          return BinaryOperator::Create(OpI->getOpcode(), LHSOrig, RHSOrig);
+          Instruction *RI =
+            BinaryOperator::Create(OpI->getOpcode(), LHSOrig, RHSOrig);
+          RI->copyFastMathFlags(OpI);
+          return RI;
         }
         break;
       case Instruction::FMul:
@@ -1246,7 +1249,10 @@ Instruction *InstCombiner::visitFPTrunc(
             LHSOrig = Builder->CreateFPExt(LHSOrig, CI.getType());
           if (RHSOrig->getType() != CI.getType())
             RHSOrig = Builder->CreateFPExt(RHSOrig, CI.getType());
-          return BinaryOperator::CreateFMul(LHSOrig, RHSOrig);
+          Instruction *RI =
+            BinaryOperator::CreateFMul(LHSOrig, RHSOrig);
+          RI->copyFastMathFlags(OpI);
+          return RI;
         }
         break;
       case Instruction::FDiv:
@@ -1261,7 +1267,10 @@ Instruction *InstCombiner::visitFPTrunc(
             LHSOrig = Builder->CreateFPExt(LHSOrig, CI.getType());
           if (RHSOrig->getType() != CI.getType())
             RHSOrig = Builder->CreateFPExt(RHSOrig, CI.getType());
-          return BinaryOperator::CreateFDiv(LHSOrig, RHSOrig);
+          Instruction *RI =
+            BinaryOperator::CreateFDiv(LHSOrig, RHSOrig);
+          RI->copyFastMathFlags(OpI);
+          return RI;
         }
         break;
       case Instruction::FRem:
@@ -1274,6 +1283,8 @@ Instruction *InstCombiner::visitFPTrunc(
         else if (RHSWidth <= SrcWidth)
           RHSOrig = Builder->CreateFPExt(RHSOrig, LHSOrig->getType());
         Value *ExactResult = Builder->CreateFRem(LHSOrig, RHSOrig);
+        if (Instruction *RI = dyn_cast<Instruction>(ExactResult))
+          RI->copyFastMathFlags(OpI);
         return CastInst::CreateFPCast(ExactResult, CI.getType());
     }
 
@@ -1281,7 +1292,9 @@ Instruction *InstCombiner::visitFPTrunc(
     if (BinaryOperator::isFNeg(OpI)) {
       Value *InnerTrunc = Builder->CreateFPTrunc(OpI->getOperand(1),
                                                  CI.getType());
-      return BinaryOperator::CreateFNeg(InnerTrunc);
+      Instruction *RI = BinaryOperator::CreateFNeg(InnerTrunc);
+      RI->copyFastMathFlags(OpI);
+      return RI;
     }
   }
 

Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp?rev=199528&r1=199527&r2=199528&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp Fri Jan 17 18:48:14 2014
@@ -901,6 +901,11 @@ Instruction *InstCombiner::visitSelectIn
             Value *NegVal;  // Compute -Z
             if (SI.getType()->isFPOrFPVectorTy()) {
               NegVal = Builder->CreateFNeg(SubOp->getOperand(1));
+              if (Instruction *NegInst = dyn_cast<Instruction>(NegVal)) {
+                FastMathFlags Flags = AddOp->getFastMathFlags();
+                Flags &= SubOp->getFastMathFlags();
+                NegInst->setFastMathFlags(Flags);
+              }
             } else {
               NegVal = Builder->CreateNeg(SubOp->getOperand(1));
             }
@@ -913,9 +918,15 @@ Instruction *InstCombiner::visitSelectIn
               Builder->CreateSelect(CondVal, NewTrueOp,
                                     NewFalseOp, SI.getName() + ".p");
 
-            if (SI.getType()->isFPOrFPVectorTy())
-              return BinaryOperator::CreateFAdd(SubOp->getOperand(0), NewSel);
-            else
+            if (SI.getType()->isFPOrFPVectorTy()) {
+              Instruction *RI =
+                BinaryOperator::CreateFAdd(SubOp->getOperand(0), NewSel);
+
+              FastMathFlags Flags = AddOp->getFastMathFlags();
+              Flags &= SubOp->getFastMathFlags();
+              RI->setFastMathFlags(Flags);
+              return RI;
+            } else
               return BinaryOperator::CreateAdd(SubOp->getOperand(0), NewSel);
           }
         }

Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineVectorOps.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineVectorOps.cpp?rev=199528&r1=199527&r2=199528&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineVectorOps.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineVectorOps.cpp Fri Jan 17 18:48:14 2014
@@ -638,6 +638,8 @@ static Value *BuildNew(Instruction *I, A
       if (isa<PossiblyExactOperator>(BO)) {
         New->setIsExact(BO->isExact());
       }
+      if (isa<FPMathOperator>(BO))
+        New->copyFastMathFlags(I);
       return New;
     }
     case Instruction::ICmp:

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=199528&r1=199527&r2=199528&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/fast-math.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/fast-math.ll Fri Jan 17 18:48:14 2014
@@ -160,6 +160,22 @@ define float @fold15(float %x, float %y)
 ; CHECK: ret
 }
 
+; (select X+Y, X-Y) => X + (select Y, -Y)
+define float @fold16(float %x, float %y) {
+  %cmp = fcmp ogt float %x, %y
+  %plus = fadd fast float %x, %y
+  %minus = fsub fast float %x, %y
+  %r = select i1 %cmp, float %plus, float %minus
+  ret float %r
+; CHECK: fold16
+; CHECK: fsub fast float
+; CHECK: select
+; CHECK: fadd fast float
+; CHECK: ret
+}
+
+
+
 ; =========================================================================
 ;
 ;   Testing-cases about fmul begin

Modified: llvm/trunk/test/Transforms/InstCombine/fpcast.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/fpcast.ll?rev=199528&r1=199527&r2=199528&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/fpcast.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/fpcast.ll Fri Jan 17 18:48:14 2014
@@ -31,6 +31,15 @@ define half @test4(float %a) {
   ret half %c
 }
 
+; CHECK: test4-fast
+define half @test4-fast(float %a) {
+; CHECK: fptrunc
+; CHECK: fsub fast
+  %b = fsub fast float -0.0, %a
+  %c = fptrunc float %b to half
+  ret half %c
+}
+
 ; CHECK: test5
 define half @test5(float %a, float %b, float %c) {
 ; CHECK: fcmp ogt





More information about the llvm-commits mailing list