From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 83538 invoked by alias); 19 Nov 2017 21:11:51 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 83521 invoked by uid 89); 19 Nov 2017 21:11:50 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.1 required=5.0 tests=AWL,BAYES_00,KB_WAM_FROM_NAME_SINGLEWORD,RCVD_IN_DNSWL_LOW,SPF_PASS,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy=shooting, burn, pronounced, 1n X-Spam-User: qpsmtpd, 2 recipients X-HELO: cc-smtpout1.netcologne.de Received: from cc-smtpout1.netcologne.de (HELO cc-smtpout1.netcologne.de) (89.1.8.211) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sun, 19 Nov 2017 21:11:47 +0000 Received: from cc-smtpin1.netcologne.de (cc-smtpin1.netcologne.de [89.1.8.201]) by cc-smtpout1.netcologne.de (Postfix) with ESMTP id DD3D612B32; Sun, 19 Nov 2017 22:11:42 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by cc-smtpin1.netcologne.de (Postfix) with ESMTP id D07CF11DB6; Sun, 19 Nov 2017 22:11:42 +0100 (CET) Received: from [78.35.131.92] (helo=cc-smtpin1.netcologne.de) by localhost with ESMTP (eXpurgate 4.1.9) (envelope-from ) id 5a11f38e-029d-7f0000012729-7f000001afcf-1 for ; Sun, 19 Nov 2017 22:11:42 +0100 Received: from [192.168.178.20] (xdsl-78-35-131-92.netcologne.de [78.35.131.92]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by cc-smtpin1.netcologne.de (Postfix) with ESMTPSA; Sun, 19 Nov 2017 22:11:39 +0100 (CET) To: "fortran@gcc.gnu.org" , gcc-patches From: Thomas Koenig Subject: [patch, fortran] Implement maxloc and minloc for character Message-ID: <44c7b39b-d849-e31a-7175-80bf1a348908@netcologne.de> Date: Sun, 19 Nov 2017 22:04:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.4.0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------1000E72B7C49DC4509BEE759" X-SW-Source: 2017-11/txt/msg01683.txt.bz2 This is a multi-part message in MIME format. --------------1000E72B7C49DC4509BEE759 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-length: 4159 Hello world, the attached patch implements maxloc and minloc, a missing feature / bug (now that we are shooting for f2003 compliance). I decided to do everything on the library side, since I am more familiar with that territory. I also suspect that any performance gain from inlining will be less pronounced than with intrinsic types. There is one question regarding the ABI. Apparently, the string length is passed as an int even on a 64-bit system. I verified that this is indeed the case by doing the actual work on a powerpc64-unknown-linux-gnu box (gcc110 on the gcc compile farm), which is big-endian. If we were actually passing an eight-byte quantity, and only getting the upper bytes, we would crash & burn. Now, I _thought_ we were passing string lengths as size_t now (Janne?), but maybe something was missing in that change. So, this works, and passes regression testing. OK for trunk? If so, I would tackle maxval next, in a similar fashion. If anybody has another resolution for the size_t vs. int issue - the nice thing about m4 is that it is fairly easy to make that change. Regards Thomas 2017-11-19 Thomas Koenig PR fortran/36313 * Makefile.am: Add i_maxloc0s_c, i_maxloc1s_c, i_maxloc2s_c, i_minloc0s_c, i_minloc1s_c and i_minloc2s_c. * Makefile.in: Regenerated. * generated/maxloc0_16_s1.c: New file. * generated/maxloc0_16_s4.c: New file. * generated/maxloc0_4_s1.c: New file. * generated/maxloc0_4_s4.c: New file. * generated/maxloc0_8_s1.c: New file. * generated/maxloc0_8_s4.c: New file. * generated/maxloc1_16_s1.c: New file. * generated/maxloc1_16_s4.c: New file. * generated/maxloc1_4_s1.c: New file. * generated/maxloc1_4_s4.c: New file. * generated/maxloc1_8_s1.c: New file. * generated/maxloc1_8_s4.c: New file. * generated/maxloc2_16_s1.c: New file. * generated/maxloc2_16_s4.c: New file. * generated/maxloc2_4_s1.c: New file. * generated/maxloc2_4_s4.c: New file. * generated/maxloc2_8_s1.c: New file. * generated/maxloc2_8_s4.c: New file. * generated/minloc0_16_s1.c: New file. * generated/minloc0_16_s4.c: New file. * generated/minloc0_4_s1.c: New file. * generated/minloc0_4_s4.c: New file. * generated/minloc0_8_s1.c: New file. * generated/minloc0_8_s4.c: New file. * generated/minloc1_16_s1.c: New file. * generated/minloc1_16_s4.c: New file. * generated/minloc1_4_s1.c: New file. * generated/minloc1_4_s4.c: New file. * generated/minloc1_8_s1.c: New file. * generated/minloc1_8_s4.c: New file. * generated/minloc2_16_s1.c: New file. * generated/minloc2_16_s4.c: New file. * generated/minloc2_4_s1.c: New file. * generated/minloc2_4_s4.c: New file. * generated/minloc2_8_s1.c: New file. * generated/minloc2_8_s4.c: New file. * m4/iforeach-s.m4: New file. * m4/ifunction-s.m4: New file. * m4/maxloc0s.m4: New file. * m4/maxloc1s.m4: New file. * m4/maxloc2s.m4: New file. * m4/minloc0s.m4: New file. * m4/minloc1s.m4: New file. * m4/minloc2s.m4: New file. * gfortran.map: Add new functions. * libgfortran.h: Add gfc_array_s1 and gfc_array_s4. 2017-11-19 Thomas Koenig PR fortran/36313 * check.c (int_or_real_or_char_check_f2003): New function. * iresolve.c (gfc_resolve_maxloc): Add number "2" for character arguments and rank-zero return value. (gfc_resolve_minloc): Likewise. * trans-intrinsic.c (gfc_conv_intrinsic_minmaxloc): Handle case of character arguments and rank-zero return value by removing unneeded arguments and calling the library function. 2017-11-19 Thomas Koenig PR fortran/36313 * gfortran.dg/maxloc_string_1.f90: New test. * gfortran.dg/minloc_string_1.f90: New test. --------------1000E72B7C49DC4509BEE759 Content-Type: application/gzip; name="p7.diff.gz" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="p7.diff.gz" Content-length: 34514 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 Yk/nYszko1lMxWYQeJbDN5N4x+Y9y67Fg/8QpMYQeaftpc8sNtf13i/3no9n +oLe0au4LDxk+2PLCCxzGrGxv4W2OwqM8HluG95YoJa7mCUtHdv3XU9gUzAZ h5bIHZ7u2fJBPHlPNt/y9ES92LoU222OlbRf7kNaE9NfjkM+MsVntItZbMNB 8MHIgyEDqVHy6c0imAsmJhO60Dqp5tJEKpZ3SLOV6QZpzCDeg82wdVyjoqpM V55cK6eZ9cHYScKB731NZmz4WtVTJ5QSC+g314fbQMYfVbR8JSjtb5Y9X0Ke qBrbZrhg5i6PFTYhFmo4HhvmfRCv3qJHmj5Gq7X4uVeB6F02ARRqcA2e6JUo O2kLJ20Rr1rFs59SpCvVqJjh6yctnJn5sJQjKmRaRRVJu7gUtbS/zZO+xCNN H/FxBpr7NILmAXnJEp0Bv/vPpaBxgWYLsZBJKWM2PnoSq4hnmnle6iYKsVHc tEnEws22c3MN3bRlIXS4bkbgPLiJ16JnmnmOOxSFpL98rJB6TJjQUTlDmIgc F6JWI2eWcBaPqfNFMUPlp1QxV/EYM42eM1YPTZcszR4VaLaQ2C8upS1ZvpFI JB5p+hhLw5/9lCIT5qIYc46eK/wi9jzyrx1LNLS8jiyl9pUYVnJgp7K3PA2U euuWkvpuaVnU7UQLqtHcX1phTFaqNSh1VFp1VixNBlXLLyjJAyVeLFGtailS Z8+1WX40T9PWzLafMTWNT+///+L87rbsh0GzYL3ueqUqROtWrq5KqzAorWO7 x1UtuyInr6tUt9tkU1jSOpn3pI2zX/AJsIFW91P9Levyw8Xl2ZerO2P48fzq y4cL3qA9PBJzrhP4VvS+q9855i8V+wD7Q5W/76FK9D1OVfa7A+Feiv8wpyrR n/RYJfpTnqtEeg9W9gcininfGd0frPw9D1ai73GykhIq3NuHP8zJSvQnPVqJ /pRnK5Hew5UYE/EOG2Pazx+vRMrnK/+MxyvRH+d8JcbiZCxz4YBWnbBUEXV/ wnJbJyzXnbEUHu1gcZASd/rdwknK/KjMnqUUblY6TVlJWX2echWp5ETlCjlK ZypXsY8H3sXf727OjA/D2ztBnKATsyULaH7S8v2XIVtC3n76cnN+wVhYnjt2 Ho6is5bXZ79ccC+cXRv88fLq7CdGwhq2zVlk6V4XhKX7eBBZeuQEoTW1Tbdt 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 puozU+0dY+0dU+2VbgpfHmv/eNdYe8dYe8dUe8dUe8dUe0dfe/1ApZ42ng0M cMgN4OwZDGCbe4Bt7AG2sQfYxh5gG3uAbewBtqkHqAMVgxgNTXDIjCZgRgsw kwGYqf7MVH1mqr1jrL1jqr3SAx7zWH2/sa8ZqII7RsaXjUzlNFTfMVU/eaBS 97kxntXfy0y3MtOdjulOXZfVDlT+Ke0Z+ZX2G9xP7e8dJLfRtJQqJadKSapS sqqUtColrzInVtOZ1X6De6x99thsCma2BDMaghntwIxmYEYrOGYrOEYrhN12 3+ZOa3/fMVvBMVvBMVrBMVrBMVrBMVhBP3ylJFoJmdb+rvBfB4cmQ9gpPcM2 9wzb3DNsc8+wzT3DNvcM29gz1IEMvQOawmmYTcHMlmBGQzCjHZjRDMxoBcds BcdoBaVnMI497B/amgEtJfUy517m5MucfZnTr5T8KyUBM2dg5hTMnIOZkzBT FmZIw2J52P4BxwoObJ1PT0nEUjKxlFQsJRdLScZSsjFzOjadj+0/5inpwa5j NgUzW4IZDcGMdmBGMzCjFRyzFRyjFZRO7PCs9GDv0GwFx2wFx2gFx2gFx2gF x2AFw/BmTs8S8rP9Qx74HegQirQELSVDS0nRUnK0lCQtJUszp2nTedr+IQ/8 DnRIRUqiZs7UzKmaOVczJ2sp2Zo5XZvO1w4aPPA7eKwDFlMSNnPGZk7ZzDmb OWlLydpS0jZz3mZO3MyZmzl1M+VuhuQtlr09PuQ+3TlIRhi8lOzNM2dvnjl7 88zZm2fO3jxz9uYZszdvOntzGtyxO4/3zaZgZkswoyGY0Q7MaAZmtIJjtoJj tELYiR2be3XHOTBbwTFbwTFawTFawTFawTFYQTu8eebszUvI3hyb+3Tn8LHJ EHZKz7DNPcM29wzb3DNsc8+wzT3DNvYMdXhzdrljP2w4ZlMwsyWY0RDMaAdm NAMzWsExW8ExWkHpGXs8nT+EdpE4vHnm7M0zZm+eMXvzjNmbZ8zePHP25pmz N8+YvXnG7M0zZm+eMXvzDNmbp8/evFj25uzzjPuQ6Xy6OXvzzNmbZ87ePHP2 5pmzN8+cvXnG7M2bzt5wiEdT7B+YTcHMlmBGQzCjHZjRDMxoBcdsBcdoBaUT P+bp/OHBY7MVHLMVHKMVHKMVHKMVHIMVDMObMXvzErI3x+GB3+Fjx2QIO6Vn 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 --------------1000E72B7C49DC4509BEE759 Content-Type: text/x-fortran; name="maxloc_string_1.f90" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="maxloc_string_1.f90" Content-length: 2142 ! { dg-do run } ! Test maxloc for strings for different code paths program main implicit none integer, parameter :: n=4 character(len=4), dimension(n,n) :: c integer, dimension(n,n) :: a integer, dimension(2) :: res1, res2 real, dimension(n,n) :: r logical, dimension(n,n) :: amask logical(kind=8) :: smask integer :: i,j integer, dimension(n) :: q1, q2 character(len=4,kind=4), dimension(n,n) :: c4 character(len=4), dimension(n*n) :: e integer, dimension(n*n) :: f logical, dimension(n*n) :: cmask call random_number (r) a = int(r*100) do j=1,n do i=1,n write (unit=c(i,j),fmt='(I4.4)') a(i,j) write (unit=c4(i,j),fmt='(I4.4)') a(i,j) end do end do res1 = maxloc(c) res2 = maxloc(a) if (any(res1 /= res2)) call abort res1 = maxloc(c4) if (any(res1 /= res2)) call abort amask = a < 50 res1 = maxloc(c,mask=amask) res2 = maxloc(a,mask=amask) if (any(res1 /= res2)) call abort amask = .false. res1 = maxloc(c,mask=amask) if (any(res1 /= 0)) call abort amask(2,3) = .true. res1 = maxloc(c,mask=amask) if (any(res1 /= [2,3])) call abort res1 = maxloc(c,mask=.false.) if (any(res1 /= 0)) call abort res2 = maxloc(a) res1 = maxloc(c,mask=.true.) if (any(res1 /= res2)) call abort q1 = maxloc(c, dim=1) q2 = maxloc(a, dim=1) if (any(q1 /= q2)) call abort q1 = maxloc(c, dim=2) q2 = maxloc(a, dim=2) if (any(q1 /= q2)) call abort q1 = maxloc(c, dim=1, mask=amask) q2 = maxloc(a, dim=1, mask=amask) if (any(q1 /= q2)) call abort q1 = maxloc(c, dim=2, mask=amask) q2 = maxloc(a, dim=2, mask=amask) if (any(q1 /= q2)) call abort amask = a < 50 q1 = maxloc(c, dim=1, mask=amask) q2 = maxloc(a, dim=1, mask=amask) if (any(q1 /= q2)) call abort q1 = maxloc(c, dim=2, mask=amask) q2 = maxloc(a, dim=2, mask=amask) if (any(q1 /= q2)) call abort e = reshape(c, shape(e)) f = reshape(a, shape(f)) if (maxloc(e,dim=1) /= maxloc(f,dim=1)) call abort cmask = .false. if (maxloc(e,dim=1,mask=cmask) /= 0) call abort cmask = f > 50 if ( maxloc(e, dim=1, mask=cmask) /= maxloc (f, dim=1, mask=cmask)) call abort end program main --------------1000E72B7C49DC4509BEE759 Content-Type: text/x-fortran; name="minloc_string_1.f90" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="minloc_string_1.f90" Content-length: 2142 ! { dg-do run } ! Test minloc for strings for different code paths program main implicit none integer, parameter :: n=4 character(len=4), dimension(n,n) :: c integer, dimension(n,n) :: a integer, dimension(2) :: res1, res2 real, dimension(n,n) :: r logical, dimension(n,n) :: amask logical(kind=8) :: smask integer :: i,j integer, dimension(n) :: q1, q2 character(len=4,kind=4), dimension(n,n) :: c4 character(len=4), dimension(n*n) :: e integer, dimension(n*n) :: f logical, dimension(n*n) :: cmask call random_number (r) a = int(r*100) do j=1,n do i=1,n write (unit=c(i,j),fmt='(I4.4)') a(i,j) write (unit=c4(i,j),fmt='(I4.4)') a(i,j) end do end do res1 = minloc(c) res2 = minloc(a) if (any(res1 /= res2)) call abort res1 = minloc(c4) if (any(res1 /= res2)) call abort amask = a < 50 res1 = minloc(c,mask=amask) res2 = minloc(a,mask=amask) if (any(res1 /= res2)) call abort amask = .false. res1 = minloc(c,mask=amask) if (any(res1 /= 0)) call abort amask(2,3) = .true. res1 = minloc(c,mask=amask) if (any(res1 /= [2,3])) call abort res1 = minloc(c,mask=.false.) if (any(res1 /= 0)) call abort res2 = minloc(a) res1 = minloc(c,mask=.true.) if (any(res1 /= res2)) call abort q1 = minloc(c, dim=1) q2 = minloc(a, dim=1) if (any(q1 /= q2)) call abort q1 = minloc(c, dim=2) q2 = minloc(a, dim=2) if (any(q1 /= q2)) call abort q1 = minloc(c, dim=1, mask=amask) q2 = minloc(a, dim=1, mask=amask) if (any(q1 /= q2)) call abort q1 = minloc(c, dim=2, mask=amask) q2 = minloc(a, dim=2, mask=amask) if (any(q1 /= q2)) call abort amask = a < 50 q1 = minloc(c, dim=1, mask=amask) q2 = minloc(a, dim=1, mask=amask) if (any(q1 /= q2)) call abort q1 = minloc(c, dim=2, mask=amask) q2 = minloc(a, dim=2, mask=amask) if (any(q1 /= q2)) call abort e = reshape(c, shape(e)) f = reshape(a, shape(f)) if (minloc(e,dim=1) /= minloc(f,dim=1)) call abort cmask = .false. if (minloc(e,dim=1,mask=cmask) /= 0) call abort cmask = f > 50 if ( minloc(e, dim=1, mask=cmask) /= minloc (f, dim=1, mask=cmask)) call abort end program main --------------1000E72B7C49DC4509BEE759--