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

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

?? loop.c

?? 這是完整的gcc源代碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
/* Move constant computations out of loops.   Copyright (C) 1987, 1988, 1989 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 is the loop optimization pass of the compiler.   It finds invariant computations within loops and moves them   to the beginning of the loop.  Then it identifies basic and    general induction variables.  Strength reduction is applied to the general   induction variables, and induction variable elimination is applied to   the basic induction variables.   It also finds cases where   a register is set within the loop by zero-extending a narrower value   and changes these to zero the entire register once before the loop   and merely copy the low part within the loop.   Most of the complexity is in heuristics to decide when it is worth   while to do these things.  *//* ??? verify_loop would run faster if we made one table   of the minimum and maximum luids from which each label is reached.   Also, it would be faster if loop_store_addrs were a hash table.  */#include "config.h"#include "rtl.h"#include "expr.h"#include "insn-config.h"#include "regs.h"#include "hard-reg-set.h"#include "recog.h"#include "flags.h"#include <stdio.h>/* Vector mapping INSN_UIDs to luids.   The luids are like uids but increase monononically always.   We use them to see whether a jump comes from outside a given loop.  */static int *uid_luid;/* Get the luid of an insn.  */#define INSN_LUID(INSN) (uid_luid[INSN_UID (INSN)])/* 1 + largest uid of any insn.  */static int max_uid;/* 1 + luid of last insn.  */static int max_luid;/* Nonzero if somewhere in the current loop   there is either a subroutine call,   or a store into a memory address that is not fixed,   or a store in a BLKmode memory operand,   or too many different fixed addresses stored in   to record them all in `loop_store_addrs'.   In any of these cases, no memory location can be regarded   as invariant.  */static int unknown_address_altered;/* Nonzero if somewhere in the current loop there is a store   into a memory address that is not fixed but is known to be   part of an aggregate.   In this case, no memory reference in an aggregate may be   considered invariant.  */static int unknown_aggregate_altered;/* Nonzero if somewhere in the current loop there is a store   into a memory address other than a fixed address not in an aggregate.   In this case, no memory reference in an aggregate at a varying address   may be considered invariant.  */static int fixed_aggregate_altered;/* Nonzero if there is a subroutine call in the current loop.   (unknown_address_altered is also nonzero in this case.)  */static int loop_has_call;/* Nonzero if there is a volatile memory reference in the current   loop.  */static int loop_has_volatile;/* Added loop_continue which is the NOTE_INSN_LOOP_CONT of the   current loop.  A continue statement will generate a branch to   NEXT_INSN (loop_continue).  */static rtx loop_continue;/* Indexed by register number, contains the number of times the reg   is set during the loop being scanned.   During code motion, -1 indicates a reg that has been made a candidate.   After code motion, regs moved have 0 (which is accurate now)   while the failed candidates have the original number of times set.   Therefore, at all times, 0 indicates an invariant register;   -1 a conditionally invariant one.  */static short *n_times_set;/* Original value of n_times_set; same except that this value   is not set to -1 for a reg whose sets have been made candidates   and not set to 0 for a reg that is moved.  */static short *n_times_used;/* Index by register number, 1 indicates that the register   cannot be moved or strength reduced.  */static char *may_not_optimize;/* Nonzero means reg N has already been moved out of one loop.   This reduces the desire to move it out of another.  */static char *moved_once;/* Array of fixed memory addresses that are stored in this loop.   If there are too many to fit here,   we just turn on unknown_address_altered.  */#define NUM_STORES 10static rtx loop_store_addrs[NUM_STORES];static int loop_store_widths[NUM_STORES];/* Index of first available slot in above array.  */static int loop_store_addrs_idx;/* Count of movable (i.e. invariant) instructions discovered in the loop.  */static int num_movables;/* Count of memory write instructions discovered in the loop.  */static int num_mem_sets;/* Number of loops contained within the current one, including itself.  */static int loops_enclosed;/* Bound on pseudo register number before loop optimization.   A pseudo has valid regscan info if its number is < old_max_reg.  */static int old_max_reg;/* During the analysis of a loop, a chain of `struct movable's   is made to record all the movable insns found.   Then the entire chain can be scanned to decide which to move.  */struct movable{  rtx insn;			/* A movable insn */  rtx set_src;                  /* The expression this reg is set from.				   Either SET_SRC (body) or a REG_EQUAL.  */  int consec;			/* Number of consecutive following insns 				   that must be moved with this one.  */  int regno;			/* The register it sets */  short lifetime;		/* lifetime of that register;				   may be adjusted when matching movables				   that load the same value are found.  */  short savings;		/* Number of insns we can move for this reg,				   including other movables that force this				   or match this one.  */  unsigned int cond : 1;	/* 1 if only conditionally movable */  unsigned int force : 1;	/* 1 means MUST move this insn */  unsigned int global : 1;	/* 1 means reg is live outside this loop */		/* If PARTIAL is 1, GLOBAL means something different:		   that the reg is live outside the range from where it is set		   to the following label.  */  unsigned int done : 1;	/* 1 inhibits further processing of this */  /* 1 in PARTIAL means this reg is used for zero-extending.     In particular, moving it does not make it invariant.  */  unsigned int partial : 1;  enum machine_mode savemode;   /* Nonzero means it is a mode for a low part				   that we should avoid changing when clearing				   the rest of the reg.  */  struct movable *match;	/* First entry for same value */  struct movable *forces;	/* An insn that must be moved if this is */  struct movable *next;};static FILE *loop_dump_stream;/* Forward declarations.  */struct induction;struct iv_class;static rtx loop_find_reg_equal ();static int reg_in_basic_block_p ();static rtx verify_loop ();static int invariant_p ();static int consec_sets_invariant_p ();static int can_jump_into_range_p ();static int labels_in_range_p ();static void count_loop_regs_set ();static void note_addr_stored ();static int loop_reg_used_before_p ();static void constant_high_bytes ();static void scan_loop ();static rtx replace_regs ();static void replace_call_address ();static rtx skip_consec_insns ();static void ignore_some_movables ();static void force_movables ();static void combine_movables ();static int rtx_equal_for_loop_p ();static void move_movables ();static void strength_reduce ();static void find_mem_givs ();static void record_giv ();static void delete_insn_forces ();static int basic_induction_var ();static int general_induction_var ();static int consec_sets_giv ();static int check_dbra_loop ();static void emit_iv_init_code ();static int product_cheap_p ();static void emit_iv_inc ();static void check_eliminate_biv ();static int can_eliminate_biv_p ();static void eliminate_biv ();static rtx final_biv_value ();static int last_use_this_basic_block ();/* Entry point of this file.  Perform loop optimization   on the current function.  F is the first insn of the function   and DUMPFILE is a stream for output of a trace of actions taken   (or 0 if none should be output).  */voidloop_optimize (f, dumpfile)     /* f is the first instruction of a chain of insns for one function */     rtx f;     FILE *dumpfile;{  register rtx insn;  register int i;  rtx end;  rtx last_insn;  loop_dump_stream = dumpfile;  init_recog ();  old_max_reg = max_reg_num ();  moved_once = (char *) alloca (old_max_reg);  bzero (moved_once, old_max_reg);  /* First find the last real insn, and count the number of insns,     and assign insns their luids.  */  for (insn = f, i = 0; insn; insn = NEXT_INSN (insn))    if (INSN_UID (insn) > i)      i = INSN_UID (insn);  max_uid = i + 1;  uid_luid = (int *) alloca ((i + 1) * sizeof (int));  bzero (uid_luid, (i + 1) * sizeof (int));  /* Compute the mapping from uids to luids.     LUIDs are numbers assigned to insns, like uids,     except that luids increase monotonically through the code.     Don't assign luids to line-number NOTEs, so that the distance in luids     between two insns is not affected by -g.  */  for (insn = f, i = 0; insn; insn = NEXT_INSN (insn))    {      last_insn = insn;      if (GET_CODE (insn) != NOTE	  || NOTE_LINE_NUMBER (insn) < 0)	INSN_LUID (insn) = ++i;      else	/* Give a line number note the same luid as preceding insn.  */	INSN_LUID (insn) = i;    }  max_luid = i;  /* Don't leave gaps in uid_luid for insns that have been     deleted.  It is possible that the first or last insn     using some register has been deleted by cross-jumping.     Make sure that uid_luid for that former insn's uid     points to the general area where that insn used to be.  */  for (i = 0; i < max_uid; i++)    {      uid_luid[0] = uid_luid[i];      if (uid_luid[0] != 0)	break;    }  for (i = 0; i < max_uid; i++)    if (uid_luid[i] == 0)      uid_luid[i] = uid_luid[i - 1];  /* Find and process each loop.     We scan from the end, and process each loop when its start is seen,     so we process innermost loops first.  */  for (insn = last_insn; insn; insn = PREV_INSN (insn))    if (GET_CODE (insn) == NOTE	&& NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)      {	/* Make sure it really is a loop -- no jumps in from outside.  */	end = verify_loop (f, insn);	if (end != 0)	  /* If so, optimize this loop.  */	  scan_loop (insn, end, max_reg_num ());	else if (loop_dump_stream)	  fprintf (loop_dump_stream,		   "\nLoop at %d ignored due to multiple entry points.\n",		   INSN_UID (insn));      }}/* Optimize one loop whose start is LOOP_START and end is END.   LOOP_START is the NOTE_INSN_LOOP_BEG and END is the matching   NOTE_INSN_LOOP_END.  *//* ??? can also move memory writes out of loop if destination   address is invariant? */static voidscan_loop (loop_start, end, nregs)     rtx loop_start, end;     int nregs;{  register int i;  register rtx p = NEXT_INSN (loop_start);  /* 1 if we are scanning insns that could be executed zero times.  */  int maybe_never = 0;  /* 1 if we are scanning insns that might never be executed     due to a subroutine call which might exit before they are reached.  */  int call_passed = 0;  /* For a rotated loop that is entered near the bottom,     this is the label at the top.  Otherwise it is zero.  */  rtx loop_top = 0;  /* Jump insn that enters the loop, or 0 if control drops in.  */  rtx loop_entry_jump = 0;  /* Place in the loop where control enters.  */  rtx scan_start;  /* Number of insns in the loop.  */  int insn_count;  int tem;  rtx temp;  /* Chain describing insns movable in current loop.  */  struct movable *movables = 0;  /* Last element in `movables' -- so we can add elements at the end.  */  struct movable *last_movable = 0;  /* Ratio of extra register life span we can justify     for saving an instruction.  More if loop doesn't call subroutines     since in that case saving an insn makes more difference     and more registers are available.  */  int threshold = loop_has_call ? 15 : 30;  /* Nonzero if the insn that jumps into the real loop     is not the very first thing after the loop-beginning note.  */  int something_before_entry_jump = 0;  n_times_set = (short *) alloca (nregs * sizeof (short));  n_times_used = (short *) alloca (nregs * sizeof (short));  may_not_optimize = (char *) alloca (nregs);  /* Determine whether this loop starts with a jump down     to a test at the end.  */  while (p != end	 && GET_CODE (p) != CODE_LABEL && GET_CODE (p) != JUMP_INSN)    {      if (GET_CODE (p) == CALL_INSN || GET_CODE (p) == INSN)	something_before_entry_jump = 1;      p = NEXT_INSN (p);    }  /* "Loop" contains neither jumps nor labels;     it must have been a dummy.  Think no more about it.  */  if (p == end)    return;  scan_start = p;  /* If loop has a jump before the first label,     the true entry is the target of that jump.     Start scan from there.     But record in LOOP_TOP the place where the end-test jumps     back to so we can scan that after the end of the loop.  */  if (GET_CODE (p) == JUMP_INSN)    {      loop_entry_jump = p;      loop_top = NEXT_INSN (p);      /* Loop entry will never be a conditional jump.	 If we see one, this must not be a real loop.	 Also, a return-insn isn't a jump to enter the loop.  */      if (GET_CODE (loop_top) != BARRIER	  || GET_CODE (PATTERN (p)) != SET)	return;      /* Get the label at which the loop is entered.  */      p = XEXP (SET_SRC (PATTERN (p)), 0);      /* Check to see whether the jump actually	 jumps out of the loop (meaning it's no loop).	 This case can happen for things like	 do {..} while (0).  */      if (p == 0	  || INSN_LUID (p) < INSN_LUID (loop_start)	  || INSN_LUID (p) >= INSN_LUID (end))	{	  if (loop_dump_stream)	    fprintf (loop_dump_stream, "\nLoop from %d to %d is phony.\n\n",		     INSN_UID (loop_start), INSN_UID (end));	  return;	}      /* Find the first label after the entry-jump.  */      while (GET_CODE (loop_top) != CODE_LABEL)	{	  loop_top = NEXT_INSN (loop_top);	  if (loop_top == 0)	    abort ();	}      /* Maybe rearrange the loop to drop straight in	 with a new test to jump around it entirely.	 (The latter is considered outside the loop.)	 If this is done, we no longer enter with a jump.  */      if (! something_before_entry_jump	  && loop_skip_over (loop_start, end, loop_entry_jump))

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人av福利| 欧美一区中文字幕| 欧美日韩国产成人在线91| 日韩欧美第一区| 亚洲综合久久久| 成人黄色网址在线观看| 91精品国产一区二区三区蜜臀 | 91年精品国产| wwwwww.欧美系列| 午夜国产不卡在线观看视频| 不卡在线视频中文字幕| 久久精品一区八戒影视| 蜜臀a∨国产成人精品| 欧洲日韩一区二区三区| 亚洲欧洲日韩女同| 国产精品系列在线播放| 精品福利av导航| 男女性色大片免费观看一区二区 | 一本大道av一区二区在线播放| 日韩三级电影网址| 亚洲mv在线观看| 欧美三级日韩三级国产三级| 日韩伦理免费电影| 成人国产精品免费观看| 国产精品欧美精品| 成人午夜免费视频| 欧美国产一区在线| 成人小视频免费在线观看| 久久精品视频在线看| 国产酒店精品激情| 国产午夜精品美女毛片视频| 国产一区二区毛片| 国产性天天综合网| 国产精品夜夜嗨| 国产欧美日韩久久| 成人av集中营| 亚洲精品视频免费观看| 在线观看不卡视频| 婷婷开心久久网| 91麻豆精品91久久久久久清纯 | 国产91在线观看丝袜| 国产日韩欧美综合在线| 国产成人精品免费| 国产精品乱子久久久久| 色哟哟亚洲精品| 亚洲国产精品精华液网站| 欧美喷潮久久久xxxxx| 天堂影院一区二区| 26uuu精品一区二区在线观看| 精品一区二区三区在线播放 | 日韩一区二区三区免费观看| 麻豆91免费看| 精品久久久久99| av一区二区不卡| 午夜av一区二区| 久久久久久久综合日本| 91免费看片在线观看| 亚洲综合偷拍欧美一区色| 亚洲免费观看高清完整版在线观看熊| 99久久精品国产精品久久| 一级特黄大欧美久久久| 欧美一区二区三区系列电影| 国产精品一级二级三级| 一区二区三区蜜桃| 日韩一卡二卡三卡国产欧美| 成人激情小说网站| 天天综合日日夜夜精品| 国产日产精品一区| 欧美人狂配大交3d怪物一区| 国产精品99久久久久久似苏梦涵| 亚洲欧美日本在线| 精品国产sm最大网站免费看| 9l国产精品久久久久麻豆| 日韩成人一级片| 国产精品人妖ts系列视频| 67194成人在线观看| 成人精品gif动图一区| 五月天丁香久久| 国产精品第五页| 久久精子c满五个校花| 欧美日产在线观看| 色综合一区二区三区| 精久久久久久久久久久| 一区二区三区国产精华| 久久久精品免费免费| 欧美一级日韩不卡播放免费| 波多野结衣中文字幕一区| 蜜臀av性久久久久蜜臀aⅴ四虎| 国产精品久久久久久户外露出| 91精品国产色综合久久不卡电影 | 久久亚洲一级片| 欧美日韩国产综合一区二区 | 久久久国产精华| 欧美一级理论性理论a| 日本高清无吗v一区| 国产精品一区二区久久不卡 | 1区2区3区精品视频| 欧美r级在线观看| 欧美色图片你懂的| 97se亚洲国产综合自在线观| 精品一区二区在线播放| 青青草视频一区| 亚洲国产一区二区三区| 亚洲激情六月丁香| 成人免费在线视频观看| 国产精品你懂的在线| 日本一区二区三区国色天香| 日韩精品影音先锋| 日韩欧美国产高清| 欧美mv日韩mv| 欧美精品一区二区久久久| 日韩精品一区二区三区老鸭窝| 欧美精品三级日韩久久| 欧美在线观看视频一区二区 | 91美女福利视频| 97se亚洲国产综合自在线| 丰满放荡岳乱妇91ww| 懂色av一区二区三区免费看| 国产成人在线视频网站| 国产91综合一区在线观看| 懂色中文一区二区在线播放| 高清成人在线观看| 暴力调教一区二区三区| 91日韩精品一区| 欧美艳星brazzers| 1000精品久久久久久久久| 亚洲欧美在线视频| 一区二区三区不卡视频在线观看| 夜夜操天天操亚洲| 日本不卡高清视频| 国产一区二区三区在线看麻豆| 国产999精品久久久久久绿帽| 91一区二区三区在线观看| 欧美在线看片a免费观看| 欧美在线|欧美| 精品久久一二三区| 国产午夜亚洲精品午夜鲁丝片 | 欧美电影免费观看完整版| 日韩欧美在线网站| 久久久噜噜噜久久中文字幕色伊伊 | 成人精品国产一区二区4080| 色综合久久久久久久久久久| 欧美人伦禁忌dvd放荡欲情| 日韩精品一区二| 亚洲视频1区2区| 丝袜诱惑制服诱惑色一区在线观看| 强制捆绑调教一区二区| 国产suv精品一区二区三区| 色偷偷久久人人79超碰人人澡| 欧美日韩一区二区在线视频| 欧美精品一区男女天堂| 亚洲品质自拍视频网站| 日本伊人精品一区二区三区观看方式| 久久精品国产99久久6| 99麻豆久久久国产精品免费优播| 欧美性大战久久| 国产亚洲一二三区| 亚洲成人综合视频| 成人午夜电影网站| 5858s免费视频成人| 国产精品美日韩| 久久99国产精品久久99| 色狠狠色噜噜噜综合网| 亚洲综合成人在线视频| 国产麻豆视频一区二区| 欧美日韩国产经典色站一区二区三区| 久久久91精品国产一区二区精品 | 日韩精品欧美精品| 不卡一区二区在线| 欧美本精品男人aⅴ天堂| 一区二区理论电影在线观看| 成人美女在线视频| 久久色中文字幕| 天天综合网 天天综合色| www.亚洲国产| 久久精品视频免费| 日韩成人午夜电影| 欧美三级欧美一级| 亚洲乱码日产精品bd| 国产福利精品一区| 欧美大胆人体bbbb| 日韩国产精品91| 欧美日韩一卡二卡三卡 | 欧美精品v日韩精品v韩国精品v| 中日韩av电影| 国产美女视频91| 欧美tickling网站挠脚心| 免费日本视频一区| 在线综合亚洲欧美在线视频| 亚洲国产日韩精品| 欧美性猛交xxxx黑人交| 亚洲国产日韩综合久久精品| 欧洲一区二区av| 亚洲一区二区三区美女| 色综合久久中文综合久久牛| 最新国产の精品合集bt伙计| 成人激情动漫在线观看| 国产精品国产三级国产专播品爱网| 国产福利精品一区二区| 国产精品国产三级国产三级人妇 |