This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
Hi, all This patch will fix doloop_register_get defined in modulo-sched.c, and let the program of PI caculation on IA-64 be successfully modulo scheduled. On 1GHz Itanium-2, it costs just 3.128 seconds to execute when compiled with "-fmodulo-shced -O3" turned on, while 5.454 seconds whithout "-fmodulo-sched". 2005-03-31 Canqun Yang <canqun@nudt.edu.cn> * modulo-sched.c (doloop_register_get): Deal with if_then_else pattern. Canqun Yang Creative Compiler Research Group. National University of Defense Technology, China.
Attachment:
pi.f90
Description: Binary data
*** /home/ycq/mainline/gcc/gcc/modulo-sched.c Mon Mar 21 10:49:23 2005 --- modulo-sched.c Thu Mar 31 21:11:08 2005 *************** static rtx *** 263,269 **** doloop_register_get (rtx insn, rtx *comp) { rtx pattern, cmp, inc, reg, condition; ! if (!JUMP_P (insn)) return NULL_RTX; pattern = PATTERN (insn); --- 263,270 ---- doloop_register_get (rtx insn, rtx *comp) { rtx pattern, cmp, inc, reg, condition; ! rtx src; ! if (!JUMP_P (insn)) return NULL_RTX; pattern = PATTERN (insn); *************** doloop_register_get (rtx insn, rtx *comp *** 293,303 **** /* Extract loop counter register. */ reg = SET_DEST (inc); /* Check if something = (plus (reg) (const_int -1)). */ ! if (GET_CODE (SET_SRC (inc)) != PLUS ! || XEXP (SET_SRC (inc), 0) != reg ! || XEXP (SET_SRC (inc), 1) != constm1_rtx) return NULL_RTX; /* Check for (set (pc) (if_then_else (condition) --- 294,315 ---- /* Extract loop counter register. */ reg = SET_DEST (inc); + src = SET_SRC (inc); + /* On IA-64, the RTL pattern of SRC is just like this + (if_then_else:DI (ne (reg:DI 332 ar.lc) + (const_int 0 [0x0])) + (plus:DI (reg:DI 332 ar.lc) + (const_int -1 [0xffffffffffffffff])) + (reg:DI 332 ar.lc)) */ + + if (GET_CODE (src) == IF_THEN_ELSE) + src = XEXP (src, 1); + /* Check if something = (plus (reg) (const_int -1)). */ ! if (GET_CODE (src) != PLUS ! || XEXP (src, 0) != reg ! || XEXP (src, 1) != constm1_rtx) return NULL_RTX; /* Check for (set (pc) (if_then_else (condition) *************** doloop_register_get (rtx insn, rtx *comp *** 318,324 **** if ((GET_CODE (condition) != GE && GET_CODE (condition) != NE) || GET_CODE (XEXP (condition, 1)) != CONST_INT). */ if (GET_CODE (condition) != NE ! || XEXP (condition, 1) != const1_rtx) return NULL_RTX; if (XEXP (condition, 0) == reg) --- 330,337 ---- if ((GET_CODE (condition) != GE && GET_CODE (condition) != NE) || GET_CODE (XEXP (condition, 1)) != CONST_INT). */ if (GET_CODE (condition) != NE ! || (XEXP (condition, 1) != const1_rtx ! && XEXP (condition, 1) != const0_rtx)) return NULL_RTX; if (XEXP (condition, 0) == reg)
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |