def p_LValueExpr(p): """LValueExpr : ID '[' Expr ']' | ID""" # ID '[' Expr ']' if len(p) == 5: p[0] = IR.VecAcc(p[1], p[3]) # ID elif len(p) == 2: p[0] = IR.Var(p[1])
def factor(self, symtab): if self.accept('ident'): var = symtab.find(self.value) offs = self.array_offset(symtab) if offs is None: return ir.Var(var=var, symtab=symtab) else: return ir.ArrayElement(var=var, offset=offs, symtab=symtab) if self.accept('number'): return ir.Const(value=int(self.value), symtab=symtab) elif self.accept('lparen'): expr = self.expression() self.expect('rparen') return expr else: self.error("factor: syntax error") self.getsym()
def linearize_cjump(self, tree, children): if isinstance(children[0], ir.ESeq): # cjump(eseq[stms,e1],e2) => seq([stms,cjump(e1,e2)]) eseq = children[0] stms = self.stms(eseq) e1 = eseq.children[-1] assert (not isinstance(e1, ir.ESeq)) e2 = children[1] newtree = ir.Seq( stms + [ ir.CJump(tree.op, e1, e2, tree.trueDest, tree.falseDest, tree.node) ], eseq.node) newtree = self.linearize(newtree) elif isinstance(children[1], ir.ESeq): #cjump(e1,eseq(stms,e2)) # => seq([stms,cjump(e1,e2)]) IF commutes(e1,stms) # => seq(move(temp(t),e1), seq(stms,cjump(t, e2)) otherwise eseq = children[1] e1 = children[0] e2 = eseq.children[-1] stms = self.stms(eseq) if commutes(e1, stms): newtree = ir.Seq( stms + \ [ir.CJump(tree.op,e1,e2, tree.trueDest, tree.falseDest, tree.node)], eseq.node) newtree = self.linearize(newtree) else: t = ir.Var(self.symbols.newTemp(e1.datatype), e1.node, e1.datatype) move = ir.Move(t, e1, e1.node, e1.datatype) cjump = ir.CJump(tree.op, t, e2, tree.trueDest, tree.falseDest, tree.node) newtree = ir.Seq([move] + stms + [cjump], tree.node) newtree = self.linearize(newtree) else: newtree = copy.copy(tree) newtree.children = children return newtree
def linearize_binop(self, tree, children): if isinstance(children[0], ir.ESeq): # binop(eseq[stms,e1],e2) => eseq([stms,binop(e1,e2)]) eseq = children[0] stms = self.stms(eseq) e1 = eseq.children[-1] assert (not isinstance(e1, ir.ESeq)) e2 = children[1] newtree = ir.ESeq( stms, ir.Binop(tree.op, [e1, e2], tree.node, tree.datatype), eseq.node, eseq.datatype) newtree = self.linearize(newtree) elif isinstance(children[1], ir.ESeq): #binop(e1,eseq(stms,e2)) # => eseq([stms,binop(e1,e2)]) IF commutes(e1,stms) # => eseq(move(temp(t),e1), eseq(stms,binop(t, e2)) otherwise eseq = children[1] e1 = children[0] e2 = eseq.children[-1] stms = self.stms(eseq) if commutes(e1, stms): newtree = ir.ESeq( stms, ir.Binop(tree.op, [e1, e2], tree.node, tree.datatype), eseq.node, eseq.datatype) newtree = self.linearize(newtree) else: t = ir.Var(self.symbols.newTemp(e1.datatype), e1.node, e1.datatype) move = ir.Move(t, e1, e1.node, e1.datatype) binop = ir.Binop(tree.op, [t, e2], tree.node, tree.datatype) eseq = ir.ESeq(stms, binop, eseq.node, eseq.datatype) newtree = ir.ESeq([move], eseq, tree.node, tree.datatype) newtree = self.linearize(newtree) else: newtree = ir.Binop(tree.op, children, tree.node, tree.datatype) return newtree
def p_PrimExprID(p): """PrimExpr : ID""" p[0] = IR.Var(p[1])
def get_gradient_var(self): temp_ir = ir.Var("@_gradient", absyn.Empty(0), fracttypes.Gradient) var = self.var(temp_ir) return var
def var(self, name="a"): return ir.Var(name, self.fakeNode, Int)