Hello! With recent developments, there is no need for pic_32bit_operand to be defined as special predicate with explicit mode checks anymore. Implicit mode checks (including VIODmode bypass) of normal predicates work OK now.
2011-07-28 Uros Bizjak <ubiz...@gmail.com> * config/i386/predicates.md (pic_32bit_opreand): Do not define as special predicate. Remove explicit mode checks. Tested on x86_64-pc-linux-gnu {,-m32}. There is remote chance this patch breaks x32, so let's alert H.J. Committed to mainline SVN. Uros.
Index: predicates.md =================================================================== --- predicates.md (revision 176870) +++ predicates.md (working copy) @@ -366,15 +366,12 @@ ;; Return true when operand is PIC expression that can be computed by lea ;; operation. -(define_special_predicate "pic_32bit_operand" +(define_predicate "pic_32bit_operand" (match_code "const,symbol_ref,label_ref") { - if (GET_MODE (op) != SImode - && GET_MODE (op) != DImode) - return false; - if (!flag_pic) return false; + /* Rule out relocations that translate into 64bit constants. */ if (TARGET_64BIT && GET_CODE (op) == CONST) { @@ -386,6 +383,7 @@ || XINT (op, 1) == UNSPEC_GOT)) return false; } + return symbolic_operand (op, mode); })