https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115536

--- Comment #3 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Gaius Mulley <ga...@gcc.gnu.org>:

https://gcc.gnu.org/g:9f168b412f44781013401492acfedf22afe7741b

commit r15-1618-g9f168b412f44781013401492acfedf22afe7741b
Author: Gaius Mulley <gaiusm...@gmail.com>
Date:   Tue Jun 25 18:35:22 2024 +0100

    PR modula2/115536 Expression is evaluated incorrectly when encountering
relops and indirection

    This fix ensures that we only call BuildRelOpFromBoolean if we are
    inside a constant expression (where no indirection can be used).
    The fix creates a temporary variable when a boolean is created from
    a relop in other cases.
    The previous pattern implementation would not work if the operands required
    dereferencing during non const expressions.  Comparison of relop results
    in a constant expression are resolved by constant propagation, basic
    block analysis and dead code removal.  After the quadruples have been
    optimized only one assignment to the boolean variable will remain for
    const expressions.  All quadruple pattern checking for boolean
    expressions is removed by the patch.  Thus the implementation becomes
    more generic.

    gcc/m2/ChangeLog:

            PR modula2/115536
            * gm2-compiler/M2BasicBlock.def (GetBasicBlockScope): New
procedure.
            (GetBasicBlockStart): Ditto.
            (GetBasicBlockEnd): Ditto.
            (IsBasicBlockFirst): New procedure function.
            * gm2-compiler/M2BasicBlock.mod (ConvertQuads2BasicBlock): Allow
            conditional boolean quads to be removed.
            (GetBasicBlockScope): Implement new procedure.
            (GetBasicBlockStart): Ditto.
            (GetBasicBlockEnd): Ditto.
            (IsBasicBlockFirst): Implement new procedure function.
            * gm2-compiler/M2GCCDeclare.def (FoldConstants): New parameter
            declaration.
            * gm2-compiler/M2GCCDeclare.mod (FoldConstants): New parameter
            declaration.
            (DeclareTypesConstantsProceduresInRange): Recreate basic blocks
            after resolving constant expressions.
            (CodeBecomes): Guard IsVariableSSA with IsVar.
            * gm2-compiler/M2GenGCC.def (ResolveConstantExpressions): New
            parameter declaration.
            * gm2-compiler/M2GenGCC.mod (FoldIfLess): Remove relop pattern
            detection.
            (FoldIfGre): Ditto.
            (FoldIfLessEqu): Ditto.
            (FoldIfGreEqu): Ditto.
            (FoldIfIn): Ditto.
            (FoldIfNotIn): Ditto.
            (FoldIfEqu): Ditto.
            (FoldIfNotEqu): Ditto.
            (FoldBecomes): Add BasicBlock parameter and allow conditional
            boolean becomes to be folded in the first basic block.
            (ResolveConstantExpressions): Reimplement.
            * gm2-compiler/M2Quads.def (IsConstQuad): New procedure function.
            (IsConditionalBooleanQuad): Ditto.
            * gm2-compiler/M2Quads.mod (IsConstQuad): Implement new procedure
function.
            (IsConditionalBooleanQuad): Ditto.
            (MoveWithMode): Use GenQuadOTypetok.
            (IsInitialisingConst): Rewrite using OpUsesOp1.
            (OpUsesOp1): New procedure function.
            (doBuildAssignment): Mark des as a VarConditional.
            (ConvertBooleanToVariable): Call PutVarConditional.
            (DumpQuadSummary): New procedure.
            (BuildRelOpFromBoolean): Updated debugging and improved comments.
            (BuildRelOp): Only call BuildRelOpFromBoolean if we are in a const
            expression and both operands are boolean relops.
            (GenQuadOTypeUniquetok): New procedure.
            (BackPatch): Correct comment.
            * gm2-compiler/SymbolTable.def (PutVarConditional): New procedure.
            (IsVarConditional): New procedure function.
            * gm2-compiler/SymbolTable.mod (PutVarConditional): Implement new
            procedure.
            (IsVarConditional): Implement new procedure function.
            (SymConstVar): New field IsConditional.
            (SymVar): New field IsConditional.
            (MakeVar): Initialize IsConditional field.
            (MakeConstVar): Initialize IsConditional field.
            * gm2-compiler/M2Swig.mod (DoBasicBlock): Change parameters to
            use BasicBlock.
            * gm2-compiler/M2Code.mod (SecondDeclareAndOptimize): Use iterator
            to FoldConstants over basic block list.
            * gm2-compiler/M2SymInit.mod (AppendEntry): Replace parameters
            with BasicBlock.
            * gm2-compiler/P3Build.bnf (Relation): Call RecordOp for #, <> and
=.

    gcc/testsuite/ChangeLog:

            PR modula2/115536
            * gm2/iso/const/pass/constbool4.mod: New test.
            * gm2/iso/const/pass/constbool5.mod: New test.
            * gm2/iso/run/pass/condtest2.mod: New test.
            * gm2/iso/run/pass/condtest3.mod: New test.
            * gm2/iso/run/pass/condtest4.mod: New test.
            * gm2/iso/run/pass/condtest5.mod: New test.
            * gm2/iso/run/pass/constbool4.mod: New test.

    Signed-off-by: Gaius Mulley <gaiusm...@gmail.com>

Reply via email to