[PATCH] D32042: InstCombine: Fix assert when reassociating fsub with undef

Matt Arsenault via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 13 13:35:48 PDT 2017


arsenm created this revision.
Herald added a subscriber: wdng.

There is logic to track the expected number of instructions
produced. It thought in this case an instruction would
be necessary to negate the result, but here it folded
into a ConstantExpr fneg when the non-undef value operand
was cancelled out by the second fsub.

      

I'm not sure why we don't fold constant FP ops with undef currently,
but I think that would also avoid this problem.


https://reviews.llvm.org/D32042

Files:
  lib/Transforms/InstCombine/InstCombineAddSub.cpp
  test/Transforms/InstCombine/fsub.ll


Index: test/Transforms/InstCombine/fsub.ll
===================================================================
--- test/Transforms/InstCombine/fsub.ll
+++ test/Transforms/InstCombine/fsub.ll
@@ -21,3 +21,47 @@
 
   ret double %t2
 }
+
+; CHECK-LABEL: @fsub_undef(
+; CHECK: %sub = fsub float %val, undef
+define float @fsub_undef(float %val) {
+bb:
+  %sub = fsub float %val, undef
+  ret float %sub
+}
+
+; XXX - Why doesn't this fold to undef?
+; CHECK-LABEL: @fsub_fast_undef(
+; CHCK: %sub = fsub fast float %val, undef
+define float @fsub_fast_undef(float %val) {
+bb:
+  %sub = fsub fast float %val, undef
+  ret float %sub
+}
+
+; CHECK-LABEL: @fneg_undef(
+; CHECK: ret float fsub (float -0.000000e+00, float undef)
+define float @fneg_undef(float %val) {
+bb:
+  %sub = fsub float -0.0, undef
+  ret float %sub
+}
+
+; CHECK-LABEL: @fneg_fast_undef(
+; CHECK: ret float fsub (float -0.000000e+00, float undef)
+define float @fneg_fast_undef(float %val) {
+bb:
+  %sub = fsub fast float -0.0, undef
+  ret float %sub
+}
+
+; This folds to a constant expression, which produced 0 instructions
+; contrary to the expected one for negation.
+; CHECK-LABEL: @inconsistent_numbers_fsub_undef(
+; CHECK: ret float fsub (float -0.000000e+00, float undef)
+define float @inconsistent_numbers_fsub_undef(float %val) {
+bb:
+  %sub0 = fsub fast float %val, undef
+  %sub1 = fsub fast float %sub0, %val
+  ret float %sub1
+}
Index: lib/Transforms/InstCombine/InstCombineAddSub.cpp
===================================================================
--- lib/Transforms/InstCombine/InstCombineAddSub.cpp
+++ lib/Transforms/InstCombine/InstCombineAddSub.cpp
@@ -794,6 +794,11 @@
     if (Opnd->isConstant())
       continue;
 
+    // The constant check above is really for a few special constant
+    // coefficients.
+    if (isa<UndefValue>(Opnd->getSymVal()))
+      continue;
+
     const FAddendCoef &CE = Opnd->getCoef();
     if (CE.isMinusOne() || CE.isMinusTwo())
       NegOpndNum++;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D32042.95194.patch
Type: text/x-patch
Size: 1989 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170413/855f6328/attachment.bin>


More information about the llvm-commits mailing list