[Bug optimization/10982] [arm] poor optimisation of "if (var & const)"

pb at gcc dot gnu dot org gcc-bugzilla@gcc.gnu.org
Sun May 9 17:11:00 GMT 2004


------- Additional Comments From pb at gcc dot gnu dot org  2004-05-09 17:11 -------
For that particular testcase, adding a pattern like the one below seems to allow
combine to do the right thing.  However, changing the "return 1" to "return 2"
prevents this from matching.  Something a bit more sophisticated might be needed.

--

(define_insn_and_split "*zero_extract_compare0_shifted"
  [(set (match_operand:SI 0 "s_register_operand" "=r")
	(ne:SI (zero_extract:SI (match_operand:SI 1 "s_register_operand" "r")
		        	   (match_operand:SI 2 "const_int_operand" "n")
			      	   (const_int 0))
	            	  (const_int 0)))
   (clobber (reg:CC CC_REGNUM))]
  "TARGET_ARM"
  "#"
  ""
  [(parallel [(set (reg:CC_NOOV CC_REGNUM)
		   (compare:CC_NOOV (ashift:SI (match_dup 1)
			                       (match_dup 2))
			            (const_int 0)))
	      (set (match_dup 0)
		   (ashift:SI (match_dup 1) (match_dup 2)))])
   (set (match_dup 0)
        (if_then_else (eq:SI (reg:CC_NOOV CC_REGNUM) (const_int 0))
	              (match_dup 0)
		      (const_int 1)))]
  ""
)

;; Match the second half of *zero_extract_compare0_shifted
(define_insn "*movsi_conditional"
  [(set (match_operand:SI 0 "s_register_operand" "=r")
        (if_then_else (eq:SI (reg:CC_NOOV CC_REGNUM) (const_int 0))
	              (match_dup 0)
		      (match_operand:SI 1 "const_int_operand" "n")))]
  "TARGET_ARM"
  "movne\\t%0, %1"
  [(set_attr "conds" "use")]
)


-- 
           What    |Removed                     |Added
----------------------------------------------------------------------------
            Version|unknown                     |3.4.0


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=10982



More information about the Gcc-bugs mailing list