[DAGCombiner] Preserve the exact bit when simplifying SRA to SRL.
authorBenjamin Kramer <benny.kra@googlemail.com>
Fri, 26 Jun 2015 14:51:49 +0000 (14:51 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Fri, 26 Jun 2015 14:51:49 +0000 (14:51 +0000)
Allows more aggressive folding of ashr/shl pairs.

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

lib/CodeGen/SelectionDAG/TargetLowering.cpp
test/CodeGen/X86/shift-combine.ll

index c70c3a270403c78d08afe8a5f5d9f705da1de992..b40025b41f7c2af898a7f87a88936e6723222833 100644 (file)
@@ -771,10 +771,13 @@ bool TargetLowering::SimplifyDemandedBits(SDValue Op,
 
       // If the input sign bit is known to be zero, or if none of the top bits
       // are demanded, turn this into an unsigned shift right.
-      if (KnownZero.intersects(SignBit) || (HighBits & ~NewMask) == HighBits)
-        return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::SRL, dl, VT,
-                                                 Op.getOperand(0),
-                                                 Op.getOperand(1)));
+      if (KnownZero.intersects(SignBit) || (HighBits & ~NewMask) == HighBits) {
+        SDNodeFlags Flags;
+        Flags.setExact(cast<BinaryWithFlagsSDNode>(Op)->Flags.hasExact());
+        return TLO.CombineTo(Op,
+                             TLO.DAG.getNode(ISD::SRL, dl, VT, Op.getOperand(0),
+                                             Op.getOperand(1), &Flags));
+      }
 
       int Log2 = NewMask.exactLogBase2();
       if (Log2 >= 0) {
index 7fb19a6cad056c3fb699bb472e2c26617a2e6900..43301041a0b6984fca48f49faf7a2f4c291a6fe0 100644 (file)
@@ -37,6 +37,16 @@ define i32* @test_exact2(i32 %a, i32 %b, i32* %x)  {
   ret i32* %gep
 }
 
+define i32* @test_exact3(i32 %a, i32 %b, i32* %x)  {
+; CHECK-LABEL: test_exact3:
+; CHECK-NOT: sarl
+
+  %sub = sub i32 %b, %a
+  %shr = ashr exact i32 %sub, 2
+  %gep = getelementptr inbounds i32, i32* %x, i32 %shr
+  ret i32* %gep
+}
+
 define i32* @test_exact4(i32 %a, i32 %b, i32* %x)  {
 ; CHECK-LABEL: test_exact4:
 ; CHECK: shrl %