From 1daa67ba5002fbdecb862726106424b5510a38c7 Mon Sep 17 00:00:00 2001 From: Tomas Lindquist Olsen Date: Tue, 16 Sep 2008 16:06:39 +0200 Subject: [PATCH] Removed useless assert in ArrayLiteralExp::toConstElem Added second verification pass after optimization Commented an optimization pass out from lvl2, it turns the IR invalid, see llvm PR 2800 --- gen/optimizer.cpp | 3 ++- gen/toir.cpp | 2 -- gen/toobj.cpp | 15 +++++++++++++++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/gen/optimizer.cpp b/gen/optimizer.cpp index 134c79ee..529cbcec 100644 --- a/gen/optimizer.cpp +++ b/gen/optimizer.cpp @@ -41,7 +41,8 @@ void llvmdc_optimize_module(Module* m, char lvl, bool doinline) pm.add(createIPConstantPropagationPass()); pm.add(createDeadArgEliminationPass()); pm.add(createInstructionCombiningPass()); - pm.add(createCFGSimplificationPass()); + // this doesn't work, llvm PR 2800 + //pm.add(createCFGSimplificationPass()); pm.add(createPruneEHPass()); } diff --git a/gen/toir.cpp b/gen/toir.cpp index 4cf3db6b..5406dbfa 100644 --- a/gen/toir.cpp +++ b/gen/toir.cpp @@ -2219,8 +2219,6 @@ LLConstant* ArrayLiteralExp::toConstElem(IRState* p) // dynamic arrays can occur here as well ... bool dyn = (bt->ty == Tarray); - if (!dyn) - assert(arrtype->getNumElements() == elements->dim); // build the initializer std::vector vals(elements->dim, NULL); diff --git a/gen/toobj.cpp b/gen/toobj.cpp index fe0f29d5..5d544cff 100644 --- a/gen/toobj.cpp +++ b/gen/toobj.cpp @@ -154,6 +154,21 @@ void Module::genobjfile(int multiobj) // run optimizer llvmdc_optimize_module(ir.module, global.params.optimizeLevel, global.params.llvmInline); + // verify the llvm + if (!global.params.novalidate && (global.params.optimizeLevel >= 0 || global.params.llvmInline)) { + std::string verifyErr; + Logger::println("Verifying module... again..."); + LOG_SCOPE; + if (llvm::verifyModule(*ir.module,llvm::ReturnStatusAction,&verifyErr)) + { + error("%s", verifyErr.c_str()); + fatal(); + } + else { + Logger::println("Verification passed!"); + } + } + // eventually do our own path stuff, dmd's is a bit strange. typedef llvm::sys::Path LLPath; LLPath bcpath = LLPath(objfile->name->toChars());