OSDN Git Service

[Reassociate] Remove bogus assert reported in PR42349.
authorCameron McInally <cameron.mcinally@nyu.edu>
Thu, 20 Jun 2019 23:03:55 +0000 (23:03 +0000)
committerCameron McInally <cameron.mcinally@nyu.edu>
Thu, 20 Jun 2019 23:03:55 +0000 (23:03 +0000)
Also, add a FIXME for the unsafe transform on a unary FNeg. A unary FNeg can only be transformed to a FMul by -1.0 when the nnan flag is present. The unary FNeg project is a WIP, so the unsafe transformation is acceptable until that work is complete.

The bogus assert with introduced in D63445.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@363998 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/Reassociate.cpp
test/Transforms/Reassociate/pr42349.ll [new file with mode: 0644]

index 72fbcd1..1c06ffc 100644 (file)
@@ -268,11 +268,7 @@ static BinaryOperator *CreateNeg(Value *S1, const Twine &Name,
 static BinaryOperator *LowerNegateToMultiply(Instruction *Neg) {
   assert((isa<UnaryOperator>(Neg) || isa<BinaryOperator>(Neg)) &&
          "Expected a Negate!");
-  // It's not safe to lower a unary FNeg into a FMul by -1.0. However,
-  // we can only reach this function with fast flags set, so it's
-  // safe to do with nnan.
-  assert((!isa<FPMathOperator>(Neg) || Neg->isFast()) &&
-          "Expecting FastMathFlags!");
+  // FIXME: It's not safe to lower a unary FNeg into a FMul by -1.0.
   unsigned OpNo = isa<BinaryOperator>(Neg) ? 1 : 0;
   Type *Ty = Neg->getType();
   Constant *NegOne = Ty->isIntOrIntVectorTy() ?
diff --git a/test/Transforms/Reassociate/pr42349.ll b/test/Transforms/Reassociate/pr42349.ll
new file mode 100644 (file)
index 0000000..ce008c3
--- /dev/null
@@ -0,0 +1,18 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -reassociate -S | FileCheck %s
+
+define  float @wibble(float %tmp6) #0 {
+; CHECK-LABEL: @wibble(
+; CHECK-NEXT:  bb:
+; CHECK-NEXT:    [[TMP7:%.*]] = fmul float [[TMP6:%.*]], -1.000000e+00
+; CHECK-NEXT:    [[TMP0:%.*]] = fsub float -0.000000e+00, 0.000000e+00
+; CHECK-NEXT:    [[TMP9:%.*]] = fmul fast float [[TMP6]], 0xFFF0000000000000
+; CHECK-NEXT:    ret float [[TMP9]]
+;
+bb:
+  %tmp7 = fsub float -0.000000e+00, %tmp6
+  %tmp9 = fmul fast float %tmp7, 0x7FF0000000000000
+  ret float %tmp9
+}
+
+attributes #0 = { "use-soft-float"="false" }