forked from gcc-mirror/gcc
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add 'gcc.dg/tree-ssa/pr107195-3.c' [PR107195]
... to display optimization performed as of recent commit r13-3217-gc4d15dddf6b9eacb36f535807ad2ee364af46e04 "[PR107195] Set range to zero when nonzero mask is 0". PR tree-optimization/107195 gcc/testsuite/ * gcc.dg/tree-ssa/pr107195-3.c: New.
- Loading branch information
Showing
1 changed file
with
112 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,112 @@ | ||
/* Inspired by 'libgomp.oacc-c-c++-common/nvptx-sese-1.c'. */ | ||
|
||
/* { dg-additional-options -O1 } */ | ||
/* { dg-additional-options -fdump-tree-dom3-raw } */ | ||
|
||
|
||
extern int | ||
__attribute__((const)) | ||
foo1 (int); | ||
|
||
int f1 (int r) | ||
{ | ||
if (foo1 (r)) /* If this first 'if' holds... */ | ||
r *= 2; /* ..., 'r' now has a zero-value lower-most bit... */ | ||
|
||
if (r & 1) /* ..., so this second 'if' can never hold... */ | ||
{ /* ..., so this is unreachable. */ | ||
/* In constrast, if the first 'if' does not hold ('foo1 (r) == 0'), the | ||
second 'if' may hold, but we know ('foo1' being 'const') that | ||
'foo1 (r) == 0', so don't have to re-evaluate it here: */ | ||
r += foo1 (r); | ||
} | ||
|
||
return r; | ||
} | ||
/* Thus, if optimizing, we only ever expect one call of 'foo1'. | ||
{ dg-final { scan-tree-dump-times {gimple_call <foo1,} 1 dom3 } } */ | ||
|
||
|
||
extern int | ||
__attribute__((const)) | ||
foo2 (int); | ||
|
||
int f2 (int r) | ||
{ | ||
if (foo2 (r)) | ||
r *= 8; | ||
|
||
if (r & 7) | ||
r += foo2 (r); | ||
|
||
return r; | ||
} | ||
/* { dg-final { scan-tree-dump-times {gimple_call <foo2,} 1 dom3 } } */ | ||
|
||
|
||
extern int | ||
__attribute__((const)) | ||
foo3 (int); | ||
|
||
int f3 (int r) | ||
{ | ||
if (foo3 (r)) | ||
r <<= 4; | ||
|
||
if ((r & 64) && ((r & 8) || (r & 4) || (r & 2) || (r & 1))) | ||
r += foo3 (r); | ||
|
||
return r; | ||
} | ||
/* { dg-final { scan-tree-dump-times {gimple_call <foo3,} 1 dom3 } } */ | ||
|
||
|
||
extern int | ||
__attribute__((const)) | ||
foo4 (int); | ||
|
||
int f4 (int r) | ||
{ | ||
if (foo4 (r)) | ||
r *= 8; | ||
|
||
if ((r >> 1) & 2) | ||
r += foo4 (r); | ||
|
||
return r; | ||
} | ||
/* { dg-final { scan-tree-dump-times {gimple_call <foo4,} 1 dom3 } } */ | ||
|
||
|
||
extern int | ||
__attribute__((const)) | ||
foo5 (int); | ||
|
||
int f5 (int r) /* Works for both 'signed' and 'unsigned'. */ | ||
{ | ||
if (foo5 (r)) | ||
r *= 2; | ||
|
||
if ((r % 2) != 0) | ||
r += foo5 (r); | ||
|
||
return r; | ||
} | ||
/* { dg-final { scan-tree-dump-times {gimple_call <foo5,} 1 dom3 } } */ | ||
|
||
|
||
extern int | ||
__attribute__((const)) | ||
foo6 (int); | ||
|
||
int f6 (unsigned int r) /* 'unsigned' is important here. */ | ||
{ | ||
if (foo6 (r)) | ||
r *= 2; | ||
|
||
if ((r % 2) == 1) | ||
r += foo6 (r); | ||
|
||
return r; | ||
} | ||
/* { dg-final { scan-tree-dump-times {gimple_call <foo6,} 1 dom3 } } */ |