]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/match.pd
Optimize powerpc*-*-linux* e500 hardfp/soft-fp use.
[thirdparty/gcc.git] / gcc / match.pd
CommitLineData
3d2cf79f
RB
1/* Match-and-simplify patterns for shared GENERIC and GIMPLE folding.
2 This file is consumed by genmatch which produces gimple-match.c
3 and generic-match.c from it.
4
5 Copyright (C) 2014 Free Software Foundation, Inc.
6 Contributed by Richard Biener <rguenther@suse.de>
7 and Prathamesh Kulkarni <bilbotheelffriend@gmail.com>
8
9This file is part of GCC.
10
11GCC is free software; you can redistribute it and/or modify it under
12the terms of the GNU General Public License as published by the Free
13Software Foundation; either version 3, or (at your option) any later
14version.
15
16GCC is distributed in the hope that it will be useful, but WITHOUT ANY
17WARRANTY; without even the implied warranty of MERCHANTABILITY or
18FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19for more details.
20
21You should have received a copy of the GNU General Public License
22along with GCC; see the file COPYING3. If not see
23<http://www.gnu.org/licenses/>. */
24
25
26/* Generic tree predicates we inherit. */
27(define_predicates
28 integer_onep integer_zerop integer_all_onesp
29 real_zerop real_onep
30 CONSTANT_CLASS_P)
e0ee10ed
RB
31
32
33/* Simplifications of operations with one constant operand and
34 simplifications to constants. */
35
36(for op (plus pointer_plus minus bit_ior bit_xor)
37 (simplify
38 (op @0 integer_zerop)
39 (non_lvalue @0)))
40
41/* Simplify x - x.
42 This is unsafe for certain floats even in non-IEEE formats.
43 In IEEE, it is unsafe because it does wrong for NaNs.
44 Also note that operand_equal_p is always false if an operand
45 is volatile. */
46(simplify
47 (minus @0 @0)
48 (if (!FLOAT_TYPE_P (type) || !HONOR_NANS (TYPE_MODE (type)))
49 { build_zero_cst (type); }))
50
51(simplify
52 (mult @0 integer_zerop@1)
53 @1)
54
55/* Make sure to preserve divisions by zero. This is the reason why
56 we don't simplify x / x to 1 or 0 / x to 0. */
57(for op (mult trunc_div ceil_div floor_div round_div exact_div)
58 (simplify
59 (op @0 integer_onep)
60 (non_lvalue @0)))
61
62/* Same applies to modulo operations, but fold is inconsistent here
63 and simplifies 0 % x to 0, only preserving literal 0 % 0. */
64(for op (ceil_mod floor_mod round_mod trunc_mod)
65 /* 0 % X is always zero. */
66 (simplify
60e09045 67 (op integer_zerop@0 @1)
e0ee10ed
RB
68 /* But not for 0 % 0 so that we can get the proper warnings and errors. */
69 (if (!integer_zerop (@1))
70 @0))
71 /* X % 1 is always zero. */
72 (simplify
60e09045 73 (op @0 integer_onep)
e0ee10ed
RB
74 { build_zero_cst (type); }))
75
76/* x | ~0 -> ~0 */
77(simplify
78 (bit_ior @0 integer_all_onesp@1)
79 @1)
80
81/* x & 0 -> 0 */
82(simplify
83 (bit_and @0 integer_zerop@1)
84 @1)
85
86/* x ^ x -> 0 */
87(simplify
88 (bit_xor @0 @0)
89 { build_zero_cst (type); })
90