From d62284a8040024afeb8777b514c34912e939b801 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 18 Jan 2009 20:35:00 +0000 Subject: [PATCH] Fix rdar://6505632, an llc crash on 483.xalancbmk git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@62470 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/CodeGenPrepare.cpp | 3 +- .../X86/2009-01-18-ConstantExprCrash.ll | 36 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 test/CodeGen/X86/2009-01-18-ConstantExprCrash.ll diff --git a/lib/Transforms/Scalar/CodeGenPrepare.cpp b/lib/Transforms/Scalar/CodeGenPrepare.cpp index be7ed9c508c..59c6586532c 100644 --- a/lib/Transforms/Scalar/CodeGenPrepare.cpp +++ b/lib/Transforms/Scalar/CodeGenPrepare.cpp @@ -688,7 +688,8 @@ bool AddressingModeMatcher::MatchScaledValue(Value *ScaleReg, int64_t Scale, // to see if ScaleReg is actually X+C. If so, we can turn this into adding // X*Scale + C*Scale to addr mode. ConstantInt *CI; Value *AddLHS; - if (match(ScaleReg, m_Add(m_Value(AddLHS), m_ConstantInt(CI)))) { + if (isa(ScaleReg) && // not a constant expr. + match(ScaleReg, m_Add(m_Value(AddLHS), m_ConstantInt(CI)))) { TestAddrMode.ScaledReg = AddLHS; TestAddrMode.BaseOffs += CI->getSExtValue()*TestAddrMode.Scale; diff --git a/test/CodeGen/X86/2009-01-18-ConstantExprCrash.ll b/test/CodeGen/X86/2009-01-18-ConstantExprCrash.ll new file mode 100644 index 00000000000..8857df38926 --- /dev/null +++ b/test/CodeGen/X86/2009-01-18-ConstantExprCrash.ll @@ -0,0 +1,36 @@ +; RUN: llvm-as < %s | llc +; rdar://6505632 +; reduced from 483.xalancbmk + +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" +target triple = "i386-apple-darwin7" + %"struct.std::basic_ostream >.base" = type { i32 (...)** } + %"struct.xercesc_2_5::ASCIIRangeFactory" = type { %"struct.std::basic_ostream >.base", i8, i8 } +@_ZN11xercesc_2_5L17gIdeographicCharsE = external constant [7 x i16] ; <[7 x i16]*> [#uses=3] + +define void @_ZN11xercesc_2_515XMLRangeFactory11buildRangesEv(%"struct.xercesc_2_5::ASCIIRangeFactory"* %this) { +entry: + br i1 false, label %bb5, label %return + +bb5: ; preds = %entry + br label %bb4.i.i + +bb4.i.i: ; preds = %bb4.i.i, %bb5 + br i1 false, label %bb.i51, label %bb4.i.i + +bb.i51: ; preds = %bb.i51, %bb4.i.i + br i1 false, label %bb4.i.i70, label %bb.i51 + +bb4.i.i70: ; preds = %bb4.i.i70, %bb.i51 + br i1 false, label %_ZN11xercesc_2_59XMLString9stringLenEPKt.exit.i73, label %bb4.i.i70 + +_ZN11xercesc_2_59XMLString9stringLenEPKt.exit.i73: ; preds = %bb4.i.i70 + %0 = load i16* getelementptr ([7 x i16]* @_ZN11xercesc_2_5L17gIdeographicCharsE, i32 0, i32 add (i32 ashr (i32 sub (i32 ptrtoint (i16* getelementptr ([7 x i16]* @_ZN11xercesc_2_5L17gIdeographicCharsE, i32 0, i32 4) to i32), i32 ptrtoint ([7 x i16]* @_ZN11xercesc_2_5L17gIdeographicCharsE to i32)), i32 1), i32 1)), align 4 ; [#uses=0] + br label %bb4.i5.i141 + +bb4.i5.i141: ; preds = %bb4.i5.i141, %_ZN11xercesc_2_59XMLString9stringLenEPKt.exit.i73 + br label %bb4.i5.i141 + +return: ; preds = %entry + ret void +}