亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? flow.c

?? 這是完整的gcc源代碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
/* Data flow analysis for GNU compiler.   Copyright (C) 1987, 1988 Free Software Foundation, Inc.This file is part of GNU CC.GNU CC is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 1, or (at your option)any later version.GNU CC is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with GNU CC; see the file COPYING.  If not, write tothe Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  *//* This file contains the data flow analysis pass of the compiler.   It computes data flow information   which tells combine_instructions which insns to consider combining   and controls register allocation.   Additional data flow information that is too bulky to record   is generated during the analysis, and is used at that time to   create autoincrement and autodecrement addressing.   The first step is dividing the function into basic blocks.   find_basic_blocks does this.  Then life_analysis determines   where each register is live and where it is dead.   ** find_basic_blocks **   find_basic_blocks divides the current function's rtl   into basic blocks.  It records the beginnings and ends of the   basic blocks in the vectors basic_block_head and basic_block_end,   and the number of blocks in n_basic_blocks.   find_basic_blocks also finds any unreachable loops   and deletes them.   ** life_analysis **   life_analysis is called immediately after find_basic_blocks.   It uses the basic block information to determine where each   hard or pseudo register is live.   ** live-register info **   The information about where each register is live is in two parts:   the REG_NOTES of insns, and the vector basic_block_live_at_start.   basic_block_live_at_start has an element for each basic block,   and the element is a bit-vector with a bit for each hard or pseudo   register.  The bit is 1 if the register is live at the beginning   of the basic block.   To each insn's REG_NOTES is added an element for each register   that is live before the insn or set by the insn, but is dead   after the insn.   To determine which registers are live after any insn, one can   start from the beginning of the basic block and scan insns, noting   which registers are set by each insn and which die there.   ** Other actions of life_analysis **   life_analysis sets up the LOG_LINKS fields of insns because the   information needed to do so is readily available.   life_analysis deletes insns whose only effect is to store a value   that is never used.   life_analysis notices cases where a reference to a register as   a memory address can be combined with a preceding or following   incrementation or decrementation of the register.  The separate   instruction to increment or decrement is deleted and the address   is changed to a POST_INC or similar rtx.   Each time an incrementing or decrementing address is created,   a REG_INC element is added to the insn's REG_NOTES list.   life_analysis fills in certain vectors containing information about   register usage: reg_n_refs, reg_n_deaths, reg_n_sets,   reg_live_length, reg_n_calls_crosses and reg_basic_block.  */#include <stdio.h>#include "config.h"#include "rtl.h"#include "basic-block.h"#include "regs.h"#include "hard-reg-set.h"#include "flags.h"#include "obstack.h"#define obstack_chunk_alloc xmalloc#define obstack_chunk_free freeextern int xmalloc ();extern void free ();/* Get the basic block number of an insn.   This info should not be expected to remain available   after the end of life_analysis.  */#define BLOCK_NUM(INSN)  uid_block_number[INSN_UID (INSN)]/* This is where the BLOCK_NUM values are really stored.   This is set up by find_basic_blocks and used there and in life_analysis,   and then freed.  */static short *uid_block_number;/* INSN_VOLATILE (insn) is 1 if the insn refers to anything volatile.  */#define INSN_VOLATILE(INSN) uid_volatile[INSN_UID (INSN)]static char *uid_volatile;/* Number of basic blocks in the current function.  */int n_basic_blocks;/* Maximum register number used in this function, plus one.  */int max_regno;/* Indexed by n, gives number of basic block that  (REG n) is used in.   If the value is REG_BLOCK_GLOBAL (-2),   it means (REG n) is used in more than one basic block.   REG_BLOCK_UNKNOWN (-1) means it hasn't been seen yet so we don't know.   This information remains valid for the rest of the compilation   of the current function; it is used to control register allocation.  */short *reg_basic_block;/* Indexed by n, gives number of times (REG n) is used or set, each   weighted by its loop-depth.   This information remains valid for the rest of the compilation   of the current function; it is used to control register allocation.  */short *reg_n_refs;/* Indexed by n, gives number of times (REG n) is set.   This information remains valid for the rest of the compilation   of the current function; it is used to control register allocation.  */short *reg_n_sets;/* Indexed by N, gives number of places register N dies.   This information remains valid for the rest of the compilation   of the current function; it is used to control register allocation.  */short *reg_n_deaths;/* Indexed by N, gives 1 if that reg is live across any CALL_INSNs.   This information remains valid for the rest of the compilation   of the current function; it is used to control register allocation.  */int *reg_n_calls_crossed;/* Indexed by N, gives the uid of the first insn that mentions reg N,   provided that reg is local to one basic block.   The value here is undefined otherwise.  */rtx *reg_first_use;/* Total number of instructions at which (REG n) is live.   The larger this is, the less priority (REG n) gets for   allocation in a real register.   This information remains valid for the rest of the compilation   of the current function; it is used to control register allocation.   local-alloc.c may alter this number to change the priority.   Negative values are special.   -1 is used to mark a pseudo reg which has a constant or memory equivalent   and is used infrequently enough that it should not get a hard register.   -2 is used to mark a pseudo reg for a parameter, when a frame pointer   is not required.  global-alloc.c makes an allocno for this but does   not try to assign a hard register to it.  */int *reg_live_length;/* Element N is the next insn that uses (hard or pseudo) register number N   within the current basic block; or zero, if there is no such insn.   This is valid only during the final backward scan in propagate_block.  */static rtx *reg_next_use;/* Size of a regset for the current function,   in (1) bytes and (2) elements.  */int regset_bytes;int regset_size;/* Element N is first insn in basic block N.   This info lasts until we finish compiling the function.  */rtx *basic_block_head;/* Element N is last insn in basic block N.   This info lasts until we finish compiling the function.  */rtx *basic_block_end;/* Element N is a regset describing the registers live   at the start of basic block N.   This info lasts until we finish compiling the function.  */regset *basic_block_live_at_start;/* Regset of regs live when calls to `setjmp'-like functions happen.  */regset regs_live_at_setjmp;/* Element N is nonzero if control can drop into basic block N   from the preceding basic block.  Freed after life_analysis.  */static char *basic_block_drops_in;/* Element N is depth within loops of basic block number N.   Freed after life_analysis.  */static short *basic_block_loop_depth;/* Element N nonzero if basic block N can actually be reached.   Vector exists only during find_basic_blocks.  */static char *block_live_static;/* Depth within loops of basic block being scanned for lifetime analysis,   plus one.  This is the weight attached to references to registers.  */static int loop_depth;/* Define AUTO_INC_DEC if machine has any kind of incrementing   or decrementing addressing.  */#ifdef HAVE_PRE_DECREMENT#define AUTO_INC_DEC#endif#ifdef HAVE_PRE_INCREMENT#define AUTO_INC_DEC#endif#ifdef HAVE_POST_DECREMENT#define AUTO_INC_DEC#endif#ifdef HAVE_POST_INCREMENT#define AUTO_INC_DEC#endif/* Forward declarations */static void find_basic_blocks ();static void life_analysis ();static void mark_label_ref ();void allocate_for_life_analysis (); /* Used also in stupid_life_analysis */static void init_regset_vector ();static void propagate_block ();static void mark_set_regs ();static void mark_used_regs ();static int insn_dead_p ();static int libcall_dead_p ();static int try_pre_increment ();static int try_pre_increment_1 ();static rtx find_use_as_address ();void dump_flow_info ();/* Find basic blocks of the current function and perform data flow analysis.   F is the first insn of the function and NREGS the number of register numbers   in use.  */voidflow_analysis (f, nregs, file)     rtx f;     int nregs;     FILE *file;{  register rtx insn;  register int i;  register int max_uid = 0;  /* Count the basic blocks.  Also find maximum insn uid value used.  */  {    register RTX_CODE prev_code = JUMP_INSN;    register RTX_CODE code;    for (insn = f, i = 0; insn; insn = NEXT_INSN (insn))      {	code = GET_CODE (insn);	if (INSN_UID (insn) > max_uid)	  max_uid = INSN_UID (insn);	if (code == CODE_LABEL	    || (prev_code != INSN && prev_code != CALL_INSN		&& prev_code != CODE_LABEL		&& (code == INSN || code == CALL_INSN || code == JUMP_INSN)))	  i++;	if (code != NOTE)	  prev_code = code;      }  }  /* Allocate some tables that last till end of compiling this function     and some needed only in find_basic_blocks and life_analysis.  */  n_basic_blocks = i;  basic_block_head = (rtx *) oballoc (n_basic_blocks * sizeof (rtx));  basic_block_end = (rtx *) oballoc (n_basic_blocks * sizeof (rtx));  basic_block_drops_in = (char *) alloca (n_basic_blocks);  basic_block_loop_depth = (short *) alloca (n_basic_blocks * sizeof (short));  uid_block_number = (short *) alloca ((max_uid + 1) * sizeof (short));  uid_volatile = (char *) alloca (max_uid + 1);  bzero (uid_volatile, max_uid + 1);  find_basic_blocks (f);  life_analysis (f, nregs);  if (file)    dump_flow_info (file);  basic_block_drops_in = 0;  uid_block_number = 0;  basic_block_loop_depth = 0;}/* Find all basic blocks of the function whose first insn is F.   Store the correct data in the tables that describe the basic blocks,   set up the chains of references for each CODE_LABEL, and   delete any entire basic blocks that cannot be reached.  */static voidfind_basic_blocks (f)     rtx f;{  register rtx insn;  register int i;  /* Initialize the ref chain of each label to 0.  */  /* Record where all the blocks start and end and their depth in loops.  */  /* For each insn, record the block it is in.  */  {    register RTX_CODE prev_code = JUMP_INSN;    register RTX_CODE code;    int depth = 1;    for (insn = f, i = -1; insn; insn = NEXT_INSN (insn))      {	code = GET_CODE (insn);	if (code == NOTE)	  {	    if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)	      depth++;	    else if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END)	      depth--;	  }	else if (code == CODE_LABEL		 || (prev_code != INSN && prev_code != CALL_INSN		     && prev_code != CODE_LABEL		     && (code == INSN || code == CALL_INSN || code == JUMP_INSN)))	  {	    basic_block_head[++i] = insn;	    basic_block_end[i] = insn;	    basic_block_loop_depth[i] = depth;	    if (code == CODE_LABEL)	      LABEL_REFS (insn) = insn;	  }	else if (code == INSN || code == CALL_INSN || code == JUMP_INSN)	  basic_block_end[i] = insn;	BLOCK_NUM (insn) = i;	if (code != NOTE)	  prev_code = code;      }    if (i + 1 != n_basic_blocks)      abort ();  }  /* Record which basic blocks control can drop in to.  */  {    register int i;    for (i = 0; i < n_basic_blocks; i++)      {	register rtx insn = PREV_INSN (basic_block_head[i]);	/* TEMP1 is used to avoid a bug in Sequent's compiler.  */	register int temp1;	while (insn && GET_CODE (insn) == NOTE)	  insn = PREV_INSN (insn);	temp1 = insn && GET_CODE (insn) != BARRIER;	basic_block_drops_in[i] = temp1;      }  }  /* Now find which basic blocks can actually be reached     and put all jump insns' LABEL_REFS onto the ref-chains     of their target labels.  */  if (n_basic_blocks > 0)    {      register char *block_live = (char *) alloca (n_basic_blocks);      register char *block_marked = (char *) alloca (n_basic_blocks);      int something_marked = 1;      /* Initialize with just block 0 reachable and no blocks marked.  */      bzero (block_live, n_basic_blocks);      bzero (block_marked, n_basic_blocks);      block_live[0] = 1;      block_live_static = block_live;      /* Pass over all blocks, marking each block that is reachable	 and has not yet been marked.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
男女男精品视频| 久久97超碰色| 精品少妇一区二区三区日产乱码 | 国产女人18毛片水真多成人如厕 | 国产网站一区二区三区| 欧洲国产伦久久久久久久| 国精产品一区一区三区mba桃花| 亚洲视频一二区| 26uuu精品一区二区在线观看| 日本道精品一区二区三区| 国产麻豆精品视频| 日韩av高清在线观看| 亚洲欧美日韩成人高清在线一区| 精品福利一二区| 欧美三级视频在线| av午夜一区麻豆| 国产在线国偷精品产拍免费yy| 亚洲一区日韩精品中文字幕| 欧美经典一区二区三区| 日韩欧美自拍偷拍| 欧美四级电影在线观看| 91香蕉视频污在线| 成人午夜视频在线观看| 国产一区二区三区国产| 美国三级日本三级久久99| 一区二区成人在线| 亚洲色图制服诱惑| 亚洲欧洲av另类| 欧美激情综合网| 国产日韩av一区二区| 久久久久九九视频| 精品av久久707| 7777精品久久久大香线蕉| 欧美在线综合视频| 色老汉一区二区三区| jiyouzz国产精品久久| 粉嫩aⅴ一区二区三区四区| 国产在线观看免费一区| 狠狠v欧美v日韩v亚洲ⅴ| 理论片日本一区| 麻豆91在线播放免费| 蜜臀av亚洲一区中文字幕| 天使萌一区二区三区免费观看| 亚洲一级二级在线| 亚洲猫色日本管| 亚洲精品视频观看| 亚洲黄色免费网站| 亚洲无人区一区| 无吗不卡中文字幕| 视频在线观看一区二区三区| 爽好久久久欧美精品| 日本中文字幕一区二区有限公司| 日韩黄色免费电影| 免费成人美女在线观看.| 蜜乳av一区二区| 国内欧美视频一区二区| 国产经典欧美精品| 北条麻妃一区二区三区| 色婷婷激情一区二区三区| 欧美午夜电影在线播放| 欧美精品久久天天躁| 日韩一区二区三区在线观看| 久久综合九色欧美综合狠狠| 国产日产欧美一区二区三区 | 国产午夜精品一区二区| 欧美国产综合一区二区| 亚洲视频一二三| 性久久久久久久久| 麻豆91精品视频| 国产盗摄女厕一区二区三区| 99久久精品国产毛片| 欧美三日本三级三级在线播放| 91.xcao| 精品sm捆绑视频| 亚洲色图.com| 蜜桃久久久久久久| www.欧美日韩| 69久久99精品久久久久婷婷| 国产色爱av资源综合区| 亚洲视频一区二区在线| 亚洲与欧洲av电影| 精品一区二区免费在线观看| 99久久久久免费精品国产 | 久久99九九99精品| 成人黄色一级视频| 欧美日韩激情一区二区三区| 久久天堂av综合合色蜜桃网| 亚洲欧美日韩国产另类专区| 精品一区二区成人精品| 色综合一区二区| 亚洲人成亚洲人成在线观看图片| 一个色综合网站| 精品无人区卡一卡二卡三乱码免费卡 | 狠狠色丁香久久婷婷综| 色综合久久久网| xfplay精品久久| 亚洲国产成人av网| 大美女一区二区三区| 欧美一区二区三区爱爱| 亚洲欧美乱综合| 国产成人免费视频精品含羞草妖精| 精品视频一区二区不卡| 中文欧美字幕免费| 精品一区二区三区视频在线观看| 色综合激情五月| 欧美激情中文字幕| 久久成人羞羞网站| 欧美日韩日日摸| 国产精品福利一区| 久久99最新地址| 欧美人妇做爰xxxⅹ性高电影| 国产精品黄色在线观看| 久久爱www久久做| 欧美群妇大交群中文字幕| 国产精品成人一区二区三区夜夜夜| 久久精品国产久精国产| 欧美日韩在线播| 亚洲免费大片在线观看| 国产99一区视频免费| 精品sm在线观看| 麻豆成人久久精品二区三区小说| 欧美无人高清视频在线观看| 国产精品理论片| 成人午夜碰碰视频| 久久毛片高清国产| 国产真实乱偷精品视频免| 欧美一区二区在线免费播放 | 久久se精品一区二区| 在线成人免费观看| 亚洲成人在线网站| 色噜噜夜夜夜综合网| 亚洲久草在线视频| 99国产精品视频免费观看| 国产精品人成在线观看免费| 国产sm精品调教视频网站| 久久久亚洲综合| 国产老妇另类xxxxx| 日韩你懂的电影在线观看| 日韩成人伦理电影在线观看| 欧美日韩国产首页在线观看| 亚洲网友自拍偷拍| 欧美日韩精品电影| 日韩专区一卡二卡| 欧美一级理论片| 美女视频黄 久久| 精品国产一区二区在线观看| 久久国产夜色精品鲁鲁99| 欧美成人aa大片| 国产一区二区主播在线| 国产欧美日韩中文久久| 成人免费毛片嘿嘿连载视频| 亚洲欧美视频在线观看| 91福利国产成人精品照片| 亚洲国产综合在线| 欧美一区二区在线播放| 美女www一区二区| 久久久欧美精品sm网站| 国产99久久久国产精品潘金网站| 国产精品国产精品国产专区不蜜| 91视频国产观看| 日韩精品电影在线| 欧美电视剧免费观看| 国产成人精品影视| 亚洲天堂久久久久久久| 精品视频999| 六月丁香综合在线视频| 欧美国产激情一区二区三区蜜月| 成人av影院在线| 亚洲最新视频在线播放| 欧美久久一区二区| 国产一区二区看久久| 最新高清无码专区| 欧美区视频在线观看| 国产资源在线一区| 亚洲欧美一区二区三区久本道91| 欧美日韩视频在线第一区 | 99久久久免费精品国产一区二区| 亚洲图片一区二区| 久久久国产综合精品女国产盗摄| 99久久国产免费看| 蜜桃视频在线观看一区| 欧美激情一区二区在线| 欧美少妇性性性| 成人免费av资源| 午夜精品久久久久久| 久久久99久久| 337p亚洲精品色噜噜狠狠| 成人性生交大片免费看在线播放| 五月综合激情网| 中文字幕va一区二区三区| 欧美日韩高清一区二区| 懂色av一区二区三区免费看| 日韩激情在线观看| 18成人在线观看| 精品国产免费久久| 欧美日韩专区在线| 成人精品一区二区三区中文字幕| 午夜精品免费在线| 亚洲人午夜精品天堂一二香蕉| 精品日韩一区二区三区|