diff options
author | hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-07-23 19:37:40 +0000 |
---|---|---|
committer | hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-07-23 19:37:40 +0000 |
commit | 10ada81fea4490f94ba2eb5923bf5baa367a38bd (patch) | |
tree | 437dca120093cc7b1f6debf6f6b31779526c7192 /gcc/tree-affine.c | |
parent | 95a236de8aa10bf009e9368dfd28f95a980e5570 (diff) | |
parent | 3bd7a983695352a99f7dd597725eb5b839d4b4cf (diff) | |
download | gcc-ifunc.tar.gz |
Merged with trunk at revision 162480.ifunc
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/ifunc@162483 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-affine.c')
-rw-r--r-- | gcc/tree-affine.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/gcc/tree-affine.c b/gcc/tree-affine.c index 4d63de381c4..a02d56cdc8d 100644 --- a/gcc/tree-affine.c +++ b/gcc/tree-affine.c @@ -309,6 +309,15 @@ tree_to_aff_combination (tree expr, tree type, aff_tree *comb) return; case ADDR_EXPR: + /* Handle &MEM[ptr + CST] which is equivalent to POINTER_PLUS_EXPR. */ + if (TREE_CODE (TREE_OPERAND (expr, 0)) == MEM_REF) + { + expr = TREE_OPERAND (expr, 0); + tree_to_aff_combination (TREE_OPERAND (expr, 0), type, comb); + tree_to_aff_combination (TREE_OPERAND (expr, 1), sizetype, &tmp); + aff_combination_add (comb, &tmp); + return; + } core = get_inner_reference (TREE_OPERAND (expr, 0), &bitsize, &bitpos, &toffset, &mode, &unsignedp, &volatilep, false); @@ -331,6 +340,25 @@ tree_to_aff_combination (tree expr, tree type, aff_tree *comb) } return; + case MEM_REF: + if (TREE_CODE (TREE_OPERAND (expr, 0)) == ADDR_EXPR) + tree_to_aff_combination (TREE_OPERAND (TREE_OPERAND (expr, 0), 0), + type, comb); + else if (integer_zerop (TREE_OPERAND (expr, 1))) + { + aff_combination_elt (comb, type, expr); + return; + } + else + aff_combination_elt (comb, type, + build2 (MEM_REF, TREE_TYPE (expr), + TREE_OPERAND (expr, 0), + build_int_cst + (TREE_TYPE (TREE_OPERAND (expr, 1)), 0))); + tree_to_aff_combination (TREE_OPERAND (expr, 1), sizetype, &tmp); + aff_combination_add (comb, &tmp); + return; + default: break; } |