On Mon, May 26, 2014 at 7:48 PM, Uros Bizjak <ubiz...@gmail.com> wrote: > Hello! > > There is a stray ! in ix86_rtx_costs which results in an invalid > bypass for LABEL_REFs. After some simplifications, the fixed condition > should read: > > else if (flag_pic && SYMBOLIC_CONST (x) > && !(TARGET_64BIT > && (GET_CODE (x) == LABEL_REF > || (GET_CODE (x) == SYMBOL_REF > && SYMBOL_REF_LOCAL_P (x))))) > *total = 1; > > The patch fixes the condition, but I don't think that handling of > LABEL_REFs and SYMBOL_REFs is correct in the cost function at all. > E.g. in x86_64_immediate_operand predicate, LABEL_REFs (and non-TLS > SYMBOL_REFs) are rejected for all PIC code models, so they get cost of > 3 and don't even reach this part of the function. > > Honza, can you perhaps check if x86_64{,_zext}_immediate operand > handles PIC code models in a correct way? > > The trivial patch is bootstrapped and regression tested on > x86_64-pc-linux-gnu {,-m32} and committed to mainline SVN.
Eh, wrong patch was attached. And ChangeLog was missing, too. 2014-05-26 Uros Bizjak <ubiz...@gmail.com> PR target/61271 * config/i386/i386.c (ix86_rtx_costs) <case CONST_INT, case CONST, case LABEL_REF, case SYMBOL_REF>: Fix condition. Uros.
Index: i386.c =================================================================== --- i386.c (revision 210889) +++ i386.c (working copy) @@ -37903,10 +37903,10 @@ else if (TARGET_64BIT && !x86_64_zext_immediate_operand (x, VOIDmode)) *total = 2; else if (flag_pic && SYMBOLIC_CONST (x) - && (!TARGET_64BIT - || (!GET_CODE (x) != LABEL_REF - && (GET_CODE (x) != SYMBOL_REF - || !SYMBOL_REF_LOCAL_P (x))))) + && !(TARGET_64BIT + && (GET_CODE (x) == LABEL_REF + || (GET_CODE (x) == SYMBOL_REF + && SYMBOL_REF_LOCAL_P (x))))) *total = 1; else *total = 0;