aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>2013-10-17 11:02:58 +0000
committerAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>2013-10-17 11:02:58 +0000
commit888cbad774acdff580611f6b07daaf96e825b7e7 (patch)
tree22f43761786a3b5d5a9d69ae13c789ae3a7d2e0d
parentf5e3811607dd54fded0bb6b6ab97345446e086b9 (diff)
downloadexternal_llvm-888cbad774acdff580611f6b07daaf96e825b7e7.zip
external_llvm-888cbad774acdff580611f6b07daaf96e825b7e7.tar.gz
external_llvm-888cbad774acdff580611f6b07daaf96e825b7e7.tar.bz2
Fix edge condition in DAGCombiner to improve codegen of shift sequences.
When canonicalizing dags according to the rule (shl (zext (shr X, c1) ), c1) ==> (zext (shl (shr X, c1), c1)) remember to add the new shl dag to the DAGCombiner worklist of nodes. If we don't explicitly add it to the worklist of nodes to visit, we may not trigger later on the rule that folds the shift left + logical shift right into a AND instruction with bitmask. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@192883 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/CodeGen/SelectionDAG/DAGCombiner.cpp1
-rw-r--r--test/CodeGen/X86/dagcombine-shifts.ll8
2 files changed, 9 insertions, 0 deletions
diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index a01d563..0179cf1 100644
--- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -3794,6 +3794,7 @@ SDValue DAGCombiner::visitSHL(SDNode *N) {
EVT CountVT = NewOp0.getOperand(1).getValueType();
SDValue NewSHL = DAG.getNode(ISD::SHL, SDLoc(N), NewOp0.getValueType(),
NewOp0, DAG.getConstant(c2, CountVT));
+ AddToWorkList(NewSHL.getNode());
return DAG.getNode(ISD::ZERO_EXTEND, SDLoc(N0), VT, NewSHL);
}
}
diff --git a/test/CodeGen/X86/dagcombine-shifts.ll b/test/CodeGen/X86/dagcombine-shifts.ll
index e5a67d7..905cf05 100644
--- a/test/CodeGen/X86/dagcombine-shifts.ll
+++ b/test/CodeGen/X86/dagcombine-shifts.ll
@@ -187,6 +187,8 @@ entry:
; Once the add is removed, the number of uses becomes one and therefore the
; dags are canonicalized. After Legalization, we need to make sure that the
; valuetype for the shift count is legal.
+; Verify also that we correctly fold the shl-shr sequence into an
+; AND with bitmask.
define void @g(i32 %a) {
%b = lshr i32 %a, 2
@@ -197,5 +199,11 @@ define void @g(i32 %a) {
ret void
}
+; CHECK-LABEL: @g
+; CHECK-NOT: shr
+; CHECK-NOT: shl
+; CHECK: and
+; CHECK-NEXT: jmp
+
declare void @f(i64)