[llvm] r246217 - [CodeGen] Check FoldConstantArithmetic result before using it.

Ahmed Bougacha via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 27 14:46:05 PDT 2015


Author: ab
Date: Thu Aug 27 16:46:04 2015
New Revision: 246217

URL: http://llvm.org/viewvc/llvm-project?rev=246217&view=rev
Log:
[CodeGen] Check FoldConstantArithmetic result before using it.

Fixes PR24602: r245689 introduced an unguarded use of
SelectionDAG::FoldConstantArithmetic, which returns 0 when it fails
because of opaque (hoisted) constants.

Added:
    llvm/trunk/test/CodeGen/X86/pr24602.ll
Modified:
    llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=246217&r1=246216&r2=246217&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Thu Aug 27 16:46:04 2015
@@ -4457,8 +4457,9 @@ SDValue DAGCombiner::visitSHL(SDNode *N)
   // fold (shl (mul x, c1), c2) -> (mul x, c1 << c2)
   if (N1C && N0.getOpcode() == ISD::MUL && N0.getNode()->hasOneUse()) {
     if (ConstantSDNode *N0C1 = isConstOrConstSplat(N0.getOperand(1))) {
-      SDValue Folded = DAG.FoldConstantArithmetic(ISD::SHL, SDLoc(N1), VT, N0C1, N1C);
-      return DAG.getNode(ISD::MUL, SDLoc(N), VT, N0.getOperand(0), Folded);
+      if (SDValue Folded =
+              DAG.FoldConstantArithmetic(ISD::SHL, SDLoc(N1), VT, N0C1, N1C))
+        return DAG.getNode(ISD::MUL, SDLoc(N), VT, N0.getOperand(0), Folded);
     }
   }
 

Added: llvm/trunk/test/CodeGen/X86/pr24602.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/pr24602.ll?rev=246217&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/X86/pr24602.ll (added)
+++ llvm/trunk/test/CodeGen/X86/pr24602.ll Thu Aug 27 16:46:04 2015
@@ -0,0 +1,17 @@
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown  | FileCheck %s
+
+; PR24602: Make sure we don't barf on non-foldable code (with opaque constants).
+
+; CHECK-LABEL: pr24602:
+; CHECK-NEXT: # BB#0
+; CHECK-NEXT: movabsq $-10000000000, [[CST:%[a-z0-9]+]]
+; CHECK-NEXT: imulq [[CST]], %rsi
+; CHECK-NEXT: leaq (%rdi,%rsi,8), %rax
+; CHECK-NEXT: movq [[CST]], (%rdi,%rsi,8)
+; CHECK-NEXT: retq
+define i64* @pr24602(i64* %p, i64 %n) nounwind {
+  %mul = mul nsw i64 %n, -10000000000
+  %add.ptr = getelementptr inbounds i64, i64* %p, i64 %mul
+  store i64 -10000000000, i64* %add.ptr
+  ret i64* %add.ptr
+}




More information about the llvm-commits mailing list