From patchwork Mon Aug 27 22:57:17 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Martin Sebor X-Patchwork-Id: 962682 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-484536-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="S8hflu3x"; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="EBLN/5nD"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 41znMy3ztMz9s47 for ; Tue, 28 Aug 2018 08:57:31 +1000 (AEST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:to :from:subject:message-id:date:mime-version:content-type; q=dns; s=default; b=LfcHdbXsrYCg6FiioCHvzqR2j7kxQJwAP01yJ5hxbmiQb76ZxW mzgyMVgnlME4vlfh/Mzx28Okr0cfekCudr5gI4rNO9SsuHobo9C39HBUYfXxOyZx nfHb3qKhdEx1VFORjDj/zlxiEvRNbk0wDOjIcqs8JDZECIQtHxQNbhi+U= 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:to :from:subject:message-id:date:mime-version:content-type; s= default; bh=3fH9rSWNLzuu+rmFVGAoucurNEY=; b=S8hflu3xH8X0rGvgkgB0 lEw41Kz0zH08D9ZlyrOY6cJAspQA8Efz13c0tvWEx8TOPZXUFT/FTZpk9f1WnZOi qGNGzaeDEynuSXJJAmUmX8qlCN+boO5TA5GSRvUxOHva95Iq+UlCbi3zGSxEEKUt QkKH/zxqAvHn63q4GU18sjE= Received: (qmail 62241 invoked by alias); 27 Aug 2018 22:57:24 -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 62231 invoked by uid 89); 27 Aug 2018 22:57:23 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-10.5 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, GIT_PATCH_2, GIT_PATCH_3, KAM_ASCII_DIVIDERS, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=H*M:eb31, H*MI:eb31, ssizetype X-HELO: mail-qt0-f179.google.com Received: from mail-qt0-f179.google.com (HELO mail-qt0-f179.google.com) (209.85.216.179) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 27 Aug 2018 22:57:21 +0000 Received: by mail-qt0-f179.google.com with SMTP id n6-v6so841936qtl.4 for ; Mon, 27 Aug 2018 15:57:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=to:from:subject:message-id:date:user-agent:mime-version; bh=PWtVBJwOwt6+P/nF0JDzZxTFAIj+BtLMU8SPqPmRCL0=; b=EBLN/5nDq+whQcGPDLTccmHof3bbFu4955xTGyIzy4GZTpNNZsRU97jhxZc3a4jxE4 /EYMK/QU40u2u1n/h+c93qIdLjffpIeNh94u+7WEXY6RiqIeVsKaBRJHAPrZQ+HgmYvR 79VWv3UKGWmz60H5g4n2ob0UIJsaKvt26598rKKjeEtgAatyRkYqQOyhJ9awtFVDh78p HgLDKu51ou8toCJWK6u3ZAnDZbACFAIBX9bmgJEc9vkGXRuHoJP3W86Umw7MZkITYVqk qv3HKJ7JqOWW++DMcvsOta6sJnh7gDI4oBpeeSVPQPR6C7A99GAyzIjNfMNUoy3fUh9M qSZQ== Received: from localhost.localdomain (75-166-100-32.hlrn.qwest.net. [75.166.100.32]) by smtp.gmail.com with ESMTPSA id i85-v6sm438869qkh.3.2018.08.27.15.57.18 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 27 Aug 2018 15:57:19 -0700 (PDT) To: Gcc Patch List , Jeff Law From: Martin Sebor Subject: [PATCH] adjust strnlen to convert MIN_EXPR to the same type (PR 87112) Message-ID: Date: Mon, 27 Aug 2018 16:57:17 -0600 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0 MIME-Version: 1.0 X-IsSubscribed: yes The assertion I added in the fix for PR 87059 to help find mismatched MIN/MAX_EXPR operands has exposed another instance of such a mismatch, this one in expand_builtin_strnlen(). The attached patch adjusts the function to convert the signed result of c_strlen() to the unsigned type of the second strnlen argument. Martin PR tree-optimization/87112 - ICE in fold_binary_loc on strnlen of mixed integer types gcc/ChangeLog: PR tree-optimization/87112 * builtins.c (expand_builtin_strnlen): Convert c_strlen result to the type of the bound argument. gcc/testsuite/ChangeLog: PR tree-optimization/87112 * gcc.dg/pr87112.c: New test. Index: gcc/builtins.c =================================================================== --- gcc/builtins.c (revision 263896) +++ gcc/builtins.c (working copy) @@ -2970,6 +2970,10 @@ expand_builtin_strnlen (tree exp, rtx target, mach tree func = get_callee_fndecl (exp); tree len = c_strlen (src, 0); + /* FIXME: Change c_strlen() to return sizetype instead of ssizetype + so these conversions aren't necessary. */ + if (len) + len = fold_convert_loc (loc, TREE_TYPE (bound), len); if (TREE_CODE (bound) == INTEGER_CST) { @@ -2984,7 +2988,6 @@ expand_builtin_strnlen (tree exp, rtx target, mach if (!len || TREE_CODE (len) != INTEGER_CST) return NULL_RTX; - len = fold_convert_loc (loc, size_type_node, len); len = fold_build2_loc (loc, MIN_EXPR, size_type_node, len, bound); return expand_expr (len, target, target_mode, EXPAND_NORMAL); } Index: gcc/testsuite/gcc.dg/pr87112.c =================================================================== --- gcc/testsuite/gcc.dg/pr87112.c (nonexistent) +++ gcc/testsuite/gcc.dg/pr87112.c (working copy) @@ -0,0 +1,31 @@ +/* PR tree-optimization/87112 - ICE due to strnlen mixing integer types + { dg-do compile } + { dg-options "-Os -Wall" } */ + +typedef __SIZE_TYPE__ size_t; + +extern size_t strnlen (const char*, size_t); + +size_t fi (int i) +{ + int n = i & 3; + return strnlen ("int", n); +} + +size_t fui (unsigned i) +{ + unsigned n = i & 3; + return strnlen ("unsigned", n); +} + +size_t fl (long i) +{ + long n = i & 3; + return strnlen ("long", n); +} + +size_t fsz (size_t i) +{ + size_t n = i & 3; + return strnlen ("size_t", n); +}