<div dir="ltr">Hi Tobias,<div><br></div><div>Thank you for fixing it.</div><div>It looks like none of the region passes in main llvm repository is an analysis, otherwise the bug should have been caught during check-llvm.</div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature" data-smartmail="gmail_signature">Thanks,<br>--Serge<br></div></div>
<br><div class="gmail_quote">2017-01-13 16:13 GMT+07:00 Tobias Grosser <span dir="ltr"><<a href="mailto:tobias.grosser@inf.ethz.ch" target="_blank">tobias.grosser@inf.ethz.ch</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Serge,<br>
<br>
this change broke the RegionPasses used by Polly. I tried to fix the<br>
problem in<br>
r291887, but would appreciate if you could post-commit review the fix I<br>
committed.<br>
<br>
Best,<br>
Tobias<br>
<div class="HOEnZb"><div class="h5"><br>
On Fri, Jan 13, 2017, at 07:09 AM, Serge Pavlov via llvm-commits wrote:<br>
> Author: sepavloff<br>
> Date: Fri Jan 13 00:09:54 2017<br>
> New Revision: 291882<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=291882&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=291882&view=rev</a><br>
> Log:<br>
> Track validity of pass results<br>
><br>
> Running tests with expensive checks enabled exhibits some problems with<br>
> verification of pass results.<br>
><br>
> First, the pass verification may require results of analysis that are not<br>
> available. For instance, verification of loop info requires results of<br>
> dominator<br>
> tree analysis. A pass may be marked as conserving loop info but does not<br>
> need to<br>
> be dependent on DominatorTreePass. When a pass manager tries to verify<br>
> that loop<br>
> info is valid, it needs dominator tree, but corresponding analysis may be<br>
> already destroyed as no user of it remained.<br>
><br>
> Another case is a pass that is skipped. For instance, entities with<br>
> linkage<br>
> available_externally do not need code generation and such passes are<br>
> skipped for<br>
> them. In this case result verification must also be skipped.<br>
><br>
> To solve these problems this change introduces a special flag to the Pass<br>
> structure to mark passes that have valid results. If this flag is reset,<br>
> verifications dependent on the pass result are skipped.<br>
><br>
> Differential Revision: <a href="https://reviews.llvm.org/D27190" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D27190</a><br>
><br>
> Modified:<br>
> llvm/trunk/include/llvm/Pass.h<br>
> llvm/trunk/include/llvm/<wbr>PassAnalysisSupport.h<br>
> llvm/trunk/lib/Analysis/<wbr>CallGraphSCCPass.cpp<br>
> llvm/trunk/lib/Analysis/<wbr>LoopInfo.cpp<br>
> llvm/trunk/lib/Analysis/<wbr>LoopPass.cpp<br>
> llvm/trunk/lib/CodeGen/<wbr>MachineDominators.cpp<br>
> llvm/trunk/lib/CodeGen/<wbr>MachineFunctionPass.cpp<br>
> llvm/trunk/lib/IR/<wbr>LegacyPassManager.cpp<br>
> llvm/trunk/lib/IR/Pass.cpp<br>
> llvm/trunk/test/CodeGen/<wbr>Generic/externally_available.<wbr>ll<br>
> llvm/trunk/test/CodeGen/Mips/<wbr>mul.ll<br>
><br>
> Modified: llvm/trunk/include/llvm/Pass.h<br>
> URL:<br>
> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Pass.h?rev=291882&r1=291881&r2=291882&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/include/<wbr>llvm/Pass.h?rev=291882&r1=<wbr>291881&r2=291882&view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- llvm/trunk/include/llvm/Pass.h (original)<br>
> +++ llvm/trunk/include/llvm/Pass.h Fri Jan 13 00:09:54 2017<br>
> @@ -29,6 +29,7 @@<br>
> #ifndef LLVM_PASS_H<br>
> #define LLVM_PASS_H<br>
><br>
> +#include <assert.h><br>
> #include <string><br>
><br>
> namespace llvm {<br>
> @@ -82,17 +83,40 @@ class Pass {<br>
> AnalysisResolver *Resolver; // Used to resolve analysis<br>
> const void *PassID;<br>
> PassKind Kind;<br>
> + bool Executed;<br>
> +<br>
> void operator=(const Pass&) = delete;<br>
> Pass(const Pass &) = delete;<br>
><br>
> public:<br>
> explicit Pass(PassKind K, char &pid)<br>
> - : Resolver(nullptr), PassID(&pid), Kind(K) { }<br>
> + : Resolver(nullptr), PassID(&pid), Kind(K), Executed(false) { }<br>
> virtual ~Pass();<br>
><br>
> -<br>
> PassKind getPassKind() const { return Kind; }<br>
><br>
> + /// Returns true if the pass has already executed.<br>
> + ///<br>
> + /// For an analysis pass it means the result is available. If the<br>
> function<br>
> + /// returns false, the pass was not run, was skipped or freed.<br>
> + ///<br>
> + bool isExecuted() const { return Executed; }<br>
> +<br>
> + /// Marks the pass as executed or not.<br>
> + ///<br>
> + /// A pass should be marked as executed, if its 'runOn*' method<br>
> successfully<br>
> + /// finished. When the pass is not needed anymore, it is marked as<br>
> + /// 'non-executed', it takes place in \c freePass. It also occurs when<br>
> the<br>
> + /// pass is skipped for some reason.<br>
> + ///<br>
> + /// The flag should be set prior to call to 'runOn*' method. If it<br>
> decides<br>
> + /// that the pass should be skipped, it will reset the flag.<br>
> + ///<br>
> + void setExecuted(bool x) {<br>
> + assert(x || !getAsImmutablePass()); // Immutable pass cannot be<br>
> invalidated.<br>
> + Executed = x;<br>
> + }<br>
> +<br>
> /// getPassName - Return a nice clean name for a pass. This usually<br>
> /// implemented in terms of the name that is registered by one of the<br>
> /// Registration templates, but can be overloaded directly.<br>
> @@ -279,8 +303,7 @@ public:<br>
> ///<br>
> bool runOnModule(Module &) override { return false; }<br>
><br>
> - explicit ImmutablePass(char &pid)<br>
> - : ModulePass(pid) {}<br>
> + explicit ImmutablePass(char &pid) : ModulePass(pid) {<br>
> setExecuted(true); }<br>
><br>
> // Force out-of-line virtual method.<br>
> ~ImmutablePass() override;<br>
> @@ -316,8 +339,9 @@ public:<br>
> protected:<br>
> /// Optional passes call this function to check whether the pass<br>
> should be<br>
> /// skipped. This is the case when Attribute::OptimizeNone is set or<br>
> when<br>
> - /// optimization bisect is over the limit.<br>
> - bool skipFunction(const Function &F) const;<br>
> + /// optimization bisect is over the limit. It also resets flag<br>
> Executed on<br>
> + /// the pass.<br>
> + bool skipFunction(const Function &F);<br>
> };<br>
><br>
><br>
><br>
> Modified: llvm/trunk/include/llvm/<wbr>PassAnalysisSupport.h<br>
> URL:<br>
> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/PassAnalysisSupport.h?rev=291882&r1=291881&r2=291882&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/include/<wbr>llvm/PassAnalysisSupport.h?<wbr>rev=291882&r1=291881&r2=<wbr>291882&view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- llvm/trunk/include/llvm/<wbr>PassAnalysisSupport.h (original)<br>
> +++ llvm/trunk/include/llvm/<wbr>PassAnalysisSupport.h Fri Jan 13 00:09:54<br>
> 2017<br>
> @@ -206,6 +206,9 @@ AnalysisType *Pass::getAnalysisIfAvailab<br>
> Pass *ResultPass = Resolver-><wbr>getAnalysisIfAvailable(PI, true);<br>
> if (!ResultPass) return nullptr;<br>
><br>
> + if (!ResultPass->isExecuted())<br>
> + return nullptr;<br>
> +<br>
> // Because the AnalysisType may not be a subclass of pass (for<br>
> // AnalysisGroups), we use getAdjustedAnalysisPointer here to<br>
> potentially<br>
> // adjust the return pointer (because the class may multiply inherit,<br>
> once<br>
> @@ -234,6 +237,8 @@ AnalysisType &Pass::getAnalysisID(Analys<br>
> assert (ResultPass &&<br>
> "getAnalysis*() called on an analysis that was not "<br>
> "'required' by pass!");<br>
> + assert(ResultPass->isExecuted(<wbr>) &&<br>
> + "getAnalysis*() called on an analysis that was freed");<br>
><br>
> // Because the AnalysisType may not be a subclass of pass (for<br>
> // AnalysisGroups), we use getAdjustedAnalysisPointer here to<br>
> potentially<br>
><br>
> Modified: llvm/trunk/lib/Analysis/<wbr>CallGraphSCCPass.cpp<br>
> URL:<br>
> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/CallGraphSCCPass.cpp?rev=291882&r1=291881&r2=291882&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>Analysis/CallGraphSCCPass.cpp?<wbr>rev=291882&r1=291881&r2=<wbr>291882&view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- llvm/trunk/lib/Analysis/<wbr>CallGraphSCCPass.cpp (original)<br>
> +++ llvm/trunk/lib/Analysis/<wbr>CallGraphSCCPass.cpp Fri Jan 13 00:09:54 2017<br>
> @@ -414,6 +414,7 @@ bool CGPassManager::<wbr>RunAllPassesOnSCC(Ca<br>
> initializeAnalysisImpl(P);<br>
><br>
> // Actually run this pass on the current SCC.<br>
> + P->setExecuted(true);<br>
> Changed |= RunPassOnSCC(P, CurSCC, CG,<br>
> CallGraphUpToDate, DevirtualizedCall);<br>
><br>
><br>
> Modified: llvm/trunk/lib/Analysis/<wbr>LoopInfo.cpp<br>
> URL:<br>
> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LoopInfo.cpp?rev=291882&r1=291881&r2=291882&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>Analysis/LoopInfo.cpp?rev=<wbr>291882&r1=291881&r2=291882&<wbr>view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- llvm/trunk/lib/Analysis/<wbr>LoopInfo.cpp (original)<br>
> +++ llvm/trunk/lib/Analysis/<wbr>LoopInfo.cpp Fri Jan 13 00:09:54 2017<br>
> @@ -722,8 +722,10 @@ void LoopInfoWrapperPass::<wbr>verifyAnalysis<br>
> // checking by default, LoopPass has been taught to call verifyLoop<br>
> manually<br>
> // during loop pass sequences.<br>
> if (VerifyLoopInfo) {<br>
> - auto &DT = getAnalysis<<wbr>DominatorTreeWrapperPass>().<wbr>getDomTree();<br>
> - LI.verify(DT);<br>
> + if (auto *Analysis =<br>
> getAnalysisIfAvailable<<wbr>DominatorTreeWrapperPass>()) {<br>
> + auto &DT = Analysis->getDomTree();<br>
> + LI.verify(DT);<br>
> + }<br>
> }<br>
> }<br>
><br>
><br>
> Modified: llvm/trunk/lib/Analysis/<wbr>LoopPass.cpp<br>
> URL:<br>
> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LoopPass.cpp?rev=291882&r1=291881&r2=291882&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>Analysis/LoopPass.cpp?rev=<wbr>291882&r1=291881&r2=291882&<wbr>view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- llvm/trunk/lib/Analysis/<wbr>LoopPass.cpp (original)<br>
> +++ llvm/trunk/lib/Analysis/<wbr>LoopPass.cpp Fri Jan 13 00:09:54 2017<br>
> @@ -198,6 +198,7 @@ bool LPPassManager::runOnFunction(<wbr>Functi<br>
> PassManagerPrettyStackEntry X(P, *CurrentLoop->getHeader());<br>
> TimeRegion PassTimer(getPassTimer(P));<br>
><br>
> + P->setExecuted(true);<br>
> Changed |= P->runOnLoop(CurrentLoop, *this);<br>
> }<br>
> LoopWasDeleted = CurrentLoop->isInvalid();<br>
><br>
> Modified: llvm/trunk/lib/CodeGen/<wbr>MachineDominators.cpp<br>
> URL:<br>
> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineDominators.cpp?rev=291882&r1=291881&r2=291882&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>CodeGen/MachineDominators.cpp?<wbr>rev=291882&r1=291881&r2=<wbr>291882&view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- llvm/trunk/lib/CodeGen/<wbr>MachineDominators.cpp (original)<br>
> +++ llvm/trunk/lib/CodeGen/<wbr>MachineDominators.cpp Fri Jan 13 00:09:54 2017<br>
> @@ -69,7 +69,7 @@ void MachineDominatorTree::<wbr>releaseMemory<br>
> }<br>
><br>
> void MachineDominatorTree::<wbr>verifyAnalysis() const {<br>
> - if (VerifyMachineDomInfo)<br>
> + if (VerifyMachineDomInfo && isExecuted())<br>
> verifyDomTree();<br>
> }<br>
><br>
><br>
> Modified: llvm/trunk/lib/CodeGen/<wbr>MachineFunctionPass.cpp<br>
> URL:<br>
> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineFunctionPass.cpp?rev=291882&r1=291881&r2=291882&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>CodeGen/MachineFunctionPass.<wbr>cpp?rev=291882&r1=291881&r2=<wbr>291882&view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- llvm/trunk/lib/CodeGen/<wbr>MachineFunctionPass.cpp (original)<br>
> +++ llvm/trunk/lib/CodeGen/<wbr>MachineFunctionPass.cpp Fri Jan 13 00:09:54<br>
> 2017<br>
> @@ -38,8 +38,10 @@ Pass *MachineFunctionPass::<wbr>createPrinter<br>
> bool MachineFunctionPass::<wbr>runOnFunction(Function &F) {<br>
> // Do not codegen any 'available_externally' functions at all, they<br>
> have<br>
> // definitions outside the translation unit.<br>
> - if (F.<wbr>hasAvailableExternallyLinkage(<wbr>))<br>
> + if (F.<wbr>hasAvailableExternallyLinkage(<wbr>)) {<br>
> + setExecuted(false);<br>
> return false;<br>
> + }<br>
><br>
> MachineModuleInfo &MMI = getAnalysis<MachineModuleInfo><wbr>();<br>
> MachineFunction &MF = MMI.getMachineFunction(F);<br>
><br>
> Modified: llvm/trunk/lib/IR/<wbr>LegacyPassManager.cpp<br>
> URL:<br>
> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/LegacyPassManager.cpp?rev=291882&r1=291881&r2=291882&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/IR/<wbr>LegacyPassManager.cpp?rev=<wbr>291882&r1=291881&r2=291882&<wbr>view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- llvm/trunk/lib/IR/<wbr>LegacyPassManager.cpp (original)<br>
> +++ llvm/trunk/lib/IR/<wbr>LegacyPassManager.cpp Fri Jan 13 00:09:54 2017<br>
> @@ -955,6 +955,9 @@ void PMDataManager::freePass(Pass *P, St<br>
> AvailableAnalysis.erase(Pos);<br>
> }<br>
> }<br>
> +<br>
> + if (!P->getAsImmutablePass())<br>
> + P->setExecuted(false);<br>
> }<br>
><br>
> /// Add pass P into the PassVector. Update<br>
> @@ -1293,6 +1296,7 @@ bool BBPassManager::runOnFunction(<wbr>Functi<br>
> PassManagerPrettyStackEntry X(BP, *I);<br>
> TimeRegion PassTimer(getPassTimer(BP));<br>
><br>
> + BP->setExecuted(true);<br>
> LocalChanged |= BP->runOnBasicBlock(*I);<br>
> }<br>
><br>
> @@ -1459,7 +1463,9 @@ bool FunctionPassManagerImpl::run(<wbr>Functi<br>
><br>
> initializeAllAnalysisInfo();<br>
> for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {<br>
> - Changed |= getContainedManager(Index)-><wbr>runOnFunction(F);<br>
> + FPPassManager *P = getContainedManager(Index);<br>
> + P->setExecuted(true);<br>
> + Changed |= P->runOnFunction(F);<br>
> F.getContext().yield();<br>
> }<br>
><br>
> @@ -1510,6 +1516,7 @@ bool FPPassManager::runOnFunction(<wbr>Functi<br>
> PassManagerPrettyStackEntry X(FP, F);<br>
> TimeRegion PassTimer(getPassTimer(FP));<br>
><br>
> + FP->setExecuted(true);<br>
> LocalChanged |= FP->runOnFunction(F);<br>
> }<br>
><br>
> @@ -1530,8 +1537,10 @@ bool FPPassManager::runOnFunction(<wbr>Functi<br>
> bool FPPassManager::runOnModule(<wbr>Module &M) {<br>
> bool Changed = false;<br>
><br>
> - for (Function &F : M)<br>
> + for (Function &F : M) {<br>
> + setExecuted(true);<br>
> Changed |= runOnFunction(F);<br>
> + }<br>
><br>
> return Changed;<br>
> }<br>
> @@ -1587,6 +1596,7 @@ MPPassManager::runOnModule(<wbr>Module &M) {<br>
> PassManagerPrettyStackEntry X(MP, M);<br>
> TimeRegion PassTimer(getPassTimer(MP));<br>
><br>
> + MP->setExecuted(true);<br>
> LocalChanged |= MP->runOnModule(M);<br>
> }<br>
><br>
> @@ -1690,7 +1700,9 @@ bool PassManagerImpl::run(Module &M) {<br>
><br>
> initializeAllAnalysisInfo();<br>
> for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {<br>
> - Changed |= getContainedManager(Index)-><wbr>runOnModule(M);<br>
> + MPPassManager *P = getContainedManager(Index);<br>
> + P->setExecuted(true);<br>
> + Changed |= P->runOnModule(M);<br>
> M.getContext().yield();<br>
> }<br>
><br>
><br>
> Modified: llvm/trunk/lib/IR/Pass.cpp<br>
> URL:<br>
> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Pass.cpp?rev=291882&r1=291881&r2=291882&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/IR/<wbr>Pass.cpp?rev=291882&r1=291881&<wbr>r2=291882&view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- llvm/trunk/lib/IR/Pass.cpp (original)<br>
> +++ llvm/trunk/lib/IR/Pass.cpp Fri Jan 13 00:09:54 2017<br>
> @@ -146,13 +146,16 @@ PassManagerType FunctionPass::getPotenti<br>
> return PMT_FunctionPassManager;<br>
> }<br>
><br>
> -bool FunctionPass::skipFunction(<wbr>const Function &F) const {<br>
> - if (!F.getContext().getOptBisect(<wbr>).shouldRunPass(this, F))<br>
> +bool FunctionPass::skipFunction(<wbr>const Function &F) {<br>
> + if (!F.getContext().getOptBisect(<wbr>).shouldRunPass(this, F)) {<br>
> + setExecuted(false);<br>
> return true;<br>
> + }<br>
><br>
> if (F.hasFnAttribute(Attribute::<wbr>OptimizeNone)) {<br>
> DEBUG(dbgs() << "Skipping pass '" << getPassName() << "' on function<br>
> "<br>
> << F.getName() << "\n");<br>
> + setExecuted(false);<br>
> return true;<br>
> }<br>
> return false;<br>
><br>
> Modified: llvm/trunk/test/CodeGen/<wbr>Generic/externally_available.<wbr>ll<br>
> URL:<br>
> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Generic/externally_available.ll?rev=291882&r1=291881&r2=291882&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/Generic/externally_<wbr>available.ll?rev=291882&r1=<wbr>291881&r2=291882&view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- llvm/trunk/test/CodeGen/<wbr>Generic/externally_available.<wbr>ll (original)<br>
> +++ llvm/trunk/test/CodeGen/<wbr>Generic/externally_available.<wbr>ll Fri Jan 13<br>
> 00:09:54 2017<br>
> @@ -1,4 +1,4 @@<br>
> -; RUN: llc < %s | not grep test_<br>
> +; RUN: llc -verify-machine-dom-info < %s | not grep test_<br>
><br>
> ; test_function should not be emitted to the .s file.<br>
> define available_externally i32 @test_function() {<br>
><br>
> Modified: llvm/trunk/test/CodeGen/Mips/<wbr>mul.ll<br>
> URL:<br>
> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Mips/mul.ll?rev=291882&r1=291881&r2=291882&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/Mips/mul.ll?rev=<wbr>291882&r1=291881&r2=291882&<wbr>view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- llvm/trunk/test/CodeGen/Mips/<wbr>mul.ll (original)<br>
> +++ llvm/trunk/test/CodeGen/Mips/<wbr>mul.ll Fri Jan 13 00:09:54 2017<br>
> @@ -1,4 +1,4 @@<br>
> -; RUN: llc -march=mipsel -mattr=mips16 -relocation-model=pic -O3 < %s |<br>
> FileCheck %s -check-prefix=16<br>
> +; RUN: llc -march=mipsel -mattr=mips16 -relocation-model=pic -O3<br>
> -verify-loop-info < %s | FileCheck %s -check-prefix=16<br>
><br>
> @iiii = global i32 5, align 4<br>
> @jjjj = global i32 -6, align 4<br>
><br>
><br>
> ______________________________<wbr>_________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</div></div></blockquote></div><br></div></div>