diff options
author | Tom de Vries <tom@codesourcery.com> | 2015-04-17 09:26:50 +0000 |
---|---|---|
committer | Tom de Vries <vries@gcc.gnu.org> | 2015-04-17 09:26:50 +0000 |
commit | 1691b2e1ca494eee178a70c73c0f941ff27118f6 (patch) | |
tree | 37cc3da3b1e49c1cbab2ac01cbed05e03eea3bc1 /gcc/fold-const.c | |
parent | 302f08072ff5559a762baed4bde399852c0960be (diff) | |
download | gcc-1691b2e1ca494eee178a70c73c0f941ff27118f6.zip gcc-1691b2e1ca494eee178a70c73c0f941ff27118f6.tar.gz gcc-1691b2e1ca494eee178a70c73c0f941ff27118f6.tar.bz2 |
Handle internal_fn in operand_equal_p
2015-04-17 Tom de Vries <tom@codesourcery.com>
* fold-const.c (operand_equal_p): Handle INTERNAL_FNs.
* calls.c (call_expr_flags): Same.
From-SVN: r222172
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r-- | gcc/fold-const.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 6d085b1..3654fd6 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -3045,11 +3045,26 @@ operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags) switch (TREE_CODE (arg0)) { case CALL_EXPR: - /* If the CALL_EXPRs call different functions, then they - clearly can not be equal. */ - if (! operand_equal_p (CALL_EXPR_FN (arg0), CALL_EXPR_FN (arg1), - flags)) + if ((CALL_EXPR_FN (arg0) == NULL_TREE) + != (CALL_EXPR_FN (arg1) == NULL_TREE)) + /* If not both CALL_EXPRs are either internal or normal function + functions, then they are not equal. */ return 0; + else if (CALL_EXPR_FN (arg0) == NULL_TREE) + { + /* If the CALL_EXPRs call different internal functions, then they + are not equal. */ + if (CALL_EXPR_IFN (arg0) != CALL_EXPR_IFN (arg1)) + return 0; + } + else + { + /* If the CALL_EXPRs call different functions, then they are not + equal. */ + if (! operand_equal_p (CALL_EXPR_FN (arg0), CALL_EXPR_FN (arg1), + flags)) + return 0; + } { unsigned int cef = call_expr_flags (arg0); |