Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Diff of /branches/vis15/src/compiler/tree-ir/check-tree.sml
ViewVC logotype

Diff of /branches/vis15/src/compiler/tree-ir/check-tree.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3861, Sun May 15 14:33:03 2016 UTC revision 3862, Sun May 15 15:44:30 2016 UTC
# Line 190  Line 190 
190                  then ()                  then ()
191                  else errFn [S "variable ", V x, S " is not bound"]                  else errFn [S "variable ", V x, S " is not bound"]
192            fun chkBlock (bvs : VSet.set, IR.Block{locals, body}) = let            fun chkBlock (bvs : VSet.set, IR.Block{locals, body}) = let
193                  fun chkExp (bvs : VSet.set, e) = let                  fun chkExp (cxt, bvs : VSet.set, e) = let
194                        fun chk e = (case e                        fun chk e = (case e
195                               of IR.E_Global gv => GVar.ty gv                               of IR.E_Global gv => GVar.ty gv
196                                | IR.E_State(NONE, sv) => SVar.ty sv                                | IR.E_State(NONE, sv) => SVar.ty sv
# Line 210  Line 210 
210                                        then ()                                        then ()
211                                        else errFn [                                        else errFn [
212                                            S "argument type mismatch in application of ",                                            S "argument type mismatch in application of ",
213                                            S(Op.toString rator),                                            S(Op.toString rator), S(cxt()),
214                                            NL, S "expected: ", TYS paramTys,                                            NL, S "expected: ", TYS paramTys,
215                                            NL, S "found:    ", TYS argTys                                            NL, S "found:    ", TYS argTys
216                                          ];                                          ];
217                                      resTy                                      resTy
218                                    end                                    end
219                                | IR.E_Vec es => let                                | IR.E_Vec(_, es) => let
220                                    fun chkArg (i, e) = (case chk e                                    fun chkArg (i, e) = (case chk e
221                                           of Ty.VecTy(1, 1) => () (* ok *)                                           of Ty.VecTy(1, 1) => () (* ok *)
222                                            | ty => errFn [                                            | ty => errFn [
223                                                  S "component ", S(Int.toString i),                                                  S "component ", S(Int.toString i),
224                                                  S " of vector does has type ", TY ty                                                  S " of vector does has type ", TY ty, S(cxt())
225                                                ])                                                ])
226                                  (* check the result vector type *)                                  (* check the result vector type *)
227                                    val ty = (case layout(List.length es)                                    val ty = (case layout(List.length es)
228    (* FIXME: check layout width against E_Vec width *)
229                                           of {wid, padded, pieces=[w]} => Ty.VecTy(wid, w)                                           of {wid, padded, pieces=[w]} => Ty.VecTy(wid, w)
230                                            | {wid, ...} => (                                            | {wid, ...} => (
231                                                errFn [                                                errFn [
232                                                    S "invalid width ", S(Int.toString wid),                                                    S "invalid width ", S(Int.toString wid),
233                                                    S " for E_Vec"                                                    S " for E_Vec", S(cxt())
234                                                  ];                                                  ];
235                                                Ty.VecTy(wid, wid))                                                Ty.VecTy(List.length es, wid))
236                                          (* end case *))                                          (* end case *))
237                                    in                                    in
238                                      List.appi chkArg es;                                      List.appi chkArg es;
239                                      ty                                      ty
240                                    end                                    end
241                                | IR.E_Cons([], ty) => (                                | IR.E_Cons([], ty) => (
242                                    errFn [S "empty cons"];                                    errFn [S "empty cons", S(cxt())];
243                                    ty)                                    ty)
244                                | IR.E_Cons(es, consTy as Ty.TensorTy dd) => let                                | IR.E_Cons(es, consTy as Ty.TensorTy dd) => let
245                                    val nelems = List.foldl Int.* 1 dd                                    val nelems = List.foldl Int.* 1 dd
246                                    in                                    in
247                                      if (length es <> nelems)                                      if (length es <> nelems)
248                                        then errFn [                                        then errFn [
249                                            S "cons has incorrect number of elements",                                            S "cons has incorrect number of elements", S(cxt()),
250                                            NL, S "  expected: ", S(Int.toString nelems),                                            NL, S "  expected: ", S(Int.toString nelems),
251                                            NL, S "  found:    ", S(Int.toString(length es))                                            NL, S "  found:    ", S(Int.toString(length es))
252                                          ]                                          ]
# Line 254  Line 255 
255                                      consTy                                      consTy
256                                    end                                    end
257                                | IR.E_Cons(es, ty) => (                                | IR.E_Cons(es, ty) => (
258                                    errFn [S "unexpected type for cons: ", TY ty];                                    errFn [S "unexpected type for cons", S(cxt()), S ": ", TY ty];
259                                    ty)                                    ty)
260                                | IR.E_Seq([], ty as Ty.SeqTy(_, SOME 0)) => ty                                | IR.E_Seq([], ty as Ty.SeqTy(_, SOME 0)) => ty
261                                | IR.E_Seq([], ty as Ty.SeqTy(_, SOME n)) => (                                | IR.E_Seq([], ty as Ty.SeqTy(_, SOME n)) => (
262                                    errFn [S "empty sequence, but expected ", TY ty];                                    errFn [S "empty sequence, but expected ", TY ty, S(cxt())];
263                                    ty)                                    ty)
264                                | IR.E_Seq(es, seqTy as Ty.SeqTy(ty, NONE)) => (                                | IR.E_Seq(es, seqTy as Ty.SeqTy(ty, NONE)) => (
265                                    chkElems ("sequence", ty, es);                                    chkElems ("sequence", ty, es);
# Line 266  Line 267 
267                                | IR.E_Seq(es, seqTy as Ty.SeqTy(ty, SOME n)) => (                                | IR.E_Seq(es, seqTy as Ty.SeqTy(ty, SOME n)) => (
268                                    if (length es <> n)                                    if (length es <> n)
269                                      then errFn [                                      then errFn [
270                                          S "sequence has incorrect number of elements",                                          S "sequence has incorrect number of elements", S(cxt()),
271                                          NL, S "  expected: ", S(Int.toString n),                                          NL, S "  expected: ", S(Int.toString n),
272                                          NL, S "  found:    ", S(Int.toString(length es))                                          NL, S "  found:    ", S(Int.toString(length es))
273                                        ]                                        ]
# Line 274  Line 275 
275                                    chkElems ("sequence", ty, es);                                    chkElems ("sequence", ty, es);
276                                    seqTy)                                    seqTy)
277                                | IR.E_Seq(es, ty) => (                                | IR.E_Seq(es, ty) => (
278                                    errFn [S "unexpected type for sequence: ", TY ty];                                    errFn [S "unexpected type for sequence", S(cxt()), S ": ", TY ty];
279                                    ty)                                    ty)
280                                | IR.E_Pack(layout, es) => let                                | IR.E_Pack(layout, es) => let
281                                    fun chkOne (i, ty, ty') = if Ty.same(ty, ty')                                    fun chkOne (i, ty, ty') = if Ty.same(ty, ty')
282                                          then ()                                          then ()
283                                          else errFn[                                          else errFn[
284                                              S "mismatch in component ", S(Int.toString i),                                              S "mismatch in component ", S(Int.toString i),
285                                              S " of PACK",                                              S " of PACK", S(cxt()),
286                                              NL, S "  expected: ", TY ty',                                              NL, S "  expected: ", TY ty',
287                                              NL, S "  found:    ", TY ty                                              NL, S "  found:    ", TY ty
288                                            ]                                            ]
# Line 296  Line 297 
297                                      if Ty.same(ty, expectedTy)                                      if Ty.same(ty, expectedTy)
298                                        then ()                                        then ()
299                                        else errFn [                                        else errFn [
300                                            S "type mismatch in E_VLoad",                                            S "type mismatch in E_VLoad, S(cxt())",
301                                            NL, S "  expected: ", TY expectedTy,                                            NL, S "  expected: ", TY expectedTy,
302                                            NL, S "  found:    ", TY ty                                            NL, S "  found:    ", TY ty
303                                          ];                                          ];
304                                      Ty.nthVec(layout, i)                                      Ty.nthVec(layout, i)
305                                    end                                    end
306                              (* end case *))                              (* end case *))
307                        and chkElems (cxt, ty, []) = ()                        and chkElems (cxt', ty, []) = ()
308                          | chkElems (cxt, ty, e::es) = let                          | chkElems (cxt', ty, e::es) = let
309                              val ty' = chk e                              val ty' = chk e
310                              in                              in
311                                if Ty.same(ty, ty')                                if Ty.same(ty, ty')
312                                  then ()                                  then ()
313                                  else errFn [                                  else errFn [
314                                      S "element of ", S cxt, S " has incorrect type",                                      S "element of ", S cxt', S " has incorrect type", S(cxt()),
315                                      NL, S "expected: ", TY ty,                                      NL, S "expected: ", TY ty,
316                                      NL, S "found:    ", TY ty'                                      NL, S "found:    ", TY ty'
317                                    ];                                    ];
318                                chkElems (cxt, ty, es)                                chkElems (cxt', ty, es)
319                              end                              end
320                        in                        in
321                          chk e                          chk e
# Line 322  Line 323 
323                  fun chkStm (stm, bvs : VSet.set) = (case stm                  fun chkStm (stm, bvs : VSet.set) = (case stm
324                         of IR.S_Comment _ => bvs                         of IR.S_Comment _ => bvs
325                          | IR.S_Assign(isDef, x, e) => let                          | IR.S_Assign(isDef, x, e) => let
326                              val ty = chkExp (bvs, e)                              val ty = chkExp (
327                                      fn () => concat[" in assignment to local ", Var.name x],
328                                      bvs, e)
329                              in                              in
330                                if Ty.same(Var.ty x, ty)                                if Ty.same(Var.ty x, ty)
331                                  then ()                                  then ()
# Line 337  Line 340 
340                              end                              end
341                          | IR.S_MAssign(xs, e) => raise Fail "FIXME"                          | IR.S_MAssign(xs, e) => raise Fail "FIXME"
342                          | IR.S_GAssign(gv, e) => let                          | IR.S_GAssign(gv, e) => let
343                              val ty = chkExp (bvs, e)                              val ty = chkExp (
344                                      fn () => concat[" assignment to global ", GVar.name gv],
345                                      bvs, e)
346                              in                              in
347                                if Ty.same(GVar.ty gv, ty)                                if Ty.same(GVar.ty gv, ty)
348                                  then ()                                  then ()
# Line 349  Line 354 
354                                bvs                                bvs
355                              end                              end
356                          | IR.S_IfThen(e, b) => let                          | IR.S_IfThen(e, b) => let
357                              val ty = chkExp (bvs, e)                              val ty = chkExp (fn () => " in if-then", bvs, e)
358                              in                              in
359                                if Ty.same(ty, Ty.BoolTy)                                if Ty.same(ty, Ty.BoolTy)
360                                  then ()                                  then ()
# Line 360  Line 365 
365                                bvs                                bvs
366                              end                              end
367                          | IR.S_IfThenElse(e, b1, b2) => let                          | IR.S_IfThenElse(e, b1, b2) => let
368                              val ty = chkExp (bvs, e)                              val ty = chkExp (fn () => " in if-then-else", bvs, e)
369                              in                              in
370                                if Ty.same(ty, Ty.BoolTy)                                if Ty.same(ty, Ty.BoolTy)
371                                  then ()                                  then ()
# Line 372  Line 377 
377                                bvs                                bvs
378                              end                              end
379                          | IR.S_Foreach(x, e, b) => (                          | IR.S_Foreach(x, e, b) => (
380                              case chkExp (bvs, e)                              case chkExp (fn () => " in foreach", bvs, e)
381                               of Ty.SeqTy(ty, _) =>                               of Ty.SeqTy(ty, _) =>
382                                    if Ty.same(ty, Var.ty x)                                    if Ty.same(ty, Var.ty x)
383                                      then ()                                      then ()
# Line 390  Line 395 
395                          | IR.S_LoadNrrd(x, name) => bvs (* FIXME: check type of x *)                          | IR.S_LoadNrrd(x, name) => bvs (* FIXME: check type of x *)
396                          | IR.S_Input(gv, _, _, NONE) => bvs                          | IR.S_Input(gv, _, _, NONE) => bvs
397                          | IR.S_Input(gv, _, _, SOME e) => let                          | IR.S_Input(gv, _, _, SOME e) => let
398                              val ty = chkExp (bvs, e)                              val ty = chkExp (fn () => concat[" in input ", GVar.name gv], bvs, e)
399                              in                              in
400                                if Ty.same(GVar.ty gv, ty)                                if Ty.same(GVar.ty gv, ty)
401                                  then ()                                  then ()
# Line 412  Line 417 
417                              (* end case *);                              (* end case *);
418                              bvs)                              bvs)
419                          | IR.S_New(_, es) => (                          | IR.S_New(_, es) => (
420                              List.app (fn e => ignore (chkExp(bvs, e))) es;                              List.app (fn e => ignore (chkExp(fn () => concat[" in new"], bvs, e))) es;
421                              bvs)                              bvs)
422                          | IR.S_Save(sv, e) => let                          | IR.S_Save(sv, e) => let
423                              val ty = chkExp (bvs, e)                              val ty = chkExp (fn () => concat[" in save ", SVar.name sv], bvs, e)
424                              in                              in
425                                if Ty.same(SVar.ty sv, ty)                                if Ty.same(SVar.ty sv, ty)
426                                  then ()                                  then ()
# Line 434  Line 439 
439                                  ]                                  ]
440                                else ();                                else ();
441                              ListPair.appi                              ListPair.appi
442                                (fn (i, ty, e) => let val ty' = chkExp(bvs, e)                                (fn (i, ty, e) => let
443                                    val ty' = chkExp(fn () => concat[" in print"], bvs, e)
444                                  in                                  in
445                                    if Ty.same(ty, ty')                                    if Ty.same(ty, ty')
446                                      then ()                                      then ()

Legend:
Removed from v.3861  
changed lines
  Added in v.3862

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0