Joerg Sonnenberger | 529f4ed | 2019-10-13 22:33:46 | [diff] [blame] | 1 | // RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -disable-llvm-optzns -o - %s -O2 | FileCheck %s |
| 2 | // RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -disable-llvm-optzns -o - %s -O0 | FileCheck %s |
Bill Wendling | 2a81f66 | 2018-12-01 08:29:36 | [diff] [blame] | 3 | |
| 4 | int a = 42; |
| 5 | |
Bill Wendling | 2a81f66 | 2018-12-01 08:29:36 | [diff] [blame] | 6 | /* --- Compound literals */ |
| 7 | |
| 8 | struct foo { int x, y; }; |
| 9 | |
| 10 | int y; |
| 11 | struct foo f = (struct foo){ __builtin_constant_p(y), 42 }; |
| 12 | |
| 13 | struct foo test0(int expr) { |
Joerg Sonnenberger | 529f4ed | 2019-10-13 22:33:46 | [diff] [blame] | 14 | // CHECK-LABEL: test0 |
| 15 | // CHECK: call i1 @llvm.is.constant.i32 |
Bill Wendling | 2a81f66 | 2018-12-01 08:29:36 | [diff] [blame] | 16 | struct foo f = (struct foo){ __builtin_constant_p(expr), 42 }; |
| 17 | return f; |
| 18 | } |
| 19 | |
| 20 | /* --- Pointer types */ |
| 21 | |
Bill Wendling | 2a81f66 | 2018-12-01 08:29:36 | [diff] [blame] | 22 | int test1() { |
Joerg Sonnenberger | 529f4ed | 2019-10-13 22:33:46 | [diff] [blame] | 23 | // CHECK-LABEL: test1 |
Bill Wendling | 2a81f66 | 2018-12-01 08:29:36 | [diff] [blame] | 24 | // CHECK: ret i32 0 |
| 25 | return __builtin_constant_p(&a - 13); |
| 26 | } |
| 27 | |
Bill Wendling | 2a81f66 | 2018-12-01 08:29:36 | [diff] [blame] | 28 | /* --- Aggregate types */ |
| 29 | |
| 30 | int b[] = {1, 2, 3}; |
| 31 | |
Joerg Sonnenberger | 529f4ed | 2019-10-13 22:33:46 | [diff] [blame] | 32 | int test2() { |
| 33 | // CHECK-LABEL: test2 |
Bill Wendling | 2a81f66 | 2018-12-01 08:29:36 | [diff] [blame] | 34 | // CHECK: ret i32 0 |
| 35 | return __builtin_constant_p(b); |
| 36 | } |
| 37 | |
Joerg Sonnenberger | 529f4ed | 2019-10-13 22:33:46 | [diff] [blame] | 38 | const char test3_c[] = {1, 2, 3, 0}; |
Bill Wendling | 2a81f66 | 2018-12-01 08:29:36 | [diff] [blame] | 39 | |
Joerg Sonnenberger | 529f4ed | 2019-10-13 22:33:46 | [diff] [blame] | 40 | int test3() { |
| 41 | // CHECK-LABEL: test3 |
Bill Wendling | 2a81f66 | 2018-12-01 08:29:36 | [diff] [blame] | 42 | // CHECK: ret i32 0 |
Joerg Sonnenberger | 529f4ed | 2019-10-13 22:33:46 | [diff] [blame] | 43 | return __builtin_constant_p(test3_c); |
Bill Wendling | 2a81f66 | 2018-12-01 08:29:36 | [diff] [blame] | 44 | } |
| 45 | |
Joerg Sonnenberger | 529f4ed | 2019-10-13 22:33:46 | [diff] [blame] | 46 | inline char test4_i(const char *x) { |
Bill Wendling | 2a81f66 | 2018-12-01 08:29:36 | [diff] [blame] | 47 | return x[1]; |
| 48 | } |
| 49 | |
Joerg Sonnenberger | 529f4ed | 2019-10-13 22:33:46 | [diff] [blame] | 50 | int test4() { |
Fangrui Song | dbc96b5 | 2020-02-03 18:09:39 | [diff] [blame] | 51 | // CHECK: define i32 @test4 |
Bill Wendling | 2a81f66 | 2018-12-01 08:29:36 | [diff] [blame] | 52 | // CHECK: ret i32 0 |
Joerg Sonnenberger | 529f4ed | 2019-10-13 22:33:46 | [diff] [blame] | 53 | return __builtin_constant_p(test4_i(test3_c)); |
Bill Wendling | 2a81f66 | 2018-12-01 08:29:36 | [diff] [blame] | 54 | } |
| 55 | |
| 56 | /* --- Constant global variables */ |
| 57 | |
| 58 | const int c = 42; |
| 59 | |
Joerg Sonnenberger | 529f4ed | 2019-10-13 22:33:46 | [diff] [blame] | 60 | int test5() { |
| 61 | // CHECK-LABEL: test5 |
Bill Wendling | 2a81f66 | 2018-12-01 08:29:36 | [diff] [blame] | 62 | // CHECK: ret i32 1 |
Joerg Sonnenberger | 529f4ed | 2019-10-13 22:33:46 | [diff] [blame] | 63 | return __builtin_constant_p(c); |
Bill Wendling | 2a81f66 | 2018-12-01 08:29:36 | [diff] [blame] | 64 | } |
| 65 | |
| 66 | /* --- Array types */ |
| 67 | |
| 68 | int arr[] = { 1, 2, 3 }; |
| 69 | const int c_arr[] = { 1, 2, 3 }; |
| 70 | |
Joerg Sonnenberger | 529f4ed | 2019-10-13 22:33:46 | [diff] [blame] | 71 | int test6() { |
| 72 | // CHECK-LABEL: test6 |
| 73 | // CHECK: call i1 @llvm.is.constant.i32 |
Bill Wendling | 2a81f66 | 2018-12-01 08:29:36 | [diff] [blame] | 74 | return __builtin_constant_p(arr[2]); |
| 75 | } |
| 76 | |
Joerg Sonnenberger | 529f4ed | 2019-10-13 22:33:46 | [diff] [blame] | 77 | int test7() { |
| 78 | // CHECK-LABEL: test7 |
| 79 | // CHECK: call i1 @llvm.is.constant.i32 |
Bill Wendling | 2a81f66 | 2018-12-01 08:29:36 | [diff] [blame] | 80 | return __builtin_constant_p(c_arr[2]); |
| 81 | } |
| 82 | |
Joerg Sonnenberger | 529f4ed | 2019-10-13 22:33:46 | [diff] [blame] | 83 | int test8() { |
| 84 | // CHECK-LABEL: test8 |
Bill Wendling | 2a81f66 | 2018-12-01 08:29:36 | [diff] [blame] | 85 | // CHECK: ret i32 0 |
| 86 | return __builtin_constant_p(c_arr); |
| 87 | } |
| 88 | |
| 89 | /* --- Function pointers */ |
| 90 | |
Joerg Sonnenberger | 529f4ed | 2019-10-13 22:33:46 | [diff] [blame] | 91 | int test9() { |
| 92 | // CHECK-LABEL: test9 |
Bill Wendling | 2a81f66 | 2018-12-01 08:29:36 | [diff] [blame] | 93 | // CHECK: ret i32 0 |
Joerg Sonnenberger | 529f4ed | 2019-10-13 22:33:46 | [diff] [blame] | 94 | return __builtin_constant_p(&test9); |
Bill Wendling | 2a81f66 | 2018-12-01 08:29:36 | [diff] [blame] | 95 | } |
| 96 | |
Joerg Sonnenberger | 529f4ed | 2019-10-13 22:33:46 | [diff] [blame] | 97 | int test10() { |
| 98 | // CHECK-LABEL: test10 |
Bill Wendling | 2a81f66 | 2018-12-01 08:29:36 | [diff] [blame] | 99 | // CHECK: ret i32 1 |
| 100 | return __builtin_constant_p(&test10 != 0); |
| 101 | } |
| 102 | |
| 103 | typedef unsigned long uintptr_t; |
| 104 | #define assign(p, v) ({ \ |
| 105 | uintptr_t _r_a_p__v = (uintptr_t)(v); \ |
| 106 | if (__builtin_constant_p(v) && _r_a_p__v == (uintptr_t)0) { \ |
| 107 | union { \ |
| 108 | uintptr_t __val; \ |
| 109 | char __c[1]; \ |
| 110 | } __u = { \ |
| 111 | .__val = (uintptr_t)_r_a_p__v \ |
| 112 | }; \ |
| 113 | *(volatile unsigned int*)&p = *(unsigned int*)(__u.__c); \ |
| 114 | __u.__val; \ |
| 115 | } \ |
| 116 | _r_a_p__v; \ |
| 117 | }) |
| 118 | |
| 119 | typedef void fn_p(void); |
| 120 | extern fn_p *dest_p; |
| 121 | |
| 122 | static void src_fn(void) { |
| 123 | } |
| 124 | |
Joerg Sonnenberger | 529f4ed | 2019-10-13 22:33:46 | [diff] [blame] | 125 | void test11() { |
Bill Wendling | 2a81f66 | 2018-12-01 08:29:36 | [diff] [blame] | 126 | assign(dest_p, src_fn); |
| 127 | } |
| 128 | |
Joerg Sonnenberger | 529f4ed | 2019-10-13 22:33:46 | [diff] [blame] | 129 | extern int test12_v; |
Bill Wendling | 2a81f66 | 2018-12-01 08:29:36 | [diff] [blame] | 130 | |
Joerg Sonnenberger | 529f4ed | 2019-10-13 22:33:46 | [diff] [blame] | 131 | struct { const char *t; int a; } test12[] = { |
| 132 | { "tag", __builtin_constant_p(test12_v) && !test12_v ? 1 : 0 } |
Bill Wendling | 2a81f66 | 2018-12-01 08:29:36 | [diff] [blame] | 133 | }; |
| 134 | |
Joerg Sonnenberger | 529f4ed | 2019-10-13 22:33:46 | [diff] [blame] | 135 | extern char test13_v; |
| 136 | struct { int a; } test13 = { __builtin_constant_p(test13_v) }; |
Bill Wendling | aa77513 | 2018-12-18 22:54:03 | [diff] [blame] | 137 | |
Joerg Sonnenberger | 529f4ed | 2019-10-13 22:33:46 | [diff] [blame] | 138 | extern unsigned long long test14_v; |
Bill Wendling | aa77513 | 2018-12-18 22:54:03 | [diff] [blame] | 139 | |
Joerg Sonnenberger | 529f4ed | 2019-10-13 22:33:46 | [diff] [blame] | 140 | void test14() { |
| 141 | // CHECK-LABEL: test14 |
Bill Wendling | aa77513 | 2018-12-18 22:54:03 | [diff] [blame] | 142 | // CHECK: call void asm sideeffect "", {{.*}}(i32 -1) |
Joerg Sonnenberger | 529f4ed | 2019-10-13 22:33:46 | [diff] [blame] | 143 | __asm__ __volatile__("" :: "n"( (__builtin_constant_p(test14_v) || 0) ? 1 : -1)); |
Bill Wendling | aa77513 | 2018-12-18 22:54:03 | [diff] [blame] | 144 | } |
Richard Smith | 31cfb31 | 2019-04-27 02:58:17 | [diff] [blame] | 145 | |
Joerg Sonnenberger | 529f4ed | 2019-10-13 22:33:46 | [diff] [blame] | 146 | int test15_f(); |
Fangrui Song | dbc96b5 | 2020-02-03 18:09:39 | [diff] [blame] | 147 | // CHECK-LABEL: define void @test15 |
Joerg Sonnenberger | 529f4ed | 2019-10-13 22:33:46 | [diff] [blame] | 148 | // CHECK-NOT: call {{.*}}test15_f |
| 149 | void test15() { |
Richard Smith | 31cfb31 | 2019-04-27 02:58:17 | [diff] [blame] | 150 | int a, b; |
Joerg Sonnenberger | 529f4ed | 2019-10-13 22:33:46 | [diff] [blame] | 151 | (void)__builtin_constant_p((a = b, test15_f())); |
Richard Smith | 31cfb31 | 2019-04-27 02:58:17 | [diff] [blame] | 152 | } |