From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2140) id 599383858418; Sat, 20 Nov 2021 09:52:23 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 599383858418 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Alexandre Oliva To: gcc-cvs@gcc.gnu.org Subject: [gcc(refs/users/aoliva/heads/testme)] introduce asmnesia internal function X-Act-Checkin: gcc X-Git-Author: Alexandre Oliva X-Git-Refname: refs/users/aoliva/heads/testme X-Git-Oldrev: 38e4a361e79a459947540920db645f3d7fa7221a X-Git-Newrev: fb9654708bf23afa4300224c6e74bf771e06933d Message-Id: <20211120095223.599383858418@sourceware.org> Date: Sat, 20 Nov 2021 09:52:23 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 20 Nov 2021 09:52:23 -0000 https://gcc.gnu.org/g:fb9654708bf23afa4300224c6e74bf771e06933d commit fb9654708bf23afa4300224c6e74bf771e06933d Author: Alexandre Oliva Date: Sat Nov 20 06:10:25 2021 -0300 introduce asmnesia internal function Diff: --- gcc/gimple-harden-conditionals.cc | 17 ++------------- gcc/internal-fn.c | 44 +++++++++++++++++++++++++++++++++++++++ gcc/internal-fn.def | 4 ++++ 3 files changed, 50 insertions(+), 15 deletions(-) diff --git a/gcc/gimple-harden-conditionals.cc b/gcc/gimple-harden-conditionals.cc index cfa2361d65b..3768b2e23bd 100644 --- a/gcc/gimple-harden-conditionals.cc +++ b/gcc/gimple-harden-conditionals.cc @@ -132,21 +132,8 @@ detach_value (location_t loc, gimple_stmt_iterator *gsip, tree val) tree ret = make_ssa_name (TREE_TYPE (val)); SET_SSA_NAME_VAR_OR_IDENTIFIER (ret, SSA_NAME_IDENTIFIER (val)); - /* Output asm ("" : "=g" (ret) : "0" (val)); */ - vec *inputs = NULL; - vec *outputs = NULL; - vec_safe_push (outputs, - build_tree_list - (build_tree_list - (NULL_TREE, build_string (2, "=g")), - ret)); - vec_safe_push (inputs, - build_tree_list - (build_tree_list - (NULL_TREE, build_string (1, "0")), - val)); - gasm *detach = gimple_build_asm_vec ("", inputs, outputs, - NULL, NULL); + gcall *detach = gimple_build_call_internal (IFN_ASMNESIA, 1, val); + gimple_call_set_lhs (detach, ret); gimple_set_location (detach, loc); gsi_insert_before (gsip, detach, GSI_SAME_STMT); diff --git a/gcc/internal-fn.c b/gcc/internal-fn.c index e5b85f0db0e..ff1e4413369 100644 --- a/gcc/internal-fn.c +++ b/gcc/internal-fn.c @@ -3234,6 +3234,50 @@ expand_LAUNDER (internal_fn, gcall *call) expand_assignment (lhs, gimple_call_arg (call, 0), false); } +/* Expand ASMNESIA to assignment and asm that makes the value unknown. */ + +static void +expand_ASMNESIA (internal_fn, gcall *call) +{ + tree to = gimple_call_lhs (call); + + if (!to) + return; + + location_t locus = gimple_location (call); + + tree from = gimple_call_arg (call, 0); + + rtx to_rtx = expand_expr (to, NULL_RTX, VOIDmode, EXPAND_WRITE); + + rtx from_rtx = expand_expr (from, NULL_RTX, VOIDmode, EXPAND_NORMAL); + + enum machine_mode mode = GET_MODE (to_rtx); + + gcc_checking_assert (mode != BLKmode && mode != VOIDmode + && (GET_MODE (from_rtx) == mode + || GET_MODE (from_rtx) == VOIDmode)); + + rtx temp = copy_to_mode_reg (mode, from_rtx); + + rtvec argvec = rtvec_alloc (1); + rtvec constraintvec = rtvec_alloc (1); + rtvec labelvec = rtvec_alloc (0); + + rtx body = gen_rtx_ASM_OPERANDS (mode, + ggc_strdup (""), + "", 0, + argvec, constraintvec, labelvec, + locus); + ASM_OPERANDS_INPUT (body, 0) = temp; + ASM_OPERANDS_INPUT_CONSTRAINT_EXP (body, 0) + = gen_rtx_ASM_INPUT_loc (mode, "0,0", locus); + ASM_OPERANDS_OUTPUT_CONSTRAINT (body) = "=^X,g"; + emit_insn (gen_rtx_SET (temp, body)); + + emit_move_insn (to_rtx, temp); +} + /* Expand {MASK_,}SCATTER_STORE{S,U} call CALL using optab OPTAB. */ static void diff --git a/gcc/internal-fn.def b/gcc/internal-fn.def index bb4d8ab8096..4fcb84231fd 100644 --- a/gcc/internal-fn.def +++ b/gcc/internal-fn.def @@ -406,6 +406,10 @@ DEF_INTERNAL_FN (FALLTHROUGH, ECF_LEAF | ECF_NOTHROW, NULL) /* To implement __builtin_launder. */ DEF_INTERNAL_FN (LAUNDER, ECF_LEAF | ECF_NOTHROW | ECF_NOVOPS, NULL) +/* Copy a value while preventing optimizations based on knowledge + about the input operand. */ +DEF_INTERNAL_FN (ASMNESIA, ECF_LEAF | ECF_NOTHROW, NULL) + /* Divmod function. */ DEF_INTERNAL_FN (DIVMOD, ECF_CONST | ECF_LEAF, NULL)