From 5d2670c52a840266d9b2756a15a43731a74c500a Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Mon, 17 Nov 2014 11:27:45 +0000 Subject: [PATCH] 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 --- llvm/lib/Analysis/ScalarEvolution.cpp | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) 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)); -- 2.7.4