From: Patrik Hagglund Date: Mon, 20 Jun 2016 10:19:04 +0000 (+0000) Subject: Avoid output indeterminism between GCC and Clang builds. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7293ea541bdb913afa6a663af18ce51eca62ff2e;p=llvm Avoid output indeterminism between GCC and Clang builds. Remove dependency of the evalution order of function arguments, which is unspecified. Patch by David Stenberg. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273145 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/ScalarEvolutionExpander.cpp b/lib/Analysis/ScalarEvolutionExpander.cpp index bcc4381ebf4..77164356d8e 100644 --- a/lib/Analysis/ScalarEvolutionExpander.cpp +++ b/lib/Analysis/ScalarEvolutionExpander.cpp @@ -1443,8 +1443,12 @@ Value *SCEVExpander::visitAddRecExpr(const SCEVAddRecExpr *S) { } // Just do a normal add. Pre-expand the operands to suppress folding. - return expand(SE.getAddExpr(SE.getUnknown(expand(S->getStart())), - SE.getUnknown(expand(Rest)))); + // + // The LHS and RHS values are factored out of the expand call to make the + // output independent of the argument evaluation order. + const SCEV *AddExprLHS = SE.getUnknown(expand(S->getStart())); + const SCEV *AddExprRHS = SE.getUnknown(expand(Rest)); + return expand(SE.getAddExpr(AddExprLHS, AddExprRHS)); } // If we don't yet have a canonical IV, create one.