[llvm] r285656 - [DAG] disable nsw/nuw for add/sub/mul when simplifying based on demanded bits (PR30841)

Sanjay Patel via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 31 16:28:45 PDT 2016


Author: spatel
Date: Mon Oct 31 18:28:45 2016
New Revision: 285656

URL: http://llvm.org/viewvc/llvm-project?rev=285656&view=rev
Log:
[DAG] disable nsw/nuw for add/sub/mul when simplifying based on demanded bits (PR30841)

This bug was exposed by using nsw/nuw for more aggressive folds in:
https://reviews.llvm.org/rL284844

The changes mimic the IR demanded bits logic in InstCombiner::SimplifyDemandedUseBits(),
but we can't just flip flag bits in the DAG; we have to create a new node that has the
bits cleared.

This should fix:
https://llvm.org/bugs/show_bug.cgi?id=30841 

Added:
    llvm/trunk/test/CodeGen/X86/add-sub-nsw-nuw.ll
Modified:
    llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp

Modified: llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp?rev=285656&r1=285655&r2=285656&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp Mon Oct 31 18:28:45 2016
@@ -1216,14 +1216,25 @@ bool TargetLowering::SimplifyDemandedBit
     APInt LoMask = APInt::getLowBitsSet(BitWidth,
                                         BitWidth - NewMask.countLeadingZeros());
     if (SimplifyDemandedBits(Op.getOperand(0), LoMask, KnownZero2,
-                             KnownOne2, TLO, Depth+1))
-      return true;
-    if (SimplifyDemandedBits(Op.getOperand(1), LoMask, KnownZero2,
-                             KnownOne2, TLO, Depth+1))
-      return true;
-    // See if the operation should be performed at a smaller bit width.
-    if (TLO.ShrinkDemandedOp(Op, BitWidth, NewMask, dl))
+                             KnownOne2, TLO, Depth+1) ||
+        SimplifyDemandedBits(Op.getOperand(1), LoMask, KnownZero2,
+                             KnownOne2, TLO, Depth+1) ||
+        // See if the operation should be performed at a smaller bit width.
+        TLO.ShrinkDemandedOp(Op, BitWidth, NewMask, dl)) {
+      const SDNodeFlags *Flags = Op.getNode()->getFlags();
+      if (Flags->hasNoSignedWrap() || Flags->hasNoUnsignedWrap()) {
+        // Disable the nsw and nuw flags. We can no longer guarantee that we
+        // won't wrap after simplification.
+        SDNodeFlags NewFlags = *Flags;
+        NewFlags.setNoSignedWrap(false);
+        NewFlags.setNoUnsignedWrap(false);
+        SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), dl, Op.getValueType(),
+                                        Op.getOperand(0), Op.getOperand(1),
+                                        &NewFlags);
+        return TLO.CombineTo(Op, NewOp);
+      }
       return true;
+    }
     LLVM_FALLTHROUGH;
   }
   default:

Added: llvm/trunk/test/CodeGen/X86/add-sub-nsw-nuw.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/add-sub-nsw-nuw.ll?rev=285656&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/X86/add-sub-nsw-nuw.ll (added)
+++ llvm/trunk/test/CodeGen/X86/add-sub-nsw-nuw.ll Mon Oct 31 18:28:45 2016
@@ -0,0 +1,25 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: llc -mtriple=i386-apple-darwin < %s | FileCheck %s
+
+; PR30841: https://llvm.org/bugs/show_bug.cgi?id=30841
+; Demanded bits analysis must disable nsw/nuw when it makes a
+; simplification to add/sub such as in this case.
+
+define i8 @PR30841(i64 %argc) {
+; CHECK-LABEL: PR30841:
+; CHECK:       ## BB#0: ## %entry
+; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; CHECK-NEXT:    negl %eax
+; CHECK-NEXT:    ## kill: %AL<def> %AL<kill> %EAX<kill>
+; CHECK-NEXT:    retl
+;
+entry:
+  %or = or i64 %argc, -4294967296
+  br label %end
+
+end:
+  %neg = sub nuw nsw i64 -4294967296, %argc
+  %trunc = trunc i64 %neg to i8
+  ret i8 %trunc
+}
+




More information about the llvm-commits mailing list