https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119733
Krister Walfridsson changed:
What|Removed |Added
Resolution|FIXED |INVALID
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119733
Krister Walfridsson changed:
What|Removed |Added
Resolution|INVALID |FIXED
--- Comment #6 from Krister
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119733
Krister Walfridsson changed:
What|Removed |Added
Resolution|INVALID |FIXED
--- Comment #4 from Krister
-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
store-merging miscompiles the following program when targeting x86_64 with the
options "-O3 -fno-strict-aliasing":
struct S { unsigned char a, b; unsign
-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
phiopt2 miscompiles the following program when targeting x86_64 with the
options "-O3 -fno-strict-aliasing":
struct s {
int a;
int b;
};
int foo(int c
: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
Compile the function below for X86_64 with -O3:
void foo(int *p, int *q, int n)
{
for (int i = 0; i < n; i++)
p[i] = q[i] + 1;
}
The vectorizer a
Priority: P3
Component: middle-end
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
Compiling the function below for X86_64 with -Os results in an ICE:
during IPA pass: remove_symbols
bug.c:25:1: internal
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118915
--- Comment #6 from Krister Walfridsson ---
(In reply to Andrew Pinski from comment #3)
> I am kinda of shock that smtgcc didn't find this earlier.
My guess is that the relevant testcases are written similarly to
```
int main() {
if (b(a + 21
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118669
--- Comment #11 from Krister Walfridsson ---
FWIW, this also happens on RISC-V. You can observe it by compiling the
following function with "-O3 -march=rv64gcv"
float
test (float x, float *ptr, int n)
{
for (int i = 0; i < n; ++i)
x = __b
-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
Vectorization creates misaligned stores for the function below when compiled
for AArch64 with "-O3 -march=armv9.4":
void
foo (int i, int *a)
{
for (in
: target
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
I mistakenly compiled the code below for RV32 instead RV64:
riscv32-elf-gcc -O3 -march=rv32gc bug.c
This resulted in an ICE instead of an error message.
long foo
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117688
--- Comment #3 from Krister Walfridsson ---
The test still fails for me when running on qemu with a compiler built from
today's source code (64d31343d4676d8ceef9232dcd33824bc2eff330).
FWIW, the function foo is generated as:
foo:
lui
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
The following function is miscompiled for AArch64 when compiled with -O3:
int
foo (signed char *p1, signed char *p2)
{
int sum = 0;
for (int i = 0; i < 32; i++)
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117688
--- Comment #1 from Krister Walfridsson ---
Interestingly, the function is generated correctly if x is passed as a function
argument:
__attribute__ ((noipa)) void
foo2 (int8_t x)
{
int8_t minus;
_Bool overflow = __builtin_sub_overflow (x,
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
The text about rotation in tree.def is not entirely clear, but the conclusion
in PR108440 is that it has the same restriction as shift: it is undefined
behavior to rotate more
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
The VRP pass is introducing new signed integer overflow when compiling the
following function for X86_64 with -O3:
int
f4 (int x
: target
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
The following function returns 0x5fff9ffa instead of the expected
0x4fffaffb0fffefff when compiled as
riscv64-unknown-linux-gnu-gcc -O2 -march=rv64gc_zba bug.c
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
The following test fails when compiled as
riscv64-unknown-linux-gnu-gcc -O2 -march=rv64gc bug.c
#include
int8_t x, y, result;
__attribute__ ((noipa)) void
foo ()
{
int8_t minus
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
The vectorizer creates IR that I believe is invalid for the function:
```
void
zz (int x9, short int gt)
{
if (0)
{
while (gt < 1)
{
int pz;
t: target
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
The aarch64 compiler compiles the function
int
lx (int oi, int mb)
{
return (oi < mb) < (mb < oi);
}
to
lx:
cmp w0, w1
csetw0, hi
: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
Consider the function below (taken from gcc.dg/tree-ssa/switch-3.c):
int cipher_to_alg(int cipher)
{
switch
-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
GCC is miscompiling the functions in g++.dg/tree-ssa/pr50.C, such as:
typedef int v4si __attribute((__vector_size__(4 * sizeof(int;
v4si f1_(v4si a, v4si b
-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
The function f below returns an incorrect result for INT_MIN when compiled with
-O1 -fwrapv for X86_64:
__attribute__((noipa)) int f(int x) {
int w = (x >= 0 ? x
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
The ifcvt pass may make the code more UB by doing operations on uninitialized
variables, which can be seen by compiling the following (from
gcc.c-torture
: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
The ifcvt pass may make the code more UB, which can be seen by compiling the
following function with -O3 for X86_64:
int a, b, i;
int scaleValueSaturate
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113703
--- Comment #3 from Krister Walfridsson ---
Oops. I messed up the test case... It "works", but the actual values does not
make sense...
The following is better:
int main()
{
long pgsz = sysconf (_SC_PAGESIZE);
void *p = mmap (NULL, pgsz *
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113703
--- Comment #2 from Krister Walfridsson ---
Here is a runtime testcase:
#include
#include
#include
__attribute__((noipa))
void f1 (char *p, uintptr_t i, uintptr_t n)
{
p += i;
do
{
*p = '\0';
p += 1;
i++;
}
w
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
The following function (gcc.dg/tree-ssa/ivopts-lt.c) is miscompiled when
compiled with with -O1 for X86_64:
#include "stdint.h"
void
f1 (char *p, uintptr_t i, uintptr_
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
The test gcc.dg/torture/pr110799.c crashes because of an out of bounds memory
access when compiled with "-O2 -fno-s
-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
The vectorizer introduces new signed overflow in the function below when
compiled with -O3 for x86_64:
__attribute__ ((noinline)) int
liveloop (int start, int n
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
The following function is miscompiled for x86_64 when compiled with
-O3 -march=x86-64-v2
unsigned long
foo (const char *s
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113424
Krister Walfridsson changed:
What|Removed |Added
Resolution|INVALID |FIXED
--- Comment #4 from Krister
-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
The lim pass miscompiles the following C++ program when compiled as -O3 for
x86_64 (note: it works as intended when compiled as a C program)
struct { char elt1; char
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112949
--- Comment #3 from Krister Walfridsson ---
The C program is obviously UB. But the optimization is done on GIMPLE, and it
is not obvious to me that the GIMPLE code is UB -- we have a function called
__builtin_clz that calls an internal function,
: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
The evrp pass generates incorrect ranges for __builtin_clz when it is called
within a function named __builtin_clz. While calling it in this manner seems
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111668
--- Comment #9 from Krister Walfridsson ---
I opened PR 112738 for the issue mentioned in comment 8.
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
The forwprop4 pass introduces an invalid wide Boolean when compiling the
following function with -O3 for X86_64:
int *a, b, c
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
The following function (from gcc.dg/torture/pr68379.c)
int a, b[3], c[3][5];
void
fn1 ()
{
int e;
for (a = 2; a >= 0; a--)
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111668
--- Comment #8 from Krister Walfridsson ---
I still see negation of a wide signed Boolean in the IR for this function. But
now it is forwprop4 that changes
_38 = (signed int) _16;
_43 = -_38;
_66 = () _43;
to
_56 = () _16;
_66 = -_5
: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
The vrp2 pass introduces an invalid wide Boolean when compiling the function
int *a, b, c, d;
void
foo (void)
{
for (; d <= 0; d++)
b &am
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104940
Krister Walfridsson changed:
What|Removed |Added
CC||kristerw at gcc dot gnu.org
-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
The vectorizer changes the order of additions when vectorizing the loop below,
but it is not changing the arithmetic to be unsigned, so it introduces new
signed
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
GCC may generate an internal call to CLZ with 0 when CLZ_DEFINED_VALUE_AT_ZERO
is false, which can be seen with gcc.c-torture
-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
The vectorizer is not removing the original scalar calculations, and they may
overflow after vectorization.
This can be seen with
int a[8];
void foo(void
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106884
--- Comment #6 from Krister Walfridsson ---
One more similar case (that may be the same as comment #3):
int g;
void foo(int a, int b, int c, int d, int e)
{
if ((10 + a) * b)
{
g = (c || (g >> d)) << 1;
}
}
In this case, reass
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110760
--- Comment #3 from Krister Walfridsson ---
(In reply to Andrew Pinski from comment #1)
> I thought we decided that vector types don't apply the overflow rules and
> always just wrap ...
That makes sense. But on the other hand, PR 110495 is a s
-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
Consider the following function from gcc.dg/vect/bb-slp-layout-5.c:
int a[4], b[4], c[4];
void f1()
{
a[0] = b[3] - c[3];
a[1] = b[2] + c[2];
a[2] = b[1] - c[1
-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
The fix for PR 110487 improved the situation, but my tool still finds some
cases where GCC generates invalid values.
One such case can be seen in gcc.c-torture/compile
-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
tree.def says:
The number of MASK elements must be the same with the
number of elements in V0 and V1. The size of the inner type
of the MASK and of the V0 and
-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
The following function (from gcc.dg/tree-ssa/addadd-2.c)
typedef int S __attribute__((vector_size(64)));
void j(S*x){
*x += __INT_MAX__;
*x += __INT_MAX__;
}
is
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
The vrp2 pass generates IR where a may get the value 1 (in
addition to the valid 0 and -1).
This can be seen in gcc.c-torture/compile/pr53410-1.c
int *a, b, c, d;
void
-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
The tree-nrv pass may introduce incorrect CLOBBER(eol) of the form
={v} {CLOBBER(eol)};
return ;
One example of this can be seen by compiling gcc.c-torture
: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
Consider the function
int foo(_Bool v0, unsigned v1, unsigned v2)
{
signed int v5 = v1 >> v2;
unsigned v6 = -v1;
unsigned int v7 = v2 - v0;
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
Consider the function
unsigned char foo(int x)
{
int t = -x;
unsigned char t1 = t;
unsigned char t2 = t;
return t1 + t2;
}
This does not invoke undefined
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108440
--- Comment #4 from Krister Walfridsson ---
I misread the comment -- it describes a possible future improvement (that I
believe is not allowed). But the committed patch seems to be correct.
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106523
--- Comment #8 from Krister Walfridsson ---
This fixed most of the rotate issues my translation validation tool found. I
assume the remaining issues are due to a different (but similar) bug, so I
opened Bug 108440 for those.
But the issue in B
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108440
--- Comment #3 from Krister Walfridsson ---
Hmm. I think this is the "Y equal to B case" from bug 106523. I.e., the bugfix
is not correct...
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108440
--- Comment #2 from Krister Walfridsson ---
No, bug 106523 is a different issue (I have tested with a compiler that has
that fixed).
-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
GCC optimizes shift instructions to rotate in a way that may make
the optimized IR invoke UB for cases where the original did not.
This can be seen in the IR for f5
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106884
--- Comment #3 from Krister Walfridsson ---
A similar case is
int r1, r2;
int foo(int a, int s1, int s2)
{
if (a & (1 << s1))
return r1;
if (a & (1 << s2))
return r1;
return r2;
}
where reassoc2 optimizes this to always shift by
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
When UBSan is used, match.pd disables simplifications that can remove UB. But
two simplifications are missing TYPE_OVERFLOW_SANITIZED checks, making the
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106884
--- Comment #2 from Krister Walfridsson ---
This optimization is invalid if (int)1 << 33 is _not_ undefined behavior in
GIMPLE!
Consider an architecture where (int)1 << 33 evaluates to 0. foo(2, 1, 33)
evaluates to 0 for the original GIMPLE, bu
Component: sanitizer
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
CC: dodji at gcc dot gnu.org, dvyukov at gcc dot gnu.org,
jakub at gcc dot gnu.org, kcc at gcc dot gnu.org, marxin at
gcc dot gnu.org
Target
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
The function foo from gcc.dg/tree-ssa/ssa-ifcombine-1.c can be called
as foo(1, 1, 33) without invoking undefined behavior
int
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
SLSR may generate new signed wrap for cases where the original did not wrap.
This can be seen in the function f from gcc.dg/tree-ssa/slsr-19.c:
int
f (int c, int s)
{
int x1
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
GCC miscompiles the following test at -O1 or higher optimization levels:
#include
__attribute__((noinline)) uint8_t
three_minmax1 (uint8_t xc, uint8_t xm, uint8_t xy
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
The function f7 from testsuite/c-c++-common/rotate-2.c is miscompiled by
forwprop. This can be seen by running the function as
__attribute__((noinline)) unsigned char
f7 (unsigned char
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106513
--- Comment #2 from Krister Walfridsson ---
(In reply to Andreas Schwab from comment #1)
> This subexpression has undefined behaviour: (((int64_t) 0xff) << 56).
I thought that was allowed in GCC as the manual says
(https://gcc.gnu.org/onlinedoc
-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
GCC may incorrectly generate bswap instructions for code not doing a correct
swap. This can be seen by running the function from testsuite/gcc.dg/pr40501.c
as
typedef long
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
Created attachment 44124
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=44124&action=edit
preprocessed sour
Component: rtl-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
Compiling gcc/testsuite/gcc.dg/gomp/pr81768-2.c with "-fwrapv -fopenmp" fails
with an ICE:
> gcc -S -fwrapv -fopenmp pr81768-2.c
during RTL
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
GCC miscompiles gcc/testsuite/gcc.dg/torture/pr57656.c when using -fwrapv
> gcc -fwrapv pr57656.c
> ./a.out
Abort (core dumped)
The problem seems to be exactly the same
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82296
Krister Walfridsson changed:
What|Removed |Added
CC||kristerw at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77480
Krister Walfridsson changed:
What|Removed |Added
Status|UNCONFIRMED |RESOLVED
Resolution|---
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77480
--- Comment #3 from Krister Walfridsson ---
Author: kristerw
Date: Fri Sep 29 21:34:00 2017
New Revision: 253309
URL: https://gcc.gnu.org/viewcvs?rev=253309&root=gcc&view=rev
Log:
2017-09-29 Krister Walfridsson
Backport from mainline
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=39570
--- Comment #14 from Krister Walfridsson ---
Author: kristerw
Date: Fri Sep 29 09:38:08 2017
New Revision: 253283
URL: https://gcc.gnu.org/viewcvs?rev=253283&root=gcc&view=rev
Log:
2017-09-29 Krister Walfridsson
Backport from mainlin
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77480
Krister Walfridsson changed:
What|Removed |Added
CC||kristerw at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80600
Krister Walfridsson changed:
What|Removed |Added
Status|WAITING |RESOLVED
Resolution|---
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80600
--- Comment #12 from Krister Walfridsson ---
Author: kristerw
Date: Thu Sep 28 19:17:51 2017
New Revision: 253263
URL: https://gcc.gnu.org/viewcvs?rev=253263&root=gcc&view=rev
Log:
gcc/ChangeLog:
Backport from mainline
2017-05-1
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=39570
--- Comment #13 from Krister Walfridsson ---
Author: kristerw
Date: Tue Sep 26 21:26:21 2017
New Revision: 253216
URL: https://gcc.gnu.org/viewcvs?rev=253216&root=gcc&view=rev
Log:
2017-09-26 Krister Walfridsson
PR target/39570
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82177
Krister Walfridsson changed:
What|Removed |Added
CC||kristerw at gcc dot gnu.org
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
Created attachment 41831
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=41831&action=edit
The Himeno benchma
: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
Created attachment 41728
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=41728&action=edit
Preprocessed file for run_range()
The range-v3
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80600
--- Comment #11 from Krister Walfridsson ---
Author: kristerw
Date: Sun May 14 22:49:03 2017
New Revision: 248037
URL: https://gcc.gnu.org/viewcvs?rev=248037&root=gcc&view=rev
Log:
PR target/80600 - hidden symbol '__cpu_model' is referenced by D
84 matches
Mail list logo