[m-rev.] for review: work around bug 160

Peter Ross pro at missioncriticalit.com
Fri Sep 10 16:26:23 AEST 2010


As this bug is a real show stopper, is there a plan to release a
10.04.2 with this fix?

On Thu, Sep 9, 2010 at 2:11 PM, Ian MacLarty
<maclarty at csse.unimelb.edu.au> wrote:
> Thanks for fixing this so promptly.  I'm not very familiar with the
> part of the compiler you changed, but I didn't see anything
> superficially wrong with the diff.
>
> Ian.
>
> On Thu, Sep 9, 2010 at 6:11 PM, Zoltan Somogyi <zs at csse.unimelb.edu.au> wrote:
>> Work around Mantis bug 160. The bug arises because gcc mishandles this
>> code sequence:
>>
>>        r1 = mkword(tag, base);
>>        r2 = tag(r1);
>>
>> In this case, we know r2 == tag, but gcc screws up the optimization.
>>
>> compiler/peephole.m:
>>        Add a peephole optimization pattern that replaces the second assignment
>>        above with r2 = tag. This should help avoid tickling the gcc bug.
>>
>> compiler/options.m:
>>        Add a developer-only option, --no-optimize-peep-mkword, that disables
>>        the new pattern. The intention is that we can use this to check whether
>>        gcc has fixed the bug.
>>
>> compiler/optimize.m:
>>        Get the value of the new option to peephole.m.
>>
>> compiler/tag_switch.m:
>>        Fix some misleading comments that mmc generated for the bug test case
>>        file.
>>
>> tests/hard_coded/bug160.{m,exp}:
>>        The test case for this bug.
>>
>> tests/hard_coded/Mmakefile:
>> tests/hard_coded/Mercury.options:
>>        Enable the test case.
>>
>> Zoltan.
>>
>> cvs diff: Diffing .
>> cvs diff: Diffing analysis
>> cvs diff: Diffing bindist
>> cvs diff: Diffing boehm_gc
>> cvs diff: Diffing boehm_gc/Mac_files
>> cvs diff: Diffing boehm_gc/cord
>> cvs diff: Diffing boehm_gc/cord/private
>> cvs diff: Diffing boehm_gc/doc
>> cvs diff: Diffing boehm_gc/extra
>> cvs diff: Diffing boehm_gc/include
>> cvs diff: Diffing boehm_gc/include/extra
>> cvs diff: Diffing boehm_gc/include/private
>> cvs diff: Diffing boehm_gc/libatomic_ops
>> cvs diff: Diffing boehm_gc/libatomic_ops/doc
>> cvs diff: Diffing boehm_gc/libatomic_ops/src
>> cvs diff: Diffing boehm_gc/libatomic_ops/src/atomic_ops
>> cvs diff: Diffing boehm_gc/libatomic_ops/src/atomic_ops/sysdeps
>> cvs diff: Diffing boehm_gc/libatomic_ops/src/atomic_ops/sysdeps/armcc
>> cvs diff: Diffing boehm_gc/libatomic_ops/src/atomic_ops/sysdeps/gcc
>> cvs diff: Diffing boehm_gc/libatomic_ops/src/atomic_ops/sysdeps/hpc
>> cvs diff: Diffing boehm_gc/libatomic_ops/src/atomic_ops/sysdeps/ibmc
>> cvs diff: Diffing boehm_gc/libatomic_ops/src/atomic_ops/sysdeps/icc
>> cvs diff: Diffing boehm_gc/libatomic_ops/src/atomic_ops/sysdeps/msftc
>> cvs diff: Diffing boehm_gc/libatomic_ops/src/atomic_ops/sysdeps/sunc
>> cvs diff: Diffing boehm_gc/libatomic_ops/tests
>> cvs diff: Diffing boehm_gc/libatomic_ops-1.2
>> cvs diff: Diffing boehm_gc/libatomic_ops-1.2/doc
>> cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src
>> cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops
>> cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops/sysdeps
>> cvs diff: Diffing boehm_gc/libatomic_ops-1.2/tests
>> cvs diff: Diffing boehm_gc/m4
>> cvs diff: Diffing boehm_gc/tests
>> cvs diff: Diffing browser
>> cvs diff: Diffing bytecode
>> cvs diff: Diffing compiler
>> Index: compiler/optimize.m
>> ===================================================================
>> RCS file: /home/mercury/mercury1/repository/mercury/compiler/optimize.m,v
>> retrieving revision 1.69
>> diff -u -b -r1.69 optimize.m
>> --- compiler/optimize.m 5 Aug 2010 03:07:09 -0000       1.69
>> +++ compiler/optimize.m 8 Sep 2010 07:38:41 -0000
>> @@ -415,7 +415,8 @@
>>             VeryVerbose = no
>>         ),
>>         GC_Method = Info ^ lopt_gc_method,
>> -        peephole_optimize(GC_Method, !Instrs, Mod2),
>> +        OptPeepMkword = Info ^ lopt_opt_peep_mkword,
>> +        peephole_optimize(GC_Method, OptPeepMkword, !Instrs, Mod2),
>>         maybe_opt_debug(Info, !.Instrs, !.C, "peep", "after peephole",
>>             ProcLabel, !OptDebugInfo)
>>     ;
>> @@ -570,7 +571,8 @@
>>                 VeryVerbose = no
>>             ),
>>             GC_Method = Info ^ lopt_gc_method,
>> -            peephole_optimize(GC_Method, !Instrs, _Mod),
>> +            OptPeepMkword = Info ^ lopt_opt_peep_mkword,
>> +            peephole_optimize(GC_Method, OptPeepMkword, !Instrs, _Mod),
>>             maybe_opt_debug(Info, !.Instrs, !.C, "peep", "after peephole",
>>                 ProcLabel, !OptDebugInfo)
>>         ;
>> @@ -765,6 +767,7 @@
>>                 lopt_opt_fulljumps                  :: bool,
>>                 lopt_opt_labels                     :: bool,
>>                 lopt_opt_peep                       :: bool,
>> +                lopt_opt_peep_mkword                :: bool,
>>                 lopt_opt_reassign                   :: bool,
>>                 lopt_pes_tailcalls                  :: bool,
>>                 lopt_std_labels                     :: bool,
>> @@ -799,6 +802,7 @@
>>     globals.lookup_bool_option(Globals, optimize_fulljumps, OptFullJumps),
>>     globals.lookup_bool_option(Globals, optimize_labels, OptLabels),
>>     globals.lookup_bool_option(Globals, optimize_peep, OptPeep),
>> +    globals.lookup_bool_option(Globals, optimize_peep_mkword, OptPeepMkword),
>>     globals.lookup_bool_option(Globals, optimize_reassign, OptReassign),
>>     globals.lookup_bool_option(Globals, pessimize_tailcalls,
>>         PessimizeTailCalls),
>> @@ -817,7 +821,7 @@
>>     Info = llds_opt_info(AutoComments, DetailedStatistics, VeryVerbose,
>>         CheckedNondetTailCalls, NumRealRRegs, GCMethod,
>>         OptDelaySlots, OptDups, OptFrames, FrameOptComments,
>> -        OptJumps, OptFullJumps, OptLabels, OptPeep, OptReassign,
>> +        OptJumps, OptFullJumps, OptLabels, OptPeep, OptPeepMkword, OptReassign,
>>         PessimizeTailCalls, StdLabels, UseLocalVars, LocalVarAccessThreshold,
>>         OptRepeat, DebugOpt, DebugOptPredIdStrs, DebugOptPredNames).
>>
>> Index: compiler/options.m
>> ===================================================================
>> RCS file: /home/mercury/mercury1/repository/mercury/compiler/options.m,v
>> retrieving revision 1.673
>> diff -u -b -r1.673 options.m
>> --- compiler/options.m  14 Jul 2010 16:26:03 -0000      1.673
>> +++ compiler/options.m  8 Sep 2010 07:23:49 -0000
>> @@ -745,6 +745,7 @@
>>     ;       common_layout_data
>>     ;       optimize            % Also used for MLDS->MLDS optimizations.
>>     ;       optimize_peep
>> +    ;       optimize_peep_mkword
>>     ;       optimize_jumps
>>     ;       optimize_fulljumps
>>     ;       pessimize_tailcalls
>> @@ -1577,6 +1578,7 @@
>>     common_layout_data                  -   bool(yes),
>>     optimize                            -   bool(no),
>>     optimize_peep                       -   bool(no),
>> +    optimize_peep_mkword                -   bool(no),
>>     optimize_jumps                      -   bool(no),
>>     optimize_fulljumps                  -   bool(no),
>>     pessimize_tailcalls                 -   bool(no),
>> @@ -2474,6 +2476,8 @@
>>  long_option("llds-optimise",        optimize).
>>  long_option("optimize-peep",        optimize_peep).
>>  long_option("optimise-peep",        optimize_peep).
>> +long_option("optimize-peep-mkword", optimize_peep_mkword).
>> +long_option("optimise-peep-mkword", optimize_peep_mkword).
>>  long_option("optimize-jumps",       optimize_jumps).
>>  long_option("optimise-jumps",       optimize_jumps).
>>  long_option("optimize-fulljumps",   optimize_fulljumps).
>> @@ -3041,6 +3045,7 @@
>>     optimize                    -   bool(yes),
>>     optimize_repeat             -   int(1),
>>     optimize_peep               -   bool(yes),
>> +    optimize_peep_mkword        -   bool(yes),
>>     static_ground_cells         -   bool(yes),
>>     smart_indexing              -   bool(yes),
>>     optimize_jumps              -   bool(yes),
>> @@ -5034,6 +5039,9 @@
>>         "\tEnable dead predicate elimination.",
>>         "--no-optimize-peep",
>>         "\tDisable local peephole optimizations.",
>> +% This is useful for developers only, to test whether a gcc bug has been fixed.
>> +%       "--no-optimize-peep-mkword",
>> +%       "\tDisable peephole optimizations of words created by mkword.",
>>         "--no-optimize-jumps",
>>         "\tDisable elimination of jumps to jumps.",
>>         "--no-optimize-fulljumps",
>> Index: compiler/peephole.m
>> ===================================================================
>> RCS file: /home/mercury/mercury1/repository/mercury/compiler/peephole.m,v
>> retrieving revision 1.102
>> diff -u -b -r1.102 peephole.m
>> --- compiler/peephole.m 11 Feb 2010 04:36:09 -0000      1.102
>> +++ compiler/peephole.m 9 Sep 2010 08:04:23 -0000
>> @@ -24,7 +24,7 @@
>>
>>     % Peephole optimize a list of instructions.
>>     %
>> -:- pred peephole_optimize(gc_method::in, list(instruction)::in,
>> +:- pred peephole_optimize(gc_method::in, bool::in, list(instruction)::in,
>>     list(instruction)::out, bool::out) is det.
>>
>>  :- pred combine_decr_sp(list(instruction)::in, list(instruction)::out) is det.
>> @@ -35,6 +35,7 @@
>>  :- implementation.
>>
>>  :- import_module backend_libs.builtin_ops.
>> +:- import_module libs.compiler_util.
>>  :- import_module ll_backend.opt_util.
>>
>>  :- import_module int.
>> @@ -48,7 +49,8 @@
>>     % Patterns that can be switched off.
>>     %
>>  :- type pattern
>> -    --->    incr_sp.
>> +    --->    pattern_incr_sp
>> +    ;       pattern_mkword.
>>
>>     % We zip down to the end of the instruction list, and start attempting
>>     % to optimize instruction sequences. As long as we can continue
>> @@ -56,8 +58,8 @@
>>     % when we find a sequence we can't optimize, we back up and try
>>     % to optimize the sequence starting with the previous instruction.
>>     %
>> -peephole_optimize(GC_Method, Instrs0, Instrs, Mod) :-
>> -    invalid_peephole_opts(GC_Method, InvalidPatterns),
>> +peephole_optimize(GC_Method, OptPeepMkword, Instrs0, Instrs, Mod) :-
>> +    invalid_peephole_opts(GC_Method, OptPeepMkword, InvalidPatterns),
>>     peephole_optimize_2(InvalidPatterns, Instrs0, Instrs, Mod).
>>
>>  :- pred peephole_optimize_2(list(pattern)::in, list(instruction)::in,
>> @@ -80,10 +82,8 @@
>>     list(pattern)::in, list(instruction)::out, bool::out) is det.
>>
>>  peephole_opt_instr(Instr0, Instrs0, InvalidPatterns, Instrs, Mod) :-
>> -    (
>>         opt_util.skip_comments(Instrs0, Instrs1),
>> -        peephole_match(Instr0, Instrs1, InvalidPatterns, Instrs2)
>> -    ->
>> +    ( peephole_match(Instr0, Instrs1, InvalidPatterns, Instrs2) ->
>>         (
>>             Instrs2 = [Instr2 | Instrs3],
>>             peephole_opt_instr(Instr2, Instrs3, InvalidPatterns, Instrs, _)
>> @@ -92,6 +92,9 @@
>>             Instrs = Instrs2
>>         ),
>>         Mod = yes
>> +    ; peephole_match_norepeat(Instr0, Instrs1, InvalidPatterns, Instrs2) ->
>> +        Instrs = Instrs2,
>> +        Mod = yes
>>     ;
>>         Instrs = [Instr0 | Instrs0],
>>         Mod = no
>> @@ -138,7 +141,14 @@
>>         fail
>>     ).
>>
>> +%-----------------------------------------------------------------------------%
>> +
>>     % Look for code patterns that can be optimized, and optimize them.
>> +    % Unlike peephole_match_norepeat, this predicate guarantees that the
>> +    % instruction sequence it returns on success won't be transformable
>> +    % by the same transformation as it applies. This allows peephole_opt_instr
>> +    % to call peephole_match repeatedly until it fails without the possibility
>> +    % of an infinite loop.
>>     %
>>  :- pred peephole_match(instruction::in, list(instruction)::in,
>>     list(pattern)::in, list(instruction)::out) is semidet.
>> @@ -427,7 +437,7 @@
>>  peephole_match(Instr0, Instrs0, InvalidPatterns, Instrs) :-
>>     Instr0 = llds_instr(Uinstr0, _Comment0),
>>     Uinstr0 = incr_sp(N, _, _),
>> -    \+ list.member(incr_sp, InvalidPatterns),
>> +    \+ list.member(pattern_incr_sp, InvalidPatterns),
>>     ( opt_util.no_stackvars_til_decr_sp(Instrs0, N, Between, Remain) ->
>>         Instrs = Between ++ Remain
>>     ;
>> @@ -436,14 +446,236 @@
>>
>>  %-----------------------------------------------------------------------------%
>>
>> +    % Look for code patterns that can be optimized, and optimize them.
>> +    % See the comment at the top of peephole_match for the difference
>> +    % between the two predicates.
>> +    %
>> +:- pred peephole_match_norepeat(instruction::in, list(instruction)::in,
>> +    list(pattern)::in, list(instruction)::out) is semidet.
>> +
>> +    % If none of the instructions in brackets can affect Lval, then
>> +    % we can transform references to tag(Lval) to Tag and body(Lval, Tag)
>> +    % to Base.
>> +    %
>> +    %   Lval = mkword(Tag, Base)        Lval = mkword(Tag, Base)
>> +    %   <...>                       =>  <...>
>> +    %   ... tag(Lval) ...               ... Tag ...
>> +    %   ... body(Lval, Tag) ...         ... Base ...
>> +    %
>> +peephole_match_norepeat(Instr0, Instrs0, InvalidPatterns, Instrs) :-
>> +    Instr0 = llds_instr(Uinstr0, _),
>> +    Uinstr0 = assign(Lval, mkword(Tag, Base)),
>> +    \+ list.member(pattern_mkword, InvalidPatterns),
>> +    replace_tagged_ptr_components_in_instrs(Lval, Tag, Base, Instrs0, Instrs1),
>> +    Instrs = [Instr0 | Instrs1].
>> +
>> +%-----------------------------------------------------------------------------%
>> +
>> +:- pred replace_tagged_ptr_components_in_instrs(lval::in, tag::in, rval::in,
>> +    list(instruction)::in, list(instruction)::out) is det.
>> +
>> +replace_tagged_ptr_components_in_instrs(_, _, _, [], []).
>> +replace_tagged_ptr_components_in_instrs(Lval, Tag, Base, Instrs0, Instrs) :-
>> +    Instrs0 = [HeadInstr0 | TailInstrs0],
>> +    replace_tagged_ptr_components_in_instr(Lval, Tag, Base,
>> +        HeadInstr0, MaybeHeadInstr),
>> +    (
>> +        MaybeHeadInstr = no,
>> +        Instrs = Instrs0
>> +    ;
>> +        MaybeHeadInstr = yes(HeadInstr),
>> +        replace_tagged_ptr_components_in_instrs(Lval, Tag, Base,
>> +            TailInstrs0, TailInstrs),
>> +        Instrs = [HeadInstr | TailInstrs]
>> +    ).
>> +
>> +:- pred replace_tagged_ptr_components_in_instr(lval::in, tag::in, rval::in,
>> +    instruction::in, maybe(instruction)::out) is det.
>> +
>> +replace_tagged_ptr_components_in_instr(OldLval, OldTag, OldBase,
>> +        Instr0, MaybeInstr) :-
>> +    Instr0 = llds_instr(Uinstr0, Comment),
>> +    (
>> +        Uinstr0 = assign(Lval, Rval0),
>> +        ( Lval = OldLval ->
>> +            MaybeInstr = no
>> +        ; Lval = mem_ref(_) ->
>> +            MaybeInstr = no
>> +        ;
>> +            replace_tagged_ptr_components_in_rval(OldLval, OldTag, OldBase,
>> +                Rval0, Rval),
>> +            Uinstr = assign(Lval, Rval),
>> +            Instr = llds_instr(Uinstr, Comment),
>> +            MaybeInstr = yes(Instr)
>> +        )
>> +    ;
>> +        Uinstr0 = keep_assign(Lval, Rval0),
>> +        ( Lval = OldLval ->
>> +            MaybeInstr = no
>> +        ; Lval = mem_ref(_) ->
>> +            MaybeInstr = no
>> +        ;
>> +            replace_tagged_ptr_components_in_rval(OldLval, OldTag, OldBase,
>> +                Rval0, Rval),
>> +            Uinstr = keep_assign(Lval, Rval),
>> +            Instr = llds_instr(Uinstr, Comment),
>> +            MaybeInstr = yes(Instr)
>> +        )
>> +    ;
>> +        Uinstr0 = computed_goto(Rval0, Targets),
>> +        replace_tagged_ptr_components_in_rval(OldLval, OldTag, OldBase,
>> +            Rval0, Rval),
>> +        Uinstr = computed_goto(Rval, Targets),
>> +        Instr = llds_instr(Uinstr, Comment),
>> +        MaybeInstr = yes(Instr)
>> +    ;
>> +        Uinstr0 = if_val(Rval0, Target),
>> +        replace_tagged_ptr_components_in_rval(OldLval, OldTag, OldBase,
>> +            Rval0, Rval),
>> +        Uinstr = if_val(Rval, Target),
>> +        Instr = llds_instr(Uinstr, Comment),
>> +        MaybeInstr = yes(Instr)
>> +    ;
>> +        Uinstr0 = incr_hp(Target, MaybeTag, MaybeOffset, SizeRval0,
>> +            TypeMsg, MayUseAtomicAlloc, MaybeRegionId, MaybeReuse),
>> +        ( Target = OldLval ->
>> +            MaybeInstr = no
>> +        ;
>> +            replace_tagged_ptr_components_in_rval(OldLval, OldTag, OldBase,
>> +                SizeRval0, SizeRval),
>> +            Uinstr = incr_hp(Target, MaybeTag, MaybeOffset, SizeRval,
>> +                TypeMsg, MayUseAtomicAlloc, MaybeRegionId, MaybeReuse),
>> +            Instr = llds_instr(Uinstr, Comment),
>> +            MaybeInstr = yes(Instr)
>> +        )
>> +    ;
>> +        Uinstr0 = restore_hp(Rval0),
>> +        replace_tagged_ptr_components_in_rval(OldLval, OldTag, OldBase,
>> +            Rval0, Rval),
>> +        Uinstr = restore_hp(Rval),
>> +        Instr = llds_instr(Uinstr, Comment),
>> +        MaybeInstr = yes(Instr)
>> +    ;
>> +        Uinstr0 = free_heap(Rval0),
>> +        replace_tagged_ptr_components_in_rval(OldLval, OldTag, OldBase,
>> +            Rval0, Rval),
>> +        Uinstr = free_heap(Rval),
>> +        Instr = llds_instr(Uinstr, Comment),
>> +        MaybeInstr = yes(Instr)
>> +    ;
>> +        Uinstr0 = reset_ticket(Rval0, Reason),
>> +        replace_tagged_ptr_components_in_rval(OldLval, OldTag, OldBase,
>> +            Rval0, Rval),
>> +        Uinstr = reset_ticket(Rval, Reason),
>> +        Instr = llds_instr(Uinstr, Comment),
>> +        MaybeInstr = yes(Instr)
>> +    ;
>> +        Uinstr0 = prune_tickets_to(Rval0),
>> +        replace_tagged_ptr_components_in_rval(OldLval, OldTag, OldBase,
>> +            Rval0, Rval),
>> +        Uinstr = prune_tickets_to(Rval),
>> +        Instr = llds_instr(Uinstr, Comment),
>> +        MaybeInstr = yes(Instr)
>> +    ;
>> +        ( Uinstr0 = save_maxfr(Lval0)
>> +        ; Uinstr0 = mark_hp(Lval0)
>> +        ; Uinstr0 = store_ticket(Lval0)
>> +        ; Uinstr0 = mark_ticket_stack(Lval0)
>> +        ),
>> +        ( Lval0 = OldLval ->
>> +            MaybeInstr = no
>> +        ;
>> +            MaybeInstr = yes(Instr0)
>> +        )
>> +    ;
>> +        ( Uinstr0 = comment(_)
>> +        ; Uinstr0 = livevals(_)
>> +        ; Uinstr0 = restore_maxfr(_)
>> +        ; Uinstr0 = prune_ticket
>> +        ; Uinstr0 = discard_ticket
>> +        ),
>> +        Uinstr = Uinstr0,
>> +        Instr = llds_instr(Uinstr, Comment),
>> +        MaybeInstr = yes(Instr)
>> +    ;
>> +        ( Uinstr0 = block(_, _, _)
>> +        ; Uinstr0 = llcall(_, _, _, _, _, _)
>> +        ; Uinstr0 = mkframe(_, _)
>> +        ; Uinstr0 = label(_)
>> +        ; Uinstr0 = goto(_)
>> +        ; Uinstr0 = arbitrary_c_code(_, _, _)
>> +        ; Uinstr0 = foreign_proc_code(_, _, _, _, _, _, _, _, _, _)
>> +        ; Uinstr0 = push_region_frame(_, _)
>> +        ; Uinstr0 = region_fill_frame(_, _, _, _, _)
>> +        ; Uinstr0 = region_set_fixed_slot(_, _, _)
>> +        ; Uinstr0 = use_and_maybe_pop_region_frame(_, _)
>> +        ; Uinstr0 = incr_sp(_, _, _)
>> +        ; Uinstr0 = decr_sp(_)
>> +        ; Uinstr0 = decr_sp_and_return(_)
>> +        ; Uinstr0 = init_sync_term(_, _)
>> +        ; Uinstr0 = fork_new_child(_, _)
>> +        ; Uinstr0 = join_and_continue(_, _)
>> +        ),
>> +        MaybeInstr = no
>> +    ).
>> +
>> +:- pred replace_tagged_ptr_components_in_rval(lval::in, tag::in, rval::in,
>> +    rval::in, rval::out) is det.
>> +
>> +replace_tagged_ptr_components_in_rval(OldLval, OldTag, OldBase, Rval0, Rval) :-
>> +    (
>> +        Rval0 = unop(UnOp, RvalA0),
>> +        (
>> +            UnOp = tag,
>> +            RvalA0 = lval(OldLval)
>> +        ->
>> +            Rval = unop(mktag, const(llconst_int(OldTag)))
>> +        ;
>> +            replace_tagged_ptr_components_in_rval(OldLval, OldTag, OldBase,
>> +                RvalA0, RvalA),
>> +            Rval = unop(UnOp, RvalA)
>> +        )
>> +    ;
>> +        Rval0 = binop(BinOp, RvalA0, RvalB0),
>> +        (
>> +            BinOp = body,
>> +            RvalA0 = lval(OldLval),
>> +            RvalB0 = unop(mktag, const(llconst_int(OldTag))),
>> +            OldBase = const(_)
>> +        ->
>> +            Rval = OldBase
>> +        ;
>> +            replace_tagged_ptr_components_in_rval(OldLval, OldTag, OldBase,
>> +                RvalA0, RvalA),
>> +            replace_tagged_ptr_components_in_rval(OldLval, OldTag, OldBase,
>> +                RvalB0, RvalB),
>> +            Rval = binop(BinOp, RvalA, RvalB)
>> +        )
>> +    ;
>> +        Rval0 = mkword(Tag, BaseRval0),
>> +        replace_tagged_ptr_components_in_rval(OldLval, OldTag, OldBase,
>> +            BaseRval0, BaseRval),
>> +        Rval = mkword(Tag, BaseRval)
>> +    ;
>> +        ( Rval0 = lval(_)
>> +        ; Rval0 = var(_)
>> +        ; Rval0 = const(_)
>> +        ; Rval0 = mem_addr(_)
>> +        ),
>> +        Rval = Rval0
>> +    ).
>> +
>> +%-----------------------------------------------------------------------------%
>> +
>>     % Given a GC method, return the list of invalid peephole optimizations.
>>     %
>> -:- pred invalid_peephole_opts(gc_method::in, list(pattern)::out) is det.
>> +:- pred invalid_peephole_opts(gc_method::in, bool::in, list(pattern)::out)
>> +    is det.
>>
>> -invalid_peephole_opts(GC_Method, InvalidPatterns) :-
>> +invalid_peephole_opts(GC_Method, OptPeepMkword, InvalidPatterns) :-
>>     (
>>         GC_Method = gc_accurate,
>> -        InvalidPatterns = [incr_sp]
>> +        InvalidPatterns0 = [pattern_incr_sp]
>>     ;
>>         ( GC_Method = gc_automatic
>>         ; GC_Method = gc_none
>> @@ -452,7 +684,14 @@
>>         ; GC_Method = gc_mps
>>         ; GC_Method = gc_hgc
>>         ),
>> -        InvalidPatterns = []
>> +        InvalidPatterns0 = []
>> +    ),
>> +    (
>> +        OptPeepMkword = yes,
>> +        InvalidPatterns = InvalidPatterns0
>> +    ;
>> +        OptPeepMkword = no,
>> +        InvalidPatterns = [pattern_mkword | InvalidPatterns0]
>>     ).
>>
>>  %-----------------------------------------------------------------------------%
>> @@ -476,5 +715,11 @@
>>     ).
>>
>>  %-----------------------------------------------------------------------------%
>> +
>> +:- func this_file = string.
>> +
>> +this_file = "peephole.m".
>> +
>> +%-----------------------------------------------------------------------------%
>>  :- end_module peephole.
>>  %-----------------------------------------------------------------------------%
>> Index: compiler/tag_switch.m
>> ===================================================================
>> RCS file: /home/mercury/mercury1/repository/mercury/compiler/tag_switch.m,v
>> retrieving revision 1.83
>> diff -u -b -r1.83 tag_switch.m
>> --- compiler/tag_switch.m       25 Aug 2009 23:46:50 -0000      1.83
>> +++ compiler/tag_switch.m       8 Sep 2010 02:21:57 -0000
>> @@ -839,7 +839,7 @@
>>         llds_instr(
>>             if_val(binop(ne, StagRval, const(llconst_int(Secondary))),
>>                 code_label(ElseLabel)),
>> -            "test remote sec tag only")
>> +            "test sec tag only")
>>     ),
>>     ElseLabelCode = singleton(
>>         llds_instr(label(ElseLabel), "handle next secondary tag")
>> @@ -894,7 +894,7 @@
>>         llds_instr(
>>             if_val(binop(eq, StagRval, const(llconst_int(Secondary))),
>>                 code_label(CaseLabel)),
>> -            "test remote sec tag only for " ++ Comment)
>> +            "test sec tag only for " ++ Comment)
>>     ),
>>     PrevTestsCode = PrevTestsCode0 ++ TestCode.
>>
>> cvs diff: Diffing compiler/notes
>> cvs diff: Diffing deep_profiler
>> cvs diff: Diffing deep_profiler/notes
>> cvs diff: Diffing doc
>> cvs diff: Diffing extras
>> cvs diff: Diffing extras/base64
>> cvs diff: Diffing extras/cgi
>> cvs diff: Diffing extras/complex_numbers
>> cvs diff: Diffing extras/complex_numbers/samples
>> cvs diff: Diffing extras/complex_numbers/tests
>> cvs diff: Diffing extras/concurrency
>> cvs diff: Diffing extras/curs
>> cvs diff: Diffing extras/curs/samples
>> cvs diff: Diffing extras/curses
>> cvs diff: Diffing extras/curses/sample
>> cvs diff: Diffing extras/dynamic_linking
>> cvs diff: Diffing extras/error
>> cvs diff: Diffing extras/fixed
>> cvs diff: Diffing extras/gator
>> cvs diff: Diffing extras/gator/generations
>> cvs diff: Diffing extras/gator/generations/1
>> cvs diff: Diffing extras/graphics
>> cvs diff: Diffing extras/graphics/easyx
>> cvs diff: Diffing extras/graphics/easyx/samples
>> cvs diff: Diffing extras/graphics/mercury_allegro
>> cvs diff: Diffing extras/graphics/mercury_allegro/examples
>> cvs diff: Diffing extras/graphics/mercury_allegro/samples
>> cvs diff: Diffing extras/graphics/mercury_allegro/samples/demo
>> cvs diff: Diffing extras/graphics/mercury_allegro/samples/mandel
>> cvs diff: Diffing extras/graphics/mercury_allegro/samples/pendulum2
>> cvs diff: Diffing extras/graphics/mercury_allegro/samples/speed
>> cvs diff: Diffing extras/graphics/mercury_cairo
>> cvs diff: Diffing extras/graphics/mercury_cairo/samples
>> cvs diff: Diffing extras/graphics/mercury_cairo/samples/data
>> cvs diff: Diffing extras/graphics/mercury_cairo/tutorial
>> cvs diff: Diffing extras/graphics/mercury_glut
>> cvs diff: Diffing extras/graphics/mercury_opengl
>> cvs diff: Diffing extras/graphics/mercury_tcltk
>> cvs diff: Diffing extras/graphics/samples
>> cvs diff: Diffing extras/graphics/samples/calc
>> cvs diff: Diffing extras/graphics/samples/gears
>> cvs diff: Diffing extras/graphics/samples/maze
>> cvs diff: Diffing extras/graphics/samples/pent
>> cvs diff: Diffing extras/lazy_evaluation
>> cvs diff: Diffing extras/lex
>> cvs diff: Diffing extras/lex/samples
>> cvs diff: Diffing extras/lex/tests
>> cvs diff: Diffing extras/log4m
>> cvs diff: Diffing extras/logged_output
>> cvs diff: Diffing extras/monte
>> cvs diff: Diffing extras/moose
>> cvs diff: Diffing extras/moose/samples
>> cvs diff: Diffing extras/moose/tests
>> cvs diff: Diffing extras/mopenssl
>> cvs diff: Diffing extras/morphine
>> cvs diff: Diffing extras/morphine/non-regression-tests
>> cvs diff: Diffing extras/morphine/scripts
>> cvs diff: Diffing extras/morphine/source
>> cvs diff: Diffing extras/net
>> cvs diff: Diffing extras/odbc
>> cvs diff: Diffing extras/posix
>> cvs diff: Diffing extras/posix/samples
>> cvs diff: Diffing extras/quickcheck
>> cvs diff: Diffing extras/quickcheck/tutes
>> cvs diff: Diffing extras/references
>> cvs diff: Diffing extras/references/samples
>> cvs diff: Diffing extras/references/tests
>> cvs diff: Diffing extras/solver_types
>> cvs diff: Diffing extras/solver_types/library
>> cvs diff: Diffing extras/trailed_update
>> cvs diff: Diffing extras/trailed_update/samples
>> cvs diff: Diffing extras/trailed_update/tests
>> cvs diff: Diffing extras/windows_installer_generator
>> cvs diff: Diffing extras/windows_installer_generator/sample
>> cvs diff: Diffing extras/windows_installer_generator/sample/images
>> cvs diff: Diffing extras/xml
>> cvs diff: Diffing extras/xml/samples
>> cvs diff: Diffing extras/xml_stylesheets
>> cvs diff: Diffing java
>> cvs diff: Diffing java/runtime
>> cvs diff: Diffing library
>> cvs diff: Diffing mdbcomp
>> cvs diff: Diffing profiler
>> cvs diff: Diffing robdd
>> cvs diff: Diffing runtime
>> cvs diff: Diffing runtime/GETOPT
>> cvs diff: Diffing runtime/machdeps
>> cvs diff: Diffing samples
>> cvs diff: Diffing samples/c_interface
>> cvs diff: Diffing samples/c_interface/c_calls_mercury
>> cvs diff: Diffing samples/c_interface/cplusplus_calls_mercury
>> cvs diff: Diffing samples/c_interface/mercury_calls_c
>> cvs diff: Diffing samples/c_interface/mercury_calls_cplusplus
>> cvs diff: Diffing samples/c_interface/mercury_calls_fortran
>> cvs diff: Diffing samples/c_interface/simpler_c_calls_mercury
>> cvs diff: Diffing samples/c_interface/simpler_cplusplus_calls_mercury
>> cvs diff: Diffing samples/c_interface/standalone_c
>> cvs diff: Diffing samples/diff
>> cvs diff: Diffing samples/java_interface
>> cvs diff: Diffing samples/java_interface/java_calls_mercury
>> cvs diff: Diffing samples/java_interface/mercury_calls_java
>> cvs diff: Diffing samples/muz
>> cvs diff: Diffing samples/rot13
>> cvs diff: Diffing samples/solutions
>> cvs diff: Diffing samples/solver_types
>> cvs diff: Diffing samples/tests
>> cvs diff: Diffing samples/tests/c_interface
>> cvs diff: Diffing samples/tests/c_interface/c_calls_mercury
>> cvs diff: Diffing samples/tests/c_interface/cplusplus_calls_mercury
>> cvs diff: Diffing samples/tests/c_interface/mercury_calls_c
>> cvs diff: Diffing samples/tests/c_interface/mercury_calls_cplusplus
>> cvs diff: Diffing samples/tests/c_interface/mercury_calls_fortran
>> cvs diff: Diffing samples/tests/c_interface/simpler_c_calls_mercury
>> cvs diff: Diffing samples/tests/c_interface/simpler_cplusplus_calls_mercury
>> cvs diff: Diffing samples/tests/diff
>> cvs diff: Diffing samples/tests/muz
>> cvs diff: Diffing samples/tests/rot13
>> cvs diff: Diffing samples/tests/solutions
>> cvs diff: Diffing samples/tests/toplevel
>> cvs diff: Diffing scripts
>> cvs diff: Diffing slice
>> cvs diff: Diffing ssdb
>> cvs diff: Diffing tests
>> cvs diff: Diffing tests/analysis
>> cvs diff: Diffing tests/analysis/ctgc
>> cvs diff: Diffing tests/analysis/excp
>> cvs diff: Diffing tests/analysis/ext
>> cvs diff: Diffing tests/analysis/sharing
>> cvs diff: Diffing tests/analysis/table
>> cvs diff: Diffing tests/analysis/trail
>> cvs diff: Diffing tests/analysis/unused_args
>> cvs diff: Diffing tests/benchmarks
>> cvs diff: Diffing tests/debugger
>> cvs diff: Diffing tests/debugger/declarative
>> cvs diff: Diffing tests/dppd
>> cvs diff: Diffing tests/general
>> cvs diff: Diffing tests/general/accumulator
>> cvs diff: Diffing tests/general/string_format
>> cvs diff: Diffing tests/general/structure_reuse
>> cvs diff: Diffing tests/grade_subdirs
>> cvs diff: Diffing tests/hard_coded
>> Index: tests/hard_coded/Mercury.options
>> ===================================================================
>> RCS file: /home/mercury/mercury1/repository/tests/hard_coded/Mercury.options,v
>> retrieving revision 1.45
>> diff -u -b -r1.45 Mercury.options
>> --- tests/hard_coded/Mercury.options    21 Apr 2010 04:50:28 -0000      1.45
>> +++ tests/hard_coded/Mercury.options    9 Sep 2010 03:56:58 -0000
>> @@ -8,6 +8,7 @@
>>  MCFLAGS-big_array_from_list =   --optimize-tailcalls
>>  MCFLAGS-bigtest =              --intermodule-optimization -O3
>>  MCFLAGS-boyer =                        --infer-all
>> +MCFLAGS-bug160 =               -w --optimize-peep-mkword
>>  MCFLAGS-checked_nondet_tailcall        = --checked-nondet-tailcalls
>>  MCFLAGS-checked_nondet_tailcall_noinline = --checked-nondet-tailcalls --no-inlining
>>  MCFLAGS-cc_and_non_cc_test =   --no-inlining
>> Index: tests/hard_coded/Mmakefile
>> ===================================================================
>> RCS file: /home/mercury/mercury1/repository/tests/hard_coded/Mmakefile,v
>> retrieving revision 1.389
>> diff -u -b -r1.389 Mmakefile
>> --- tests/hard_coded/Mmakefile  19 Aug 2010 06:33:42 -0000      1.389
>> +++ tests/hard_coded/Mmakefile  9 Sep 2010 03:58:29 -0000
>> @@ -15,6 +15,7 @@
>>        bidirectional \
>>        boyer \
>>        brace \
>> +       bug160 \
>>        builtin_inst_rename \
>>        c_write_string \
>>        calendar_test \
>> Index: tests/hard_coded/bug160.exp
>> ===================================================================
>> RCS file: tests/hard_coded/bug160.exp
>> diff -N tests/hard_coded/bug160.exp
>> --- /dev/null   1 Jan 1970 00:00:00 -0000
>> +++ tests/hard_coded/bug160.exp 9 Sep 2010 03:57:09 -0000
>> @@ -0,0 +1 @@
>> +RESULT: OK
>> Index: tests/hard_coded/bug160.m
>> ===================================================================
>> RCS file: tests/hard_coded/bug160.m
>> diff -N tests/hard_coded/bug160.m
>> --- /dev/null   1 Jan 1970 00:00:00 -0000
>> +++ tests/hard_coded/bug160.m   9 Sep 2010 03:56:27 -0000
>> @@ -0,0 +1,82 @@
>> +% vim: ts=4 sw=4 et
>> +%
>> +% This is regression test for bug 160 in the Mantis database.
>> +%
>> +% The bug it tests for is in gcc. Compiling this source file in grade
>> +% asm_fast.gc with the option --no-optimize-peep-mkword yields a .c file
>> +% that gcc 4.4.1 generates incorrect code for at the default optimization level
>> +% unless you give it the option --fno-tree-loop-im.
>> +%
>> +% Mercury.options specifies --optimize-peep-mkword for this program, so
>> +% we should pass this test case even on systems with buggy gcc installations.
>> +
>> +:- module bug160.
>> +:- interface.
>> +:- import_module io.
>> +
>> +:- pred main(io::di, io::uo) is det.
>> +
>> +:- implementation.
>> +:- import_module list, require.
>> +
>> +main(!IO) :-
>> +    bug(R),
>> +    io.write_string(R, !IO),
>> +    io.nl(!IO).
>> +
>> +:- type t1
>> +    --->    a
>> +    ;       b.
>> +
>> +:- type t2
>> +    --->    c(t3)
>> +    ;       d
>> +    ;       e.
>> +
>> +:- type t3
>> +    --->    f(t1, t1).
>> +
>> +:- pred bug(string::out) is det.
>> +
>> +bug(R) :-
>> +    ( p ->
>> +        R = "RESULT: BAD A"
>> +    ;
>> +        ( q(R0) ->
>> +            R1 = R0
>> +        ;
>> +            R1 = c(f(a, a))
>> +        ),
>> +        % Enabling the following causes R1 to be bound to the correct value.
>> +        % trace [io(!IO)] io.print(R1, !IO),
>> +        (
>> +            R1 = c(_),
>> +            R = "RESULT: OK"
>> +        ;
>> +            R1 = d,
>> +            R = "RESULT: BAD D"
>> +        ;
>> +            R1 = e,
>> +            R = "RESULT: BAD E"
>> +        )
>> +    ).
>> +
>> +:- pred p is semidet.
>> +
>> +p :-
>> +    ( 1 = 2 ->
>> +        true
>> +    ;
>> +        fail
>> +    ).
>> +
>> +:- pred q(t2::out) is semidet.
>> +
>> +q(Out) :-
>> +    ( 1 = 2 ->
>> +        Out = d
>> +    ;
>> +        fail
>> +    ).
>> +
>> +:- end_module bug160.
>> cvs diff: Diffing tests/hard_coded/exceptions
>> cvs diff: Diffing tests/hard_coded/purity
>> cvs diff: Diffing tests/hard_coded/sub-modules
>> cvs diff: Diffing tests/hard_coded/typeclasses
>> cvs diff: Diffing tests/invalid
>> cvs diff: Diffing tests/invalid/purity
>> cvs diff: Diffing tests/misc_tests
>> cvs diff: Diffing tests/mmc_make
>> cvs diff: Diffing tests/mmc_make/lib
>> cvs diff: Diffing tests/par_conj
>> cvs diff: Diffing tests/recompilation
>> cvs diff: Diffing tests/stm
>> cvs diff: Diffing tests/stm/orig
>> cvs diff: Diffing tests/stm/orig/stm-compiler
>> cvs diff: Diffing tests/stm/orig/stm-compiler/test1
>> cvs diff: Diffing tests/stm/orig/stm-compiler/test10
>> cvs diff: Diffing tests/stm/orig/stm-compiler/test2
>> cvs diff: Diffing tests/stm/orig/stm-compiler/test3
>> cvs diff: Diffing tests/stm/orig/stm-compiler/test4
>> cvs diff: Diffing tests/stm/orig/stm-compiler/test5
>> cvs diff: Diffing tests/stm/orig/stm-compiler/test6
>> cvs diff: Diffing tests/stm/orig/stm-compiler/test7
>> cvs diff: Diffing tests/stm/orig/stm-compiler/test8
>> cvs diff: Diffing tests/stm/orig/stm-compiler/test9
>> cvs diff: Diffing tests/stm/orig/stm-compiler-par
>> cvs diff: Diffing tests/stm/orig/stm-compiler-par/bm1
>> cvs diff: Diffing tests/stm/orig/stm-compiler-par/bm2
>> cvs diff: Diffing tests/stm/orig/stm-compiler-par/stmqueue
>> cvs diff: Diffing tests/stm/orig/stm-compiler-par/test1
>> cvs diff: Diffing tests/stm/orig/stm-compiler-par/test10
>> cvs diff: Diffing tests/stm/orig/stm-compiler-par/test11
>> cvs diff: Diffing tests/stm/orig/stm-compiler-par/test2
>> cvs diff: Diffing tests/stm/orig/stm-compiler-par/test3
>> cvs diff: Diffing tests/stm/orig/stm-compiler-par/test4
>> cvs diff: Diffing tests/stm/orig/stm-compiler-par/test5
>> cvs diff: Diffing tests/stm/orig/stm-compiler-par/test6
>> cvs diff: Diffing tests/stm/orig/stm-compiler-par/test7
>> cvs diff: Diffing tests/stm/orig/stm-compiler-par/test8
>> cvs diff: Diffing tests/stm/orig/stm-compiler-par/test9
>> cvs diff: Diffing tests/stm/orig/stm-compiler-par-asm_fast
>> cvs diff: Diffing tests/stm/orig/stm-compiler-par-asm_fast/test1
>> cvs diff: Diffing tests/stm/orig/stm-compiler-par-asm_fast/test2
>> cvs diff: Diffing tests/stm/orig/stm-compiler-par-asm_fast/test3
>> cvs diff: Diffing tests/stm/orig/stm-compiler-par-asm_fast/test4
>> cvs diff: Diffing tests/stm/orig/stm-compiler-par-asm_fast/test5
>> cvs diff: Diffing tests/stm/orig/stm-compiler-par-asm_fast/test6
>> cvs diff: Diffing tests/stm/orig/stm-compiler-par-asm_fast/test7
>> cvs diff: Diffing tests/stm/orig/stm-compiler-par-asm_fast/test8
>> cvs diff: Diffing tests/stm/orig/stm-compiler-par-asm_fast/test9
>> cvs diff: Diffing tests/tabling
>> cvs diff: Diffing tests/term
>> cvs diff: Diffing tests/trailing
>> cvs diff: Diffing tests/valid
>> cvs diff: Diffing tests/warnings
>> cvs diff: Diffing tools
>> cvs diff: Diffing trace
>> cvs diff: Diffing util
>> cvs diff: Diffing vim
>> cvs diff: Diffing vim/after
>> cvs diff: Diffing vim/ftplugin
>> cvs diff: Diffing vim/syntax
>> --------------------------------------------------------------------------
>> mercury-reviews mailing list
>> Post messages to:       mercury-reviews at csse.unimelb.edu.au
>> Administrative Queries: owner-mercury-reviews at csse.unimelb.edu.au
>> Subscriptions:          mercury-reviews-request at csse.unimelb.edu.au
>> --------------------------------------------------------------------------
>>
>>
>
> --------------------------------------------------------------------------
> mercury-reviews mailing list
> Post messages to:       mercury-reviews at csse.unimelb.edu.au
> Administrative Queries: owner-mercury-reviews at csse.unimelb.edu.au
> Subscriptions:          mercury-reviews-request at csse.unimelb.edu.au
> --------------------------------------------------------------------------
>



-- 
Peter Ross - Mission Critical Australia
AU: +61 424 651 834
BE: +32 485 482 559

--------------------------------------------------------------------------
mercury-reviews mailing list
Post messages to:       mercury-reviews at csse.unimelb.edu.au
Administrative Queries: owner-mercury-reviews at csse.unimelb.edu.au
Subscriptions:          mercury-reviews-request at csse.unimelb.edu.au
--------------------------------------------------------------------------



More information about the reviews mailing list