Author: lattner Date: Fri Nov 9 11:33:02 2007 New Revision: 43949 URL: http://llvm.org/viewvc/llvm-project?rev=43949&view=rev Log: Tighten up a check for folding away loads from (newly constant) globals. This fixes a crash on Transforms/GlobalOpt/2007-11-09-GEP-GEP-Crash.ll and rdar://5585488.
Added: llvm/trunk/test/Transforms/GlobalOpt/2007-11-09-GEP-GEP-Crash.ll Modified: llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp Modified: llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp?rev=43949&r1=43948&r2=43949&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp (original) +++ llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp Fri Nov 9 11:33:02 2007 @@ -342,12 +342,17 @@ Changed = true; } } else if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(U)) { - Constant *SubInit = 0; - ConstantExpr *CE = - dyn_cast_or_null<ConstantExpr>(ConstantFoldInstruction(GEP)); - if (Init && CE && CE->getOpcode() == Instruction::GetElementPtr) - SubInit = ConstantFoldLoadThroughGEPConstantExpr(Init, CE); - Changed |= CleanupConstantGlobalUsers(GEP, SubInit); + // Do not transform "gepinst (gep constexpr (GV))" here, because forming + // "gepconstexpr (gep constexpr (GV))" will cause the two gep's to fold + // and will invalidate our notion of what Init is. + if (!isa<ConstantExpr>(GEP->getOperand(0))) { + ConstantExpr *CE = + dyn_cast_or_null<ConstantExpr>(ConstantFoldInstruction(GEP)); + if (Init && CE && CE->getOpcode() == Instruction::GetElementPtr) + if (Constant *SubInit = + ConstantFoldLoadThroughGEPConstantExpr(Init, CE)) + Changed |= CleanupConstantGlobalUsers(GEP, SubInit); + } if (GEP->use_empty()) { GEP->eraseFromParent(); Added: llvm/trunk/test/Transforms/GlobalOpt/2007-11-09-GEP-GEP-Crash.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalOpt/2007-11-09-GEP-GEP-Crash.ll?rev=43949&view=auto ============================================================================== --- llvm/trunk/test/Transforms/GlobalOpt/2007-11-09-GEP-GEP-Crash.ll (added) +++ llvm/trunk/test/Transforms/GlobalOpt/2007-11-09-GEP-GEP-Crash.ll Fri Nov 9 11:33:02 2007 @@ -0,0 +1,19 @@ +; RUN: llvm-as < %s | opt -globalopt -disable-output +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-f128:64:128" +target triple = "powerpc-apple-darwin8" + %struct.empty0 = type { } + %struct.es = type { %struct.empty0 } + %struct.es1 = type { %struct.empty0 } [EMAIL PROTECTED] = internal global [6 x [2 x i32]] [ [2 x i32] [ i32 1, i32 1 ], [2 x i32] [ i32 1, i32 1 ], [2 x i32] [ i32 1, i32 1 ], [2 x i32] [ i32 1, i32 1 ], [2 x i32] [ i32 1, i32 1 ], [2 x i32] [ i32 1, i32 1 ] ] ; <[6 x [2 x i32]]*> [#uses=1] [EMAIL PROTECTED] = internal global [0 x [2 x i32]] zeroinitializer ; <[0 x [2 x i32]]*> [#uses=1] + +define i8 @func() { +entry: + %tmp10 = getelementptr [2 x i32]* getelementptr ([6 x [2 x i32]]* @aaui1, i32 0, i32 0), i32 5, i32 1 ; <i32*> [#uses=1] + %tmp11 = load i32* %tmp10, align 4 ; <i32> [#uses=1] + %tmp12 = call i32 (...)* @func3( i32* null, i32 0, i32 %tmp11 ) ; <i32> [#uses=0] + ret i8 undef +} + +declare i32 @func3(...) + _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits