* [RFC][IPA-VRP] IPA VRP Implementation @ 2016-07-15 4:41 kugan 2016-07-15 4:42 ` [RFC][IPA-VRP] Disable setting param of __builtin_constant_p to null kugan ` (4 more replies) 0 siblings, 5 replies; 67+ messages in thread From: kugan @ 2016-07-15 4:41 UTC (permalink / raw) To: gcc-patches; +Cc: Richard Biener, Jan Hubicka, Martin Jambor Hi, This patch series implements IPA-VRP based on the previous discussions in https://gcc.gnu.org/ml/gcc/2016-01/msg00063.html. 0001-Hack-Prevent-setting-__builtin_constant_p-of-param-t.patch -This is to prevent EVRP setting result of __builtin_constant_p to null that will inlined later. 0002-Inliner-Check-for-POINTER_TYPE.patch - This is to make sure that we call SSA_NAME_PTR_INFO only for POINTER_TYPE_P. This is exposed with IPA-VRP but not related to rest of the patch. 0003-Refactor-vrp.patch - Re-factors tree-vrp to expose some of the common functionalities. 0004-Add-early-vrp.patch - Adds a simple Early VRP pass. 0005-Add-ipa-vrp.patch - Implements IPA VRP 0006-Teach-tree-vrp-to-use-ipa-vrp-results.patch - Teaches tree-vrp to use the value ranges set for the PARMs. More details about the patches are later with each patch. Before I go into the details, here is a simple example and the relevant dumps as of now: static __attribute__((noinline, noclone)) int foo (int i) { if (i > 5) printf ("OK\n"); else printf ("NOK\n"); } int bar (int j) { if (j > 8) return foo (j + 2); else if (j > 2) return foo (j + 3); return 0; } The Early VRP dump shows: _1: [11, +INF(OVF)] _2: [6, 11] .... bar (int j) { .... _8 = foo (_1); goto <bb 6>; <bb 4>: if (j_5(D) > 2) goto <bb 5>; else goto <bb 6>; <bb 5>: _2 = j_5(D) + 3; _10 = foo (_2); .... The IPA-CP dump shows: .... Modification phase of node foo/0 Setting value range of param 0 [6, 2147483647] __attribute__((noclone, noinline)) foo (int i) .... The VRP1 dump shows: Value ranges after VRP: .MEM_1: VARYING i_2(D): [6, +INF] Folding predicate i_2(D) > 5 to 1 Removing basic block 4 Merging blocks 2 and 3 Merging blocks 2 and 5 __attribute__((noclone, noinline)) foo (int i) { <bb 2>: __builtin_puts (&"OK"[0]); return; } I have bootstrapped and regression tested the patches in this series on x86-64 and aarch64 (both normal bootstrap and LTO bootstrap). There are couple of testcase failures which I am looking into. Any thoughts? Thanks, Kugan ^ permalink raw reply [flat|nested] 67+ messages in thread