[PATCH] Fix shl folding in DAG combiner.

Paweł Bylica chfast at gmail.com
Mon Jun 22 07:58:30 PDT 2015


The code responsible for shl folding in the DAGCombiner was assuming incorrectly that all constants are less than 64 bits. This patch simply changes the way values are compared.

http://reviews.llvm.org/D10602

Files:
  lib/CodeGen/SelectionDAG/DAGCombiner.cpp
  test/CodeGen/X86/fold-vector-shl-crash.ll

Index: lib/CodeGen/SelectionDAG/DAGCombiner.cpp
===================================================================
--- lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -4275,7 +4275,7 @@
   if (isNullConstant(N0))
     return N0;
   // fold (shl x, c >= size(x)) -> undef
-  if (N1C && N1C->getZExtValue() >= OpSizeInBits)
+  if (N1C && N1C->getAPIntValue().uge(OpSizeInBits))
     return DAG.getUNDEF(VT);
   // fold (shl x, 0) -> x
   if (N1C && N1C->isNullValue())
Index: test/CodeGen/X86/fold-vector-shl-crash.ll
===================================================================
--- /dev/null
+++ test/CodeGen/X86/fold-vector-shl-crash.ll
@@ -0,0 +1,13 @@
+; RUN: llc < %s | FileCheck %s
+
+;CHECK-LABEL: test
+define void @test() {
+  %S = shufflevector <2 x i256> zeroinitializer, <2 x i256> <i256 -1, i256 -1>, <2 x i32> <i32 0, i32 2>
+  %B = shl <2 x i256> %S, <i256 -1, i256 -1> ; DAG Combiner crashes here
+  br label %Loop
+
+Loop:                                             ; preds = %Loop, %0
+  %V = shufflevector <2 x i256> zeroinitializer, <2 x i256> %B, <2 x i32> <i32 undef, i32 3>
+  %I = insertelement <2 x i256> %V, i256 246681, i32 1
+  br label %Loop
+}

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D10602.28109.patch
Type: text/x-patch
Size: 1222 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150622/6e22bc89/attachment.bin>


More information about the llvm-commits mailing list