annotate gcc/testsuite/g++.dg/tree-ssa/pr61034.C @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 // { dg-do compile }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2 // { dg-options "-O2 -fdump-tree-fre3 -fdump-tree-optimized -fdelete-null-pointer-checks" }
111
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 #define assume(x) if(!(x))__builtin_unreachable()
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 inline void* operator new(__SIZE_TYPE__ n){ return __builtin_malloc(n); }
kono
parents:
diff changeset
7 inline void operator delete(void *p) { __builtin_free(p); }
kono
parents:
diff changeset
8 // C++14 sized deallocation function
kono
parents:
diff changeset
9 inline void operator delete(void *p, __SIZE_TYPE__) { __builtin_free(p); }
kono
parents:
diff changeset
10 struct O {
kono
parents:
diff changeset
11 double num;
kono
parents:
diff changeset
12 int count;
kono
parents:
diff changeset
13 };
kono
parents:
diff changeset
14 struct I {
kono
parents:
diff changeset
15 O *o;
kono
parents:
diff changeset
16 I(double d = 0) : o (new O) { o->num = d; o->count = 1; }
kono
parents:
diff changeset
17 I(I const&i) { assume(i.o->count >= 1); o = i.o; ++o->count; }
kono
parents:
diff changeset
18 I& operator=(I const&i) { I(i).swap(*this); return *this; }
kono
parents:
diff changeset
19 ~I() { if (--o->count == 0) delete o; }
kono
parents:
diff changeset
20 void swap(I& i) { O *tmp = o; o = i.o; i.o = tmp; }
kono
parents:
diff changeset
21 I& operator*= (I const&i) {
kono
parents:
diff changeset
22 if (o->count > 1) *this = I(o->num);
kono
parents:
diff changeset
23 o->num *= i.o->num;
kono
parents:
diff changeset
24 return *this;
kono
parents:
diff changeset
25 }
kono
parents:
diff changeset
26 I& operator-= (I const&i) {
kono
parents:
diff changeset
27 if (o->count > 1) *this = I(o->num);
kono
parents:
diff changeset
28 o->num -= i.o->num;
kono
parents:
diff changeset
29 return *this;
kono
parents:
diff changeset
30 }
kono
parents:
diff changeset
31 };
kono
parents:
diff changeset
32 inline I operator* (I a, I const&b) { return a *= b; }
kono
parents:
diff changeset
33 inline I operator- (I a, I const&b) { return a -= b; }
kono
parents:
diff changeset
34 inline bool operator< (I const&a, I const&b) { return a.o->num < b.o->num; }
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 bool f(I a, I b, I c, I d) {
kono
parents:
diff changeset
37 I tmp = (a * d - b * c) * (a * b - c * d);
kono
parents:
diff changeset
38 return tmp < 42;
kono
parents:
diff changeset
39 }
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 // We should be able to CSE most references to count and thus remove
kono
parents:
diff changeset
42 // a bunch of conditional free()s and unreachable()s.
kono
parents:
diff changeset
43 // This works only if everything is inlined into 'f'.
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 // { dg-final { scan-tree-dump-times ";; Function" 1 "fre3" } }
kono
parents:
diff changeset
46 // { dg-final { scan-tree-dump-times "unreachable" 11 "fre3" } }
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 // Note that depending on PUSH_ARGS_REVERSED we are presented with
kono
parents:
diff changeset
49 // a different initial CFG and thus the final outcome is different
kono
parents:
diff changeset
50
kono
parents:
diff changeset
51 // { dg-final { scan-tree-dump-times "free" 10 "fre3" { target x86_64-*-* i?86-*-* } } }
kono
parents:
diff changeset
52 // { dg-final { scan-tree-dump-times "free" 14 "fre3" { target aarch64-*-* ia64-*-* arm-*-* hppa*-*-* sparc*-*-* powerpc*-*-* alpha*-*-* } } }
kono
parents:
diff changeset
53 // { dg-final { scan-tree-dump-times "free" 0 "optimized" } }