def p_postfix_expression_3(p): 'postfix_expression : postfix_expression LPAREN argument_expression_list_opt RPAREN' p[0] = ast.FunCallExp(p[1], p[3], p.lineno(1) + __start_line_no - 1)
def __getLoopBoundScanningStmts(self, stmts, tile_level, outer_loop_inames, loop_info_table): ''' Generate an explicit loop-bound scanning code used at runtime to determine the latest start and the earliest end of scanning full tiles. ''' # (optimization) generate code that determines the loop bounds of full tiles at compile time if self.affine_lbound_exps: return self.__staticLoopBoundScanning(stmts, tile_level, outer_loop_inames, loop_info_table) # initialize all returned variables scan_stmts = [] lbound_info_seq = [] int_vars = [] # iterate over each statement to find loop bounds that are functions of outer loop iterators min_int = ast.NumLitExp(-2147483648, ast.NumLitExp.INT) max_int = ast.NumLitExp(2147483647, ast.NumLitExp.INT) lb_exps_table = {} ub_exps_table = {} pre_scan_stmts = [] post_scan_stmts = [] scan_loops = SimpleLoops() for stmt in stmts: # skip all non loop statements if not isinstance(stmt, ast.ForStmt): lbound_info_seq.append(None) continue # extract this loop structure id, lb_exp, ub_exp, st_exp, lbody = self.ast_util.getForLoopInfo( stmt) # see if the loop bound expressions are bound/free of outer loop iterators lb_inames = filter( lambda i: self.ast_util.containIdentName(lb_exp, i), outer_loop_inames) ub_inames = filter( lambda i: self.ast_util.containIdentName(ub_exp, i), outer_loop_inames) # skip loops with bound expressions that are free of outer loop iterators if not lb_inames and not ub_inames: lbound_info_seq.append(None) continue # check if this loop runs only once is_one_time_loop = str(lb_exp) == str(ub_exp) # generate booleans to indicate the needs of prolog, epilog, and orio.main.tiled loop if is_one_time_loop: need_tiled_loop = False need_prolog = False need_epilog = False else: need_tiled_loop = True need_prolog = len(lb_inames) > 0 need_epilog = len(ub_inames) > 0 # generate new variable names for both the new lower and upper loop bounds if need_tiled_loop: lb_name, ub_name = self.__getLoopBoundNames() int_vars.extend([lb_name, ub_name]) else: lb_name = '' ub_name = '' # append information about the new loop bounds lbinfo = (lb_name, ub_name, need_prolog, need_epilog, need_tiled_loop) lbound_info_seq.append(lbinfo) # skip generating loop-bound scanning code (if it's a one-time loop) if not need_tiled_loop: continue # generate loop-bound scanning code for the prolog if str(lb_exp) in lb_exps_table: lb_var = lb_exps_table[str(lb_exp)] a = ast.BinOpExp(ast.IdentExp(lb_name), lb_var.replicate(), ast.BinOpExp.EQ_ASGN) post_scan_stmts.append(ast.ExpStmt(a)) else: if need_prolog: a = ast.BinOpExp(ast.IdentExp(lb_name), min_int.replicate(), ast.BinOpExp.EQ_ASGN) pre_scan_stmts.append(ast.ExpStmt(a)) a = ast.BinOpExp( ast.IdentExp(lb_name), ast.FunCallExp( ast.IdentExp('max'), [ast.IdentExp(lb_name), lb_exp.replicate()]), ast.BinOpExp.EQ_ASGN) scan_loops.insertLoop(lb_inames, ast.ExpStmt(a)) else: a = ast.BinOpExp(ast.IdentExp(lb_name), lb_exp.replicate(), ast.BinOpExp.EQ_ASGN) pre_scan_stmts.append(ast.ExpStmt(a)) lb_exps_table[str(lb_exp)] = ast.IdentExp(lb_name) # generate loop-bound scaning code for the epilog if str(ub_exp) in ub_exps_table: ub_var = ub_exps_table[str(ub_exp)] a = ast.BinOpExp(ast.IdentExp(ub_name), ub_var.replicate(), ast.BinOpExp.EQ_ASGN) post_scan_stmts.append(ast.ExpStmt(a)) else: if need_epilog: a = ast.BinOpExp(ast.IdentExp(ub_name), max_int.replicate(), ast.BinOpExp.EQ_ASGN) pre_scan_stmts.append(ast.ExpStmt(a)) a = ast.BinOpExp( ast.IdentExp(ub_name), ast.FunCallExp( ast.IdentExp('min'), [ast.IdentExp(ub_name), ub_exp.replicate()]), ast.BinOpExp.EQ_ASGN) scan_loops.insertLoop(ub_inames, ast.ExpStmt(a)) else: a = ast.BinOpExp(ast.IdentExp(ub_name), ub_exp.replicate(), ast.BinOpExp.EQ_ASGN) pre_scan_stmts.append(ast.ExpStmt(a)) ub_exps_table[str(ub_exp)] = ast.IdentExp(ub_name) # build a new loop information tabe for generating the loop-bound scanning code n_loop_info_table = {} for iname, linfo in loop_info_table.items(): _, _, _, st_exp, _ = linfo n_loop_info_table[iname] = (self.__getTileSizeName( iname, tile_level), self.__getTileIterName(iname, tile_level), st_exp) # convert the "SimpleLoop" abstractions into loop ASTs scan_loop_stmts = scan_loops.convertToASTs(tile_level, n_loop_info_table) # merge all scanning statements scan_stmts = pre_scan_stmts + scan_loop_stmts + post_scan_stmts # return all necessary information return (scan_stmts, lbound_info_seq, int_vars)
def p_postfix_expression_3(p): "postfix_expression : postfix_expression LPAREN argument_expression_list_opt RPAREN" p[0] = ast.FunCallExp(p[1], p[3])
def p_postfix_expression_3(p): "postfix_expression : postfix_expression LPAREN argument_expression_list_opt RPAREN" p[0] = ast.FunCallExp(p[1], p[3], getLineNumber(p.lineno(1)))