From patchwork Thu Aug 17 04:05:21 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luc Van Oostenryck X-Patchwork-Id: 9904919 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 50ECB60244 for ; Thu, 17 Aug 2017 04:05:54 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4264428414 for ; Thu, 17 Aug 2017 04:05:54 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 36D8728946; Thu, 17 Aug 2017 04:05:54 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.3 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6CAE428414 for ; Thu, 17 Aug 2017 04:05:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1750766AbdHQEFx (ORCPT ); Thu, 17 Aug 2017 00:05:53 -0400 Received: from mail-wr0-f193.google.com ([209.85.128.193]:34606 "EHLO mail-wr0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750755AbdHQEFw (ORCPT ); Thu, 17 Aug 2017 00:05:52 -0400 Received: by mail-wr0-f193.google.com with SMTP id x43so6181447wrb.1 for ; Wed, 16 Aug 2017 21:05:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=lq+Ad9PEKquloiEvakKy8wEIBNpwEEU+WRdqFqOq1lU=; b=QHxQTqLFbgOijVhHPddh/RObixIuStr2EVmOR9bEfwTa0BmVnQ0/f47k3skm1c+Xq1 9ofHPeRTMBpeRWJiZMdWQw2RUj8tmhshXHwhSEYtW3Im8yNTsAlLjYMd/gOyRSkEbB4I VPcmmfnPywmm5xK7E8+Dm7j3oY68/+XIQbV3EQ7Ba3w7iy3RQYlPmkDk+vVBO3E8VrPw MVsnWvAfuKXIEoNJziKqZlhdUHpj649WZHWlX0xpyk5DCh6g7syjAU2s1l4J12ay7qHx C3TQhTl6udwKdJjJ/+I+zwcW2JWbPI9+s7fl7QmbP4rKtD8DrBMvTPmOcE+yIkluc68L 0TqQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=lq+Ad9PEKquloiEvakKy8wEIBNpwEEU+WRdqFqOq1lU=; b=Z/rk5+fAKgw5809rm2yPwHTVLSWCWHHqoBG9kHw+N5nqtPlOTsuWAUz3AZjdcQEdIV L/b6Cp+9bkBQzEhGAc0kFTPLUdtm3PJjlkkKT/8UzgFFR+NuCe/IoH3DLunLvRQURIqs 5CnjfVfeNw3+11dLyNgT7gnCI5SGg6xTX3loWVKn2lA4fYIzuoCdf3FMrC7JfJ5lRrnp 7aI4z1WaARlQ+6/q7vZnlg65J9fat7boMVZnmQDKFxWBek+eiSaCwAL9v1+IYRdk/gm9 +jAt2MfYe8xFGTaOHQ1I4oCQS53NA/KkOMpu0odfirqAdExIAe9I9nReETRJHZZ6zB6B VvQg== X-Gm-Message-State: AHYfb5gJercIbH/lI4FbCbnRE3WSupyVAbc3yoP0jfqUpbEf3TiSseBU R93A4E5r5WDWeo7X3Og= X-Received: by 10.80.175.166 with SMTP id h35mr535481edd.193.1502942750956; Wed, 16 Aug 2017 21:05:50 -0700 (PDT) Received: from localhost.localdomain (1.84-65-87.adsl-dyn.isp.belgacom.be. [87.65.84.1]) by smtp.gmail.com with ESMTPSA id e12sm1378134edj.72.2017.08.16.21.05.49 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 16 Aug 2017 21:05:50 -0700 (PDT) From: Luc Van Oostenryck To: linux-sparse@vger.kernel.org Cc: Linus Torvalds , Christopher Li , Dibyendu Majumdar , Luc Van Oostenryck Subject: [RFC PATCH 06/14] cast: specialize floats to integer conversion Date: Thu, 17 Aug 2017 06:05:21 +0200 Message-Id: <20170817040529.7289-7-luc.vanoostenryck@gmail.com> X-Mailer: git-send-email 2.14.0 In-Reply-To: <20170817040529.7289-1-luc.vanoostenryck@gmail.com> References: <20170817040529.7289-1-luc.vanoostenryck@gmail.com> Sender: linux-sparse-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-sparse@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Currently, casts from floats to integers are processed like integers (or any other type) to integers. This is simple but rather uncovenient as it correspond to different operations tat may obey to different rules and which later need extra checks. Change this by directly using specific instructions: - FCVTU for floats to unsigned integer - FCVTS for floats to signed integer Signed-off-by: Luc Van Oostenryck --- Documentation/IR.md | 6 ++++++ example.c | 3 +++ linearize.c | 5 +++++ linearize.h | 1 + liveness.c | 1 + simplify.c | 3 +++ sparse-llvm.c | 1 + validation/cast-kinds-check.c | 2 -- validation/cast-kinds.c | 20 ++++++++++++-------- 9 files changed, 32 insertions(+), 10 deletions(-) diff --git a/Documentation/IR.md b/Documentation/IR.md index 2d23e65d3..0bfd9765c 100644 --- a/Documentation/IR.md +++ b/Documentation/IR.md @@ -166,6 +166,12 @@ Cast to signed integer. ### OP_PTRCAST Cast to pointer. +### OP_FCVTU +Conversion from float type to unsigned integer. + +### OP_FCVTS +Conversion from float type to signed integer. + ### OP_UCVTF Conversion from unsigned integer to a float type. diff --git a/example.c b/example.c index 30e91bbf6..0349a7e20 100644 --- a/example.c +++ b/example.c @@ -83,6 +83,8 @@ static const char *opcodes[] = { [OP_COPY] = "copy", [OP_CAST] = "cast", [OP_SCAST] = "scast", + [OP_FCVTU] = "fcvtu", + [OP_FCVTS] = "fcvts", [OP_UCVTF] = "ucvtf", [OP_SCVTF] = "scvtf", [OP_FCVTF] = "fcvtf", @@ -1423,6 +1425,7 @@ static void generate_one_insn(struct instruction *insn, struct bb_state *state) break; case OP_CAST: case OP_SCAST: case OP_PTRCAST: + case OP_FCVTU: case OP_FCVTS: case OP_UCVTF: case OP_SCVTF: case OP_FCVTF: generate_cast(state, insn); diff --git a/linearize.c b/linearize.c index 3f8d955c5..75b200c4b 100644 --- a/linearize.c +++ b/linearize.c @@ -230,6 +230,8 @@ static const char *opcodes[] = { [OP_PHISOURCE] = "phisrc", [OP_CAST] = "cast", [OP_SCAST] = "scast", + [OP_FCVTU] = "fcvtu", + [OP_FCVTS] = "fcvts", [OP_UCVTF] = "ucvtf", [OP_SCVTF] = "scvtf", [OP_FCVTF] = "fcvtf", @@ -427,6 +429,7 @@ const char *show_instruction(struct instruction *insn) } case OP_CAST: case OP_SCAST: + case OP_FCVTU: case OP_FCVTS: case OP_UCVTF: case OP_SCVTF: case OP_FCVTF: case OP_PTRCAST: @@ -1176,6 +1179,8 @@ static int get_cast_opcode(struct symbol *dst, struct symbol *src) case MTYPE_UINT: case MTYPE_SINT: switch (stype) { + case MTYPE_FLOAT: + return dtype == MTYPE_UINT ? OP_FCVTU : OP_FCVTS; case MTYPE_SINT: return OP_SCAST; default: diff --git a/linearize.h b/linearize.h index 0ec42e588..600bae598 100644 --- a/linearize.h +++ b/linearize.h @@ -198,6 +198,7 @@ enum opcode { OP_PHISOURCE, OP_CAST, OP_SCAST, + OP_FCVTU, OP_FCVTS, OP_UCVTF, OP_SCVTF, OP_FCVTF, OP_PTRCAST, diff --git a/liveness.c b/liveness.c index b3e0a8326..3bd95fe5b 100644 --- a/liveness.c +++ b/liveness.c @@ -113,6 +113,7 @@ static void track_instruction_usage(struct basic_block *bb, struct instruction * case OP_CAST: case OP_SCAST: + case OP_FCVTU: case OP_FCVTS: case OP_UCVTF: case OP_SCVTF: case OP_FCVTF: case OP_PTRCAST: diff --git a/simplify.c b/simplify.c index e0f31ad45..365811b96 100644 --- a/simplify.c +++ b/simplify.c @@ -238,6 +238,7 @@ void kill_insn(struct instruction *insn, int force) case OP_CAST: case OP_SCAST: + case OP_FCVTU: case OP_FCVTS: case OP_UCVTF: case OP_SCVTF: case OP_FCVTF: case OP_PTRCAST: @@ -341,6 +342,7 @@ static int replace_with_pseudo(struct instruction *insn, pseudo_t pseudo) case OP_SYMADDR: case OP_CAST: case OP_SCAST: + case OP_FCVTU: case OP_FCVTS: case OP_UCVTF: case OP_SCVTF: case OP_FCVTF: case OP_PTRCAST: @@ -1203,6 +1205,7 @@ int simplify_instruction(struct instruction *insn) return replace_with_pseudo(insn, insn->symbol); case OP_CAST: case OP_SCAST: + case OP_FCVTU: case OP_FCVTS: case OP_UCVTF: case OP_SCVTF: case OP_FCVTF: case OP_PTRCAST: diff --git a/sparse-llvm.c b/sparse-llvm.c index c45729ef4..04efc6637 100644 --- a/sparse-llvm.c +++ b/sparse-llvm.c @@ -855,6 +855,7 @@ static void output_insn(struct function *fn, struct instruction *insn) case OP_SCAST: output_op_cast(fn, insn, LLVMSExt); break; + case OP_FCVTU: case OP_FCVTS: case OP_UCVTF: case OP_SCVTF: case OP_FCVTF: assert(0); diff --git a/validation/cast-kinds-check.c b/validation/cast-kinds-check.c index f3ece313a..be6b684b4 100644 --- a/validation/cast-kinds-check.c +++ b/validation/cast-kinds-check.c @@ -9,12 +9,10 @@ cast-kinds.c:5:45: warning: cast drops bits cast-kinds.c:6:47: warning: cast drops bits cast-kinds.c:7:46: warning: cast drops bits cast-kinds.c:8:45: warning: cast drops bits -cast-kinds.c:10:49: warning: cast drops bits cast-kinds.c:12:48: warning: cast drops bits cast-kinds.c:13:50: warning: cast drops bits cast-kinds.c:14:49: warning: cast drops bits cast-kinds.c:15:48: warning: cast drops bits -cast-kinds.c:17:52: warning: cast drops bits cast-kinds.c:21:49: warning: cast wasn't removed cast-kinds.c:22:48: warning: cast wasn't removed cast-kinds.c:28:52: warning: cast wasn't removed diff --git a/validation/cast-kinds.c b/validation/cast-kinds.c index 0312bc92b..d07a94190 100644 --- a/validation/cast-kinds.c +++ b/validation/cast-kinds.c @@ -95,13 +95,14 @@ iptr_2_int: float_2_int: .L10: - ret.32 %arg1 + fcvts.32 %r17 <- (32) %arg1 + ret.32 %r17 double_2_int: .L12: - cast.32 %r20 <- (64) %arg1 + fcvts.32 %r20 <- (64) %arg1 ret.32 %r20 @@ -142,13 +143,14 @@ iptr_2_uint: float_2_uint: .L24: - ret.32 %arg1 + fcvtu.32 %r38 <- (32) %arg1 + ret.32 %r38 double_2_uint: .L26: - cast.32 %r41 <- (64) %arg1 + fcvtu.32 %r41 <- (64) %arg1 ret.32 %r41 @@ -189,14 +191,15 @@ iptr_2_long: float_2_long: .L38: - cast.64 %r59 <- (32) %arg1 + fcvts.64 %r59 <- (32) %arg1 ret.64 %r59 double_2_long: .L40: - ret.64 %arg1 + fcvts.64 %r62 <- (64) %arg1 + ret.64 %r62 int_2_ulong: @@ -236,14 +239,15 @@ iptr_2_ulong: float_2_ulong: .L52: - cast.64 %r80 <- (32) %arg1 + fcvtu.64 %r80 <- (32) %arg1 ret.64 %r80 double_2_ulong: .L54: - ret.64 %arg1 + fcvtu.64 %r83 <- (64) %arg1 + ret.64 %r83 int_2_vptr: