From patchwork Wed Sep 21 16:44:26 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Prathamesh Kulkarni X-Patchwork-Id: 76706 Delivered-To: patch@linaro.org Received: by 10.140.106.72 with SMTP id d66csp2147118qgf; Wed, 21 Sep 2016 09:44:57 -0700 (PDT) X-Received: by 10.66.235.100 with SMTP id ul4mr66659407pac.50.1474476297635; Wed, 21 Sep 2016 09:44:57 -0700 (PDT) Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id f8si41474522pfd.211.2016.09.21.09.44.57 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 21 Sep 2016 09:44:57 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-return-436487-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org; spf=pass (google.com: domain of gcc-patches-return-436487-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=gcc-patches-return-436487-patch=linaro.org@gcc.gnu.org; dmarc=fail (p=NONE dis=NONE) header.from=linaro.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :mime-version:from:date:message-id:subject:to:content-type; q= dns; s=default; b=plSrQIqODltS6qYcJ2Ek3inO3G5oyhy87rriA0NTFLGifW HyG7gKUGBfk+XWMF3IiF2FfGYJpvM2Q2DyASjstLswMOBFXjuwTkBxUh0pmcxUza MOrFK7HNhr6kASRy2s7wIcflZC67UtSkpIHi6MoPGdXPmsQ/c53/4/VlLcX8g= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :mime-version:from:date:message-id:subject:to:content-type; s= default; bh=YTpIk7u6ohAOPVRfrk8NtnzSHUE=; b=PdPnGmarPKmkkqjgK/UW b9be4UEBEd0EdUyKbSCfK9oVf1tYDmPA8OgrpszOfWHYNzzV6/TTPfDUhju0wyS1 hGZ/7S8WxcqYal2ZMUO1czxBw6nySvfrIyYcSGWfi4BSaUpJA+cihsVIMUO+L3OT mpFuM3ILBXNVnZLzQ/STX8Q= Received: (qmail 69842 invoked by alias); 21 Sep 2016 16:44:43 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 69791 invoked by uid 89); 21 Sep 2016 16:44:39 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.5 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM, SPF_PASS autolearn=no version=3.3.2 spammy=Extend X-HELO: mail-io0-f171.google.com Received: from mail-io0-f171.google.com (HELO mail-io0-f171.google.com) (209.85.223.171) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 21 Sep 2016 16:44:29 +0000 Received: by mail-io0-f171.google.com with SMTP id r145so58819973ior.0 for ; Wed, 21 Sep 2016 09:44:28 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=9a5zVwjjcPv84KwS8qEvNpSvB1YDJjoG7fj8xSk259g=; b=BR9yc3V/kqvwERMzkpkSv/TtlZh3VJ7CenXd3hUvh4mfX09vlgd/2ZhAT5ZQMy3oc6 XQlklYmVM5bZo5AeigIDyyuxd94MPs/6N7RQTVX9j2p8Xoa5wY56O2acaNiZjYyio7d4 TpXEBY5GGeIGV+EizrHDjlppc0PqumU/9ewJ9Ja7zoShQS2IQjzVslhtZO6Xy/I/poI5 /coZOL5DIRexN0hOMy506BZ5Ero7csNdgvN6sXjS9jvZcnPRLIdwoacgAtQDH+nZBico xqR/rnYvkZfiX6gJaDQz6edWBTyD6e8QzJl3rPZ/+dA1dog3L5YiJJ4p1HXrEY+XUith uVrA== X-Gm-Message-State: AE9vXwPg/E/Z7gox7SmScAQ9vYPvrS0zpALfnhnFMXZCOhkZWpBNT5m/SqfIwRo41h/wm5QLZloBSbH5k3HvnYhp X-Received: by 10.107.47.85 with SMTP id j82mr47963121ioo.191.1474476267384; Wed, 21 Sep 2016 09:44:27 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.81.85 with HTTP; Wed, 21 Sep 2016 09:44:26 -0700 (PDT) From: Prathamesh Kulkarni Date: Wed, 21 Sep 2016 22:14:26 +0530 Message-ID: Subject: [RFC] Extend ipa-bitwise-cp with pointer alignment propagation To: gcc Patches , Jan Hubicka , Martin Jambor , Richard Biener X-IsSubscribed: yes Hi, The attached patch tries to extend ipa bits propagation to handle pointer alignment propagation. The patch just disables ipa-cp-alignment pass, I suppose we want to eventually remove it ? Bootstrap+tested on x86_64-unknown-linux-gnu. Cross-tested on arm*-*-*, aarch64*-*-*. Does the patch look OK ? Thanks, Prathamesh diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c index 5ff7bed..d251223 100644 --- a/gcc/ipa-cp.c +++ b/gcc/ipa-cp.c @@ -1871,16 +1871,29 @@ propagate_bits_accross_jump_function (cgraph_edge *cs, int idx, ipa_jump_func *j unsigned precision = TYPE_PRECISION (parm_type); signop sgn = TYPE_SIGN (parm_type); - if (jfunc->type == IPA_JF_PASS_THROUGH) + if (jfunc->type == IPA_JF_PASS_THROUGH + || jfunc->type == IPA_JF_ANCESTOR) { struct ipa_node_params *caller_info = IPA_NODE_REF (cs->caller); - enum tree_code code = ipa_get_jf_pass_through_operation (jfunc); tree operand = NULL_TREE; + enum tree_code code; + unsigned src_idx; - if (code != NOP_EXPR) - operand = ipa_get_jf_pass_through_operand (jfunc); + if (jfunc->type == IPA_JF_PASS_THROUGH) + { + code = ipa_get_jf_pass_through_operation (jfunc); + src_idx = ipa_get_jf_pass_through_formal_id (jfunc); + if (code != NOP_EXPR) + operand = ipa_get_jf_pass_through_operand (jfunc); + } + else + { + code = POINTER_PLUS_EXPR; + src_idx = ipa_get_jf_ancestor_formal_id (jfunc); + unsigned HOST_WIDE_INT offset = ipa_get_jf_ancestor_offset (jfunc) / BITS_PER_UNIT; + operand = build_int_cstu (size_type_node, offset); + } - int src_idx = ipa_get_jf_pass_through_formal_id (jfunc); struct ipcp_param_lattices *src_lats = ipa_get_parm_lattices (caller_info, src_idx); @@ -2258,8 +2271,8 @@ propagate_constants_accross_call (struct cgraph_edge *cs) &dest_plats->itself); ret |= propagate_context_accross_jump_function (cs, jump_func, i, &dest_plats->ctxlat); - ret |= propagate_alignment_accross_jump_function (cs, jump_func, - &dest_plats->alignment); +// ret |= propagate_alignment_accross_jump_function (cs, jump_func, +// &dest_plats->alignment); ret |= propagate_bits_accross_jump_function (cs, i, jump_func, &dest_plats->bits_lattice); ret |= propagate_aggs_accross_jump_function (cs, jump_func, diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c index 1629781..5cee27b 100644 --- a/gcc/ipa-prop.c +++ b/gcc/ipa-prop.c @@ -1701,6 +1701,16 @@ ipa_compute_jump_functions_for_edge (struct ipa_func_body_info *fbi, jfunc->bits.mask = 0; } } + else if (POINTER_TYPE_P (TREE_TYPE (arg))) + { + unsigned HOST_WIDE_INT bitpos; + unsigned align; + + jfunc->bits.known = true; + get_pointer_alignment_1 (arg, &align, &bitpos); + jfunc->bits.mask = wi::mask(TYPE_PRECISION (TREE_TYPE (arg)), false).and_not (align / BITS_PER_UNIT - 1); + jfunc->bits.value = bitpos / BITS_PER_UNIT; + } else gcc_assert (!jfunc->bits.known); @@ -5534,7 +5544,7 @@ ipcp_update_bits (struct cgraph_node *node) next_parm = DECL_CHAIN (parm); if (!bits[i].known - || !INTEGRAL_TYPE_P (TREE_TYPE (parm)) + || !(INTEGRAL_TYPE_P (TREE_TYPE (parm)) || POINTER_TYPE_P (TREE_TYPE (parm))) || !is_gimple_reg (parm)) continue; @@ -5549,12 +5559,41 @@ ipcp_update_bits (struct cgraph_node *node) fprintf (dump_file, "\n"); } - unsigned prec = TYPE_PRECISION (TREE_TYPE (ddef)); - signop sgn = TYPE_SIGN (TREE_TYPE (ddef)); + if (INTEGRAL_TYPE_P (TREE_TYPE (ddef))) + { + unsigned prec = TYPE_PRECISION (TREE_TYPE (ddef)); + signop sgn = TYPE_SIGN (TREE_TYPE (ddef)); + + wide_int nonzero_bits = wide_int::from (bits[i].mask, prec, UNSIGNED) + | wide_int::from (bits[i].value, prec, sgn); + set_nonzero_bits (ddef, nonzero_bits); + } + else + { + unsigned tem = bits[i].mask.to_uhwi (); + unsigned HOST_WIDE_INT bitpos = bits[i].value.to_uhwi (); + unsigned align = tem & -tem; + unsigned misalign = bitpos & (align - 1); - wide_int nonzero_bits = wide_int::from (bits[i].mask, prec, UNSIGNED) - | wide_int::from (bits[i].value, prec, sgn); - set_nonzero_bits (ddef, nonzero_bits); + if (align > 1) + { + if (dump_file) + fprintf (dump_file, "Adjusting align: %u, misalign: %u\n", align, misalign); + + unsigned old_align, old_misalign; + struct ptr_info_def *pi = get_ptr_info (ddef); + bool old_known = get_ptr_info_alignment (pi, &old_align, &old_misalign); + + if (old_known + && old_align > align) + { + if (dump_file) + fprintf (dump_file, "But alignment was already %u.\n", old_align); + continue; + } + set_ptr_info_alignment (pi, align, misalign); + } + } } } diff --git a/gcc/testsuite/gcc.dg/ipa/propalign-1.c b/gcc/testsuite/gcc.dg/ipa/propalign-1.c index f34552c..1491de8 100644 --- a/gcc/testsuite/gcc.dg/ipa/propalign-1.c +++ b/gcc/testsuite/gcc.dg/ipa/propalign-1.c @@ -27,5 +27,5 @@ bar (void) } -/* { dg-final { scan-ipa-dump "Adjusting alignment of param" "cp" } } */ +/* { dg-final { scan-ipa-dump "Adjusting align" "cp" } } */ /* { dg-final { scan-tree-dump-not "fail_the_test" "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/ipa/propalign-2.c b/gcc/testsuite/gcc.dg/ipa/propalign-2.c index 67b149a..51799c7 100644 --- a/gcc/testsuite/gcc.dg/ipa/propalign-2.c +++ b/gcc/testsuite/gcc.dg/ipa/propalign-2.c @@ -53,5 +53,5 @@ bar2 (void) through (c.buf); } -/* { dg-final { scan-ipa-dump "Adjusting alignment of param" "cp" } } */ +/* { dg-final { scan-ipa-dump "Adjusting align" "cp" } } */ /* { dg-final { scan-tree-dump-not "fail_the_test" "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/ipa/propalign-3.c b/gcc/testsuite/gcc.dg/ipa/propalign-3.c index d3bc2c4..4f5df4a 100644 --- a/gcc/testsuite/gcc.dg/ipa/propalign-3.c +++ b/gcc/testsuite/gcc.dg/ipa/propalign-3.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fno-ipa-cp-alignment -fno-early-inlining -fdump-ipa-cp -fdump-tree-optimized" } */ +/* { dg-options "-O2 -fno-ipa-bit-cp -fno-early-inlining -fdump-ipa-cp -fdump-tree-optimized" } */ /* { dg-skip-if "No alignment restrictions" { { ! natural_alignment_32 } && { ! natural_alignment_64 } } } */ #include @@ -53,5 +53,5 @@ bar2 (void) through (c.buf); } -/* { dg-final { scan-ipa-dump-not "Adjusting alignment of param" "cp" } } */ +/* { dg-final { scan-ipa-dump-not "align:" "cp" } } */ /* { dg-final { scan-tree-dump "fail_the_test" "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/ipa/propalign-4.c b/gcc/testsuite/gcc.dg/ipa/propalign-4.c index b680813..bd32bf0 100644 --- a/gcc/testsuite/gcc.dg/ipa/propalign-4.c +++ b/gcc/testsuite/gcc.dg/ipa/propalign-4.c @@ -20,4 +20,4 @@ main() test (&aa[3]); return 0; } -/* { dg-final { scan-ipa-dump "Alignment 8, misalignment 4" "cp" } } */ +/* { dg-final { scan-ipa-dump "align: 8, misalign: 4" "cp" } } */ diff --git a/gcc/testsuite/gcc.dg/ipa/propalign-5.c b/gcc/testsuite/gcc.dg/ipa/propalign-5.c index f2cf600..68e57da 100644 --- a/gcc/testsuite/gcc.dg/ipa/propalign-5.c +++ b/gcc/testsuite/gcc.dg/ipa/propalign-5.c @@ -20,4 +20,4 @@ main() test (&bb); return 0; } -/* { dg-final { scan-ipa-dump "Alignment 2" "cp" } } */ +/* { dg-final { scan-ipa-dump "align: 2" "cp" } } */