backport: re PR middle-end/39943 (wrong conversion from unsigned int to float)
Backport from mainline: 2009-04-29 Richard Guenther <rguenther@suse.de> PR target/39943 * config/i386/i386.c (ix86_vectorize_builtin_conversion): Only allow conversion to signed integers. testsuite/ChangeLog: PR target/40811 * gcc.target/i386/pr39943.c: New test. Backport from mainline: 2009-04-29 Richard Guenther <rguenther@suse.de> PR target/39943 * lib/target-supports.exp (check_effective_target_vect_uintfloat_cvt): New. (check_effective_target_vect_floatuint_cvt): Likewise. * gcc.dg/vect/slp-10.c: Adjust. * gcc.dg/vect/slp-11.c: Adjust. * gcc.dg/vect/slp-12b.c: Adjust. * gcc.dg/vect/slp-33.c: Adjust. * gcc.c-torture/compile/pr39943.c: New testcase. From-SVN: r149847
This commit is contained in:
parent
ce4589d69a
commit
e36429e775
|
@ -1,3 +1,12 @@
|
|||
2009-07-21 Uros Bizjak <ubizjak@gmail.com>
|
||||
|
||||
Backport from mainline:
|
||||
2009-04-29 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR target/39943
|
||||
* config/i386/i386.c (ix86_vectorize_builtin_conversion): Only
|
||||
allow conversion to signed integers.
|
||||
|
||||
2009-07-20 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR tree-optimization/40792
|
||||
|
|
|
@ -25306,7 +25306,9 @@ ix86_veclibabi_acml (enum built_in_function fn, tree type_out, tree type_in)
|
|||
static tree
|
||||
ix86_vectorize_builtin_conversion (unsigned int code, tree type)
|
||||
{
|
||||
if (TREE_CODE (type) != VECTOR_TYPE)
|
||||
if (TREE_CODE (type) != VECTOR_TYPE
|
||||
/* There are only conversions from/to signed integers. */
|
||||
|| TYPE_UNSIGNED (TREE_TYPE (type)))
|
||||
return NULL_TREE;
|
||||
|
||||
switch (code)
|
||||
|
|
|
@ -1,3 +1,21 @@
|
|||
2009-07-21 Uros Bizjak <ubizjak@gmail.com>
|
||||
|
||||
PR target/40811
|
||||
* gcc.target/i386/pr39943.c: New test.
|
||||
|
||||
Backport from mainline:
|
||||
2009-04-29 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR target/39943
|
||||
* lib/target-supports.exp (check_effective_target_vect_uintfloat_cvt):
|
||||
New.
|
||||
(check_effective_target_vect_floatuint_cvt): Likewise.
|
||||
* gcc.dg/vect/slp-10.c: Adjust.
|
||||
* gcc.dg/vect/slp-11.c: Adjust.
|
||||
* gcc.dg/vect/slp-12b.c: Adjust.
|
||||
* gcc.dg/vect/slp-33.c: Adjust.
|
||||
* gcc.c-torture/compile/pr39943.c: New testcase.
|
||||
|
||||
2009-07-20 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR tree-optimization/40792
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
void gl_fog_index_pixels(float f, unsigned int n, unsigned int index[])
|
||||
{
|
||||
unsigned int i;
|
||||
for (i=0; i<n; i++)
|
||||
index[i] = (unsigned int) ((float) index[i] + (1.0F-f));
|
||||
}
|
||||
|
|
@ -104,11 +104,11 @@ int main (void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump-times "vectorized 3 loops" 1 "vect" {target {vect_intfloat_cvt && vect_int_mult} } } } */
|
||||
/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" {target {{! { vect_intfloat_cvt}} && vect_int_mult} } } } */
|
||||
/* { dg-final { scan-tree-dump-times "vectorized 0 loops" 1 "vect" {target {{! { vect_intfloat_cvt}} && { ! {vect_int_mult}}} } } } */
|
||||
/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 3 "vect" {target {vect_intfloat_cvt && vect_int_mult} } } } */
|
||||
/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 2 "vect" {target {{! { vect_intfloat_cvt}} && vect_int_mult} } } } */
|
||||
/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 0 "vect" {target {{! { vect_intfloat_cvt}} && { ! {vect_int_mult}}} } } } */
|
||||
/* { dg-final { scan-tree-dump-times "vectorized 3 loops" 1 "vect" {target {vect_uintfloat_cvt && vect_int_mult} } } } */
|
||||
/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" {target {{! { vect_uintfloat_cvt}} && vect_int_mult} } } } */
|
||||
/* { dg-final { scan-tree-dump-times "vectorized 0 loops" 1 "vect" {target {{! { vect_uintfloat_cvt}} && { ! {vect_int_mult}}} } } } */
|
||||
/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 3 "vect" {target {vect_uintfloat_cvt && vect_int_mult} } } } */
|
||||
/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 2 "vect" {target {{! { vect_uintfloat_cvt}} && vect_int_mult} } } } */
|
||||
/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 0 "vect" {target {{! { vect_uintfloat_cvt}} && { ! {vect_int_mult}}} } } } */
|
||||
/* { dg-final { cleanup-tree-dump "vect" } } */
|
||||
|
||||
|
|
|
@ -106,8 +106,8 @@ int main (void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump-times "vectorized 3 loops" 1 "vect" { target { { vect_intfloat_cvt && vect_strided_wide } && vect_int_mult } } } } */
|
||||
/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" { target { { { ! vect_intfloat_cvt } && vect_strided_wide } && vect_int_mult } } } } */
|
||||
/* { dg-final { scan-tree-dump-times "vectorized 3 loops" 1 "vect" { target { { vect_uintfloat_cvt && vect_strided_wide } && vect_int_mult } } } } */
|
||||
/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" { target { { { ! vect_uintfloat_cvt } && vect_strided_wide } && vect_int_mult } } } } */
|
||||
/* { dg-final { scan-tree-dump-times "vectorized 0 loops" 1 "vect" {target { ! { vect_int_mult && vect_strided_wide } } } } } */
|
||||
/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 0 "vect" } } */
|
||||
/* { dg-final { cleanup-tree-dump "vect" } } */
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* { dg-require-effective-target vect_intfloat_cvt } */
|
||||
/* { dg-require-effective-target vect_uintfloat_cvt } */
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
|
|
|
@ -102,11 +102,11 @@ int main (void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump-times "vectorized 3 loops" 1 "vect" {target {vect_intfloat_cvt && vect_int_mult} } } } */
|
||||
/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" {target {{! { vect_intfloat_cvt}} && vect_int_mult} } } } */
|
||||
/* { dg-final { scan-tree-dump-times "vectorized 0 loops" 1 "vect" {target {{! { vect_intfloat_cvt}} && {! {vect_int_mult}}} } } } */
|
||||
/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 3 "vect" {target {vect_intfloat_cvt && vect_int_mult} } } } */
|
||||
/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 2 "vect" {target {{! { vect_intfloat_cvt}} && vect_int_mult} } } } */
|
||||
/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 0 "vect" {target {{! { vect_intfloat_cvt}} && {! {vect_int_mult}}} } } } */
|
||||
/* { dg-final { scan-tree-dump-times "vectorized 3 loops" 1 "vect" {target {vect_uintfloat_cvt && vect_int_mult} } } } */
|
||||
/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" {target {{! { vect_uintfloat_cvt}} && vect_int_mult} } } } */
|
||||
/* { dg-final { scan-tree-dump-times "vectorized 0 loops" 1 "vect" {target {{! { vect_uintfloat_cvt}} && {! {vect_int_mult}}} } } } */
|
||||
/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 3 "vect" {target {vect_uintfloat_cvt && vect_int_mult} } } } */
|
||||
/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 2 "vect" {target {{! { vect_uintfloat_cvt}} && vect_int_mult} } } } */
|
||||
/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 0 "vect" {target {{! { vect_uintfloat_cvt}} && {! {vect_int_mult}}} } } } */
|
||||
/* { dg-final { cleanup-tree-dump "vect" } } */
|
||||
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
/* { dg-do run } */
|
||||
/* { dg-options "-O2 -ftree-vectorize -msse2" } */
|
||||
|
||||
#include "sse2-check.h"
|
||||
|
||||
#define N 8
|
||||
|
||||
unsigned int u4[N] = { 4000000000u, 4000000000u, 4000000000u, 4000000000u, 4000000000u, 4000000000u, 4000000000u, 4000000000u };
|
||||
float f4[N];
|
||||
|
||||
static void
|
||||
sse2_test (void)
|
||||
{
|
||||
int j;
|
||||
|
||||
for (j = 0; j < N; j++)
|
||||
f4[j] = u4[j];
|
||||
|
||||
/* check results: */
|
||||
for (j = 0; j < N; j++)
|
||||
if (f4[j] != 4000000000.0)
|
||||
abort ();
|
||||
}
|
|
@ -1313,7 +1313,7 @@ proc check_effective_target_vect_int { } {
|
|||
return $et_vect_int_saved
|
||||
}
|
||||
|
||||
# Return 1 if the target supports int->float conversion
|
||||
# Return 1 if the target supports signed int->float conversion
|
||||
#
|
||||
|
||||
proc check_effective_target_vect_intfloat_cvt { } {
|
||||
|
@ -1336,7 +1336,28 @@ proc check_effective_target_vect_intfloat_cvt { } {
|
|||
}
|
||||
|
||||
|
||||
# Return 1 if the target supports float->int conversion
|
||||
# Return 1 if the target supports unsigned int->float conversion
|
||||
#
|
||||
|
||||
proc check_effective_target_vect_uintfloat_cvt { } {
|
||||
global et_vect_uintfloat_cvt_saved
|
||||
|
||||
if [info exists et_vect_uintfloat_cvt_saved] {
|
||||
verbose "check_effective_target_vect_uintfloat_cvt: using cached result" 2
|
||||
} else {
|
||||
set et_vect_uintfloat_cvt_saved 0
|
||||
if { ([istarget powerpc*-*-*]
|
||||
&& ![istarget powerpc-*-linux*paired*]) } {
|
||||
set et_vect_uintfloat_cvt_saved 1
|
||||
}
|
||||
}
|
||||
|
||||
verbose "check_effective_target_vect_uintfloat_cvt: returning $et_vect_uintfloat_cvt_saved" 2
|
||||
return $et_vect_uintfloat_cvt_saved
|
||||
}
|
||||
|
||||
|
||||
# Return 1 if the target supports signed float->int conversion
|
||||
#
|
||||
|
||||
proc check_effective_target_vect_floatint_cvt { } {
|
||||
|
@ -1358,6 +1379,26 @@ proc check_effective_target_vect_floatint_cvt { } {
|
|||
return $et_vect_floatint_cvt_saved
|
||||
}
|
||||
|
||||
# Return 1 if the target supports unsigned float->int conversion
|
||||
#
|
||||
|
||||
proc check_effective_target_vect_floatuint_cvt { } {
|
||||
global et_vect_floatuint_cvt_saved
|
||||
|
||||
if [info exists et_vect_floatuint_cvt_saved] {
|
||||
verbose "check_effective_target_vect_floatuint_cvt: using cached result" 2
|
||||
} else {
|
||||
set et_vect_floatuint_cvt_saved 0
|
||||
if { ([istarget powerpc*-*-*]
|
||||
&& ![istarget powerpc-*-linux*paired*]) } {
|
||||
set et_vect_floatuint_cvt_saved 1
|
||||
}
|
||||
}
|
||||
|
||||
verbose "check_effective_target_vect_floatuint_cvt: returning $et_vect_floatuint_cvt_saved" 2
|
||||
return $et_vect_floatuint_cvt_saved
|
||||
}
|
||||
|
||||
# Return 1 is this is an arm target using 32-bit instructions
|
||||
proc check_effective_target_arm32 { } {
|
||||
return [check_no_compiler_messages arm32 assembly {
|
||||
|
|
Loading…
Reference in New Issue