From: David Majnemer Date: Mon, 17 Nov 2014 11:27:45 +0000 (+0000) Subject: ScalarEvolution: Construct SCEVDivision's Derived type instead of itself X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5d2670c52a840266d9b2756a15a43731a74c500a;p=platform%2Fupstream%2Fllvm.git ScalarEvolution: Construct SCEVDivision's Derived type instead of itself SCEVDivision::divide constructed an object of SCEVDivision instead of Derived. divide would call visit which would cast the SCEVDivision to type Derived. As it happens, SCEVDivision and Derived currently have the same layout but this is fragile and grounds for UB. Instead, just construct Derived. No functional change intended. llvm-svn: 222126 --- diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp index 4a6d028..3877f9c 100644 --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -767,7 +767,7 @@ public: const SCEV **Remainder) { assert(Numerator && Denominator && "Uninitialized SCEV"); - SCEVDivision D(SE, Numerator, Denominator); + Derived D(SE, Numerator, Denominator); // Check for the trivial case here to avoid having to check for it in the // rest of the code. @@ -808,17 +808,6 @@ public: *Remainder = D.Remainder; } - SCEVDivision(ScalarEvolution &S, const SCEV *Numerator, const SCEV *Denominator) - : SE(S), Denominator(Denominator) { - Zero = SE.getConstant(Denominator->getType(), 0); - One = SE.getConstant(Denominator->getType(), 1); - - // By default, we don't know how to divide Expr by Denominator. - // Providing the default here simplifies the rest of the code. - Quotient = Zero; - Remainder = Numerator; - } - // Except in the trivial case described above, we do not know how to divide // Expr by Denominator for the following functions with empty implementation. void visitTruncateExpr(const SCEVTruncateExpr *Numerator) {} @@ -953,6 +942,18 @@ public: } private: + SCEVDivision(ScalarEvolution &S, const SCEV *Numerator, + const SCEV *Denominator) + : SE(S), Denominator(Denominator) { + Zero = SE.getConstant(Denominator->getType(), 0); + One = SE.getConstant(Denominator->getType(), 1); + + // By default, we don't know how to divide Expr by Denominator. + // Providing the default here simplifies the rest of the code. + Quotient = Zero; + Remainder = Numerator; + } + ScalarEvolution &SE; const SCEV *Denominator, *Quotient, *Remainder, *Zero, *One; @@ -961,6 +962,10 @@ private: }; struct SCEVSDivision : public SCEVDivision { + SCEVSDivision(ScalarEvolution &S, const SCEV *Numerator, + const SCEV *Denominator) + : SCEVDivision(S, Numerator, Denominator) {} + void visitConstant(const SCEVConstant *Numerator) { if (const SCEVConstant *D = dyn_cast(Denominator)) { Quotient = SE.getConstant(sdiv(Numerator, D)); @@ -971,6 +976,10 @@ struct SCEVSDivision : public SCEVDivision { }; struct SCEVUDivision : public SCEVDivision { + SCEVUDivision(ScalarEvolution &S, const SCEV *Numerator, + const SCEV *Denominator) + : SCEVDivision(S, Numerator, Denominator) {} + void visitConstant(const SCEVConstant *Numerator) { if (const SCEVConstant *D = dyn_cast(Denominator)) { Quotient = SE.getConstant(udiv(Numerator, D));