[Bug middle-end/86511] [9 Regression] Unordered comparisons are expanded with branchless code
ubizjak at gmail dot com
gcc-bugzilla@gcc.gnu.org
Fri Jul 13 10:11:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86511
--- Comment #3 from Uroš Bizjak <ubizjak at gmail dot com> ---
(In reply to Richard Biener from comment #2)
> It looks like this goes wrong somewhere in expansion which seems to expand
> this as UNORDERED || GE w/o protecting the GE properly. It looks like we
> do not have optabs for UNGE, but only unord_optab.
>
> I guess you need to trace expansion to see where it goes wrong (maybe
> it's just a bug in if-conversion...)
This happens in expmed.c, emit_store flag, where the comparison is split using
split_comparison (from dojump.c) to first_code and code.
Following the split, we get to:
/* Try using a setcc instruction for ORDERED/UNORDERED, followed by a
conditional move. */
tem = emit_store_flag_1 (subtarget, first_code, op0, op1, mode, 0,
normalizep, target_mode);
if (tem == 0)
return 0;
if (and_them)
tem = emit_conditional_move (target, code, op0, op1, mode,
tem, const0_rtx, GET_MODE (tem), 0);
else
tem = emit_conditional_move (target, code, op0, op1, mode,
trueval, tem, GET_MODE (tem), 0);
which emits both comparisons via setcc and cmove. For example, UNGE gets split
to UNORDERED and GE, the second one traps.
I don't think the above is correct for trapping math.
More information about the Gcc-bugs
mailing list