diff options
Diffstat (limited to 'test/CodeGen')
| -rw-r--r-- | test/CodeGen/atomic-ops.c | 8 | ||||
| -rw-r--r-- | test/CodeGen/avx512f-builtins.c | 6 | ||||
| -rw-r--r-- | test/CodeGen/builtins-ppc-p8vector.c | 166 | ||||
| -rw-r--r-- | test/CodeGen/builtins-ppc-vsx.c | 177 | ||||
| -rw-r--r-- | test/CodeGen/catch-undef-behavior.c | 28 | ||||
| -rw-r--r-- | test/CodeGen/fp16-ops.c | 139 | ||||
| -rw-r--r-- | test/CodeGen/mips-varargs.c | 17 | ||||
| -rw-r--r-- | test/CodeGen/neon-immediate-ubsan.c | 24 | ||||
| -rw-r--r-- | test/CodeGen/pragma-loop.cpp | 191 | ||||
| -rw-r--r-- | test/CodeGen/pragma-unroll.cpp | 99 |
10 files changed, 493 insertions, 362 deletions
diff --git a/test/CodeGen/atomic-ops.c b/test/CodeGen/atomic-ops.c index 733c60eb859c4..13ab5f117f93f 100644 --- a/test/CodeGen/atomic-ops.c +++ b/test/CodeGen/atomic-ops.c @@ -105,6 +105,14 @@ int fi3e(atomic_int *i) { return atomic_fetch_or(i, 1); } +int fi3f(int *i) { + // CHECK-LABEL: @fi3f + // CHECK-NOT: store volatile + // CHECK: atomicrmw or + // CHECK-NOT: {{ or }} + return __atomic_fetch_or(i, (short)1, memory_order_seq_cst); +} + _Bool fi4(_Atomic(int) *i) { // CHECK-LABEL: @fi4( // CHECK: [[PAIR:%[.0-9A-Z_a-z]+]] = cmpxchg i32* [[PTR:%[.0-9A-Z_a-z]+]], i32 [[EXPECTED:%[.0-9A-Z_a-z]+]], i32 [[DESIRED:%[.0-9A-Z_a-z]+]] diff --git a/test/CodeGen/avx512f-builtins.c b/test/CodeGen/avx512f-builtins.c index 2f19f99e4f257..a49a1982bf47c 100644 --- a/test/CodeGen/avx512f-builtins.c +++ b/test/CodeGen/avx512f-builtins.c @@ -8,14 +8,14 @@ __m512d test_mm512_sqrt_pd(__m512d a) { // CHECK-LABEL: @test_mm512_sqrt_pd - // CHECK: @llvm.x86.avx512.sqrt.pd.512 + // CHECK: @llvm.x86.avx512.mask.sqrt.pd.512 return _mm512_sqrt_pd(a); } __m512 test_mm512_sqrt_ps(__m512 a) { // CHECK-LABEL: @test_mm512_sqrt_ps - // CHECK: @llvm.x86.avx512.sqrt.ps.512 + // CHECK: @llvm.x86.avx512.mask.sqrt.ps.512 return _mm512_sqrt_ps(a); } @@ -898,4 +898,4 @@ __m512i test_mm512_mullo_epi32(__m512i __A, __m512i __B) { //CHECK-LABEL: @test_mm512_mullo_epi32 //CHECK: mul <16 x i32> return _mm512_mullo_epi32(__A,__B); -}
\ No newline at end of file +} diff --git a/test/CodeGen/builtins-ppc-p8vector.c b/test/CodeGen/builtins-ppc-p8vector.c index c91686c0ea7cf..f74bbad9daf00 100644 --- a/test/CodeGen/builtins-ppc-p8vector.c +++ b/test/CodeGen/builtins-ppc-p8vector.c @@ -7,22 +7,22 @@ vector int vi = { -1, 2, -3, 4 }; vector unsigned int vui = { 1, 2, 3, 4 }; vector bool int vbi = {0, -1, -1, 0}; vector bool long long vbll = { 1, 0 }; -vector long long vll = { 1, 2 }; +vector signed long long vsll = { 1, 2 }; vector unsigned long long vull = { 1, 2 }; int res_i; vector int res_vi; vector unsigned int res_vui; vector bool int res_vbi; -vector long long res_vll; -vector unsigned long long res_vull; vector bool long long res_vbll; +vector signed long long res_vsll; +vector unsigned long long res_vull; // CHECK-LABEL: define void @test1 void test1() { /* vec_cmpeq */ - res_vbll = vec_cmpeq(vll, vll); + res_vbll = vec_cmpeq(vsll, vsll); // CHECK: @llvm.ppc.altivec.vcmpequd // CHECK-LE: @llvm.ppc.altivec.vcmpequd // CHECK-PPC: error: call to 'vec_cmpeq' is ambiguous @@ -33,7 +33,7 @@ void test1() { // CHECK-PPC: error: call to 'vec_cmpeq' is ambiguous /* vec_cmpgt */ - res_vbll = vec_cmpgt(vll, vll); + res_vbll = vec_cmpgt(vsll, vsll); // CHECK: @llvm.ppc.altivec.vcmpgtsd // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd // CHECK-PPC: error: call to 'vec_cmpgt' is ambiguous @@ -45,12 +45,12 @@ void test1() { /* ----------------------- predicates --------------------------- */ /* vec_all_eq */ - res_i = vec_all_eq(vll, vll); + res_i = vec_all_eq(vsll, vsll); // CHECK: @llvm.ppc.altivec.vcmpequd.p // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p // CHECK-PPC: error: call to 'vec_all_eq' is ambiguous - res_i = vec_all_eq(vll, vbll); + res_i = vec_all_eq(vsll, vbll); // CHECK: @llvm.ppc.altivec.vcmpequd.p // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p // CHECK-PPC: error: call to 'vec_all_eq' is ambiguous @@ -65,7 +65,7 @@ void test1() { // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p // CHECK-PPC: error: call to 'vec_all_eq' is ambiguous - res_i = vec_all_eq(vbll, vll); + res_i = vec_all_eq(vbll, vsll); // CHECK: @llvm.ppc.altivec.vcmpequd.p // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p // CHECK-PPC: error: call to 'vec_all_eq' is ambiguous @@ -81,12 +81,12 @@ void test1() { // CHECK-PPC: error: call to 'vec_all_eq' is ambiguous /* vec_all_ne */ - res_i = vec_all_ne(vll, vll); + res_i = vec_all_ne(vsll, vsll); // CHECK: @llvm.ppc.altivec.vcmpequd.p // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p // CHECK-PPC: error: call to 'vec_all_ne' is ambiguous - res_i = vec_all_ne(vll, vbll); + res_i = vec_all_ne(vsll, vbll); // CHECK: @llvm.ppc.altivec.vcmpequd.p // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p // CHECK-PPC: error: call to 'vec_all_ne' is ambiguous @@ -101,7 +101,7 @@ void test1() { // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p // CHECK-PPC: error: call to 'vec_all_ne' is ambiguous - res_i = vec_all_ne(vbll, vll); + res_i = vec_all_ne(vbll, vsll); // CHECK: @llvm.ppc.altivec.vcmpequd.p // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p // CHECK-PPC: error: call to 'vec_all_ne' is ambiguous @@ -117,12 +117,12 @@ void test1() { // CHECK-PPC: error: call to 'vec_all_ne' is ambiguous /* vec_any_eq */ - res_i = vec_any_eq(vll, vll); + res_i = vec_any_eq(vsll, vsll); // CHECK: @llvm.ppc.altivec.vcmpequd.p // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p // CHECK-PPC: error: call to 'vec_any_eq' is ambiguous - res_i = vec_any_eq(vll, vbll); + res_i = vec_any_eq(vsll, vbll); // CHECK: @llvm.ppc.altivec.vcmpequd.p // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p // CHECK-PPC: error: call to 'vec_any_eq' is ambiguous @@ -137,7 +137,7 @@ void test1() { // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p // CHECK-PPC: error: call to 'vec_any_eq' is ambiguous - res_i = vec_any_eq(vbll, vll); + res_i = vec_any_eq(vbll, vsll); // CHECK: @llvm.ppc.altivec.vcmpequd.p // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p // CHECK-PPC: error: call to 'vec_any_eq' is ambiguous @@ -153,12 +153,12 @@ void test1() { // CHECK-PPC: error: call to 'vec_any_eq' is ambiguous /* vec_any_ne */ - res_i = vec_any_ne(vll, vll); + res_i = vec_any_ne(vsll, vsll); // CHECK: @llvm.ppc.altivec.vcmpequd.p // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p // CHECK-PPC: error: call to 'vec_any_ne' is ambiguous - res_i = vec_any_ne(vll, vbll); + res_i = vec_any_ne(vsll, vbll); // CHECK: @llvm.ppc.altivec.vcmpequd.p // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p // CHECK-PPC: error: call to 'vec_any_ne' is ambiguous @@ -173,7 +173,7 @@ void test1() { // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p // CHECK-PPC: error: call to 'vec_any_ne' is ambiguous - res_i = vec_any_ne(vbll, vll); + res_i = vec_any_ne(vbll, vsll); // CHECK: @llvm.ppc.altivec.vcmpequd.p // CHECK-LE: @llvm.ppc.altivec.vcmpequd.p // CHECK-PPC: error: call to 'vec_any_ne' is ambiguous @@ -189,12 +189,12 @@ void test1() { // CHECK-PPC: error: call to 'vec_any_ne' is ambiguous /* vec_all_ge */ - res_i = vec_all_ge(vll, vll); + res_i = vec_all_ge(vsll, vsll); // CHECK: @llvm.ppc.altivec.vcmpgtsd.p // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p // CHECK-PPC: error: call to 'vec_all_ge' is ambiguous - res_i = vec_all_ge(vll, vbll); + res_i = vec_all_ge(vsll, vbll); // CHECK: @llvm.ppc.altivec.vcmpgtsd.p // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p // CHECK-PPC: error: call to 'vec_all_ge' is ambiguous @@ -209,7 +209,7 @@ void test1() { // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p // CHECK-PPC: error: call to 'vec_all_ge' is ambiguous - res_i = vec_all_ge(vbll, vll); + res_i = vec_all_ge(vbll, vsll); // CHECK: @llvm.ppc.altivec.vcmpgtud.p // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p // CHECK-PPC: error: call to 'vec_all_ge' is ambiguous @@ -225,12 +225,12 @@ void test1() { // CHECK-PPC: error: call to 'vec_all_ge' is ambiguous /* vec_all_gt */ - res_i = vec_all_gt(vll, vll); + res_i = vec_all_gt(vsll, vsll); // CHECK: @llvm.ppc.altivec.vcmpgtsd.p // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p // CHECK-PPC: error: call to 'vec_all_gt' is ambiguous - res_i = vec_all_gt(vll, vbll); + res_i = vec_all_gt(vsll, vbll); // CHECK: @llvm.ppc.altivec.vcmpgtsd.p // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p // CHECK-PPC: error: call to 'vec_all_gt' is ambiguous @@ -245,7 +245,7 @@ void test1() { // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p // CHECK-PPC: error: call to 'vec_all_gt' is ambiguous - res_i = vec_all_gt(vbll, vll); + res_i = vec_all_gt(vbll, vsll); // CHECK: @llvm.ppc.altivec.vcmpgtud.p // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p // CHECK-PPC: error: call to 'vec_all_gt' is ambiguous @@ -261,12 +261,12 @@ void test1() { // CHECK-PPC: error: call to 'vec_all_gt' is ambiguous /* vec_all_le */ - res_i = vec_all_le(vll, vll); + res_i = vec_all_le(vsll, vsll); // CHECK: @llvm.ppc.altivec.vcmpgtsd.p // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p // CHECK-PPC: error: call to 'vec_all_le' is ambiguous - res_i = vec_all_le(vll, vbll); + res_i = vec_all_le(vsll, vbll); // CHECK: @llvm.ppc.altivec.vcmpgtsd.p // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p // CHECK-PPC: error: call to 'vec_all_le' is ambiguous @@ -281,7 +281,7 @@ void test1() { // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p // CHECK-PPC: error: call to 'vec_all_le' is ambiguous - res_i = vec_all_le(vbll, vll); + res_i = vec_all_le(vbll, vsll); // CHECK: @llvm.ppc.altivec.vcmpgtud.p // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p // CHECK-PPC: error: call to 'vec_all_le' is ambiguous @@ -297,12 +297,12 @@ void test1() { // CHECK-PPC: error: call to 'vec_all_le' is ambiguous /* vec_all_lt */ - res_i = vec_all_lt(vll, vll); + res_i = vec_all_lt(vsll, vsll); // CHECK: @llvm.ppc.altivec.vcmpgtsd.p // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p // CHECK-PPC: error: call to 'vec_all_lt' is ambiguous - res_i = vec_all_lt(vll, vbll); + res_i = vec_all_lt(vsll, vbll); // CHECK: @llvm.ppc.altivec.vcmpgtsd.p // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p // CHECK-PPC: error: call to 'vec_all_lt' is ambiguous @@ -317,7 +317,7 @@ void test1() { // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p // CHECK-PPC: error: call to 'vec_all_lt' is ambiguous - res_i = vec_all_lt(vbll, vll); + res_i = vec_all_lt(vbll, vsll); // CHECK: @llvm.ppc.altivec.vcmpgtud.p // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p // CHECK-PPC: error: call to 'vec_all_lt' is ambiguous @@ -333,12 +333,12 @@ void test1() { // CHECK-PPC: error: call to 'vec_all_lt' is ambiguous /* vec_any_ge */ - res_i = vec_any_ge(vll, vll); + res_i = vec_any_ge(vsll, vsll); // CHECK: @llvm.ppc.altivec.vcmpgtsd.p // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p // CHECK-PPC: error: call to 'vec_any_ge' is ambiguous - res_i = vec_any_ge(vll, vbll); + res_i = vec_any_ge(vsll, vbll); // CHECK: @llvm.ppc.altivec.vcmpgtsd.p // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p // CHECK-PPC: error: call to 'vec_any_ge' is ambiguous @@ -353,7 +353,7 @@ void test1() { // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p // CHECK-PPC: error: call to 'vec_any_ge' is ambiguous - res_i = vec_any_ge(vbll, vll); + res_i = vec_any_ge(vbll, vsll); // CHECK: @llvm.ppc.altivec.vcmpgtud.p // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p // CHECK-PPC: error: call to 'vec_any_ge' is ambiguous @@ -369,12 +369,12 @@ void test1() { // CHECK-PPC: error: call to 'vec_any_ge' is ambiguous /* vec_any_gt */ - res_i = vec_any_gt(vll, vll); + res_i = vec_any_gt(vsll, vsll); // CHECK: @llvm.ppc.altivec.vcmpgtsd.p // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p // CHECK-PPC: error: call to 'vec_any_gt' is ambiguous - res_i = vec_any_gt(vll, vbll); + res_i = vec_any_gt(vsll, vbll); // CHECK: @llvm.ppc.altivec.vcmpgtsd.p // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p // CHECK-PPC: error: call to 'vec_any_gt' is ambiguous @@ -389,7 +389,7 @@ void test1() { // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p // CHECK-PPC: error: call to 'vec_any_gt' is ambiguous - res_i = vec_any_gt(vbll, vll); + res_i = vec_any_gt(vbll, vsll); // CHECK: @llvm.ppc.altivec.vcmpgtud.p // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p // CHECK-PPC: error: call to 'vec_any_gt' is ambiguous @@ -405,12 +405,12 @@ void test1() { // CHECK-PPC: error: call to 'vec_any_gt' is ambiguous /* vec_any_le */ - res_i = vec_any_le(vll, vll); + res_i = vec_any_le(vsll, vsll); // CHECK: @llvm.ppc.altivec.vcmpgtsd.p // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p // CHECK-PPC: error: call to 'vec_any_le' is ambiguous - res_i = vec_any_le(vll, vbll); + res_i = vec_any_le(vsll, vbll); // CHECK: @llvm.ppc.altivec.vcmpgtsd.p // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p // CHECK-PPC: error: call to 'vec_any_le' is ambiguous @@ -425,7 +425,7 @@ void test1() { // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p // CHECK-PPC: error: call to 'vec_any_le' is ambiguous - res_i = vec_any_le(vbll, vll); + res_i = vec_any_le(vbll, vsll); // CHECK: @llvm.ppc.altivec.vcmpgtud.p // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p // CHECK-PPC: error: call to 'vec_any_le' is ambiguous @@ -441,12 +441,12 @@ void test1() { // CHECK-PPC: error: call to 'vec_any_le' is ambiguous /* vec_any_lt */ - res_i = vec_any_lt(vll, vll); + res_i = vec_any_lt(vsll, vsll); // CHECK: @llvm.ppc.altivec.vcmpgtsd.p // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p // CHECK-PPC: error: call to 'vec_any_lt' is ambiguous - res_i = vec_any_lt(vll, vbll); + res_i = vec_any_lt(vsll, vbll); // CHECK: @llvm.ppc.altivec.vcmpgtsd.p // CHECK-LE: @llvm.ppc.altivec.vcmpgtsd.p // CHECK-PPC: error: call to 'vec_any_lt' is ambiguous @@ -461,7 +461,7 @@ void test1() { // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p // CHECK-PPC: error: call to 'vec_any_lt' is ambiguous - res_i = vec_any_lt(vbll, vll); + res_i = vec_any_lt(vbll, vsll); // CHECK: @llvm.ppc.altivec.vcmpgtud.p // CHECK-LE: @llvm.ppc.altivec.vcmpgtud.p // CHECK-PPC: error: call to 'vec_any_lt' is ambiguous @@ -477,17 +477,17 @@ void test1() { // CHECK-PPC: error: call to 'vec_any_lt' is ambiguous /* vec_max */ - res_vll = vec_max(vll, vll); + res_vsll = vec_max(vsll, vsll); // CHECK: @llvm.ppc.altivec.vmaxsd // CHECK-LE: @llvm.ppc.altivec.vmaxsd // CHECK-PPC: error: call to 'vec_max' is ambiguous - res_vll = vec_max(vbll, vll); + res_vsll = vec_max(vbll, vsll); // CHECK: @llvm.ppc.altivec.vmaxsd // CHECK-LE: @llvm.ppc.altivec.vmaxsd // CHECK-PPC: error: call to 'vec_max' is ambiguous - res_vll = vec_max(vll, vbll); + res_vsll = vec_max(vsll, vbll); // CHECK: @llvm.ppc.altivec.vmaxsd // CHECK-LE: @llvm.ppc.altivec.vmaxsd // CHECK-PPC: error: call to 'vec_max' is ambiguous @@ -508,17 +508,17 @@ void test1() { // CHECK-PPC: error: call to 'vec_max' is ambiguous /* vec_min */ - res_vll = vec_min(vll, vll); + res_vsll = vec_min(vsll, vsll); // CHECK: @llvm.ppc.altivec.vminsd // CHECK-LE: @llvm.ppc.altivec.vminsd // CHECK-PPC: error: call to 'vec_min' is ambiguous - res_vll = vec_min(vbll, vll); + res_vsll = vec_min(vbll, vsll); // CHECK: @llvm.ppc.altivec.vminsd // CHECK-LE: @llvm.ppc.altivec.vminsd // CHECK-PPC: error: call to 'vec_min' is ambiguous - res_vll = vec_min(vll, vbll); + res_vsll = vec_min(vsll, vbll); // CHECK: @llvm.ppc.altivec.vminsd // CHECK-LE: @llvm.ppc.altivec.vminsd // CHECK-PPC: error: call to 'vec_min' is ambiguous @@ -539,7 +539,7 @@ void test1() { // CHECK-PPC: error: call to 'vec_min' is ambiguous /* vec_mule */ - res_vll = vec_mule(vi, vi); + res_vsll = vec_mule(vi, vi); // CHECK: @llvm.ppc.altivec.vmulesw // CHECK-LE: @llvm.ppc.altivec.vmulosw // CHECK-PPC: error: call to 'vec_mule' is ambiguous @@ -550,7 +550,7 @@ void test1() { // CHECK-PPC: error: call to 'vec_mule' is ambiguous /* vec_mulo */ - res_vll = vec_mulo(vi, vi); + res_vsll = vec_mulo(vi, vi); // CHECK: @llvm.ppc.altivec.vmulosw // CHECK-LE: @llvm.ppc.altivec.vmulesw // CHECK-PPC: error: call to 'vec_mulo' is ambiguous @@ -561,7 +561,7 @@ void test1() { // CHECK-PPC: error: call to 'vec_mulo' is ambiguous /* vec_packs */ - res_vi = vec_packs(vll, vll); + res_vi = vec_packs(vsll, vsll); // CHECK: @llvm.ppc.altivec.vpksdss // CHECK-LE: @llvm.ppc.altivec.vpksdss // CHECK-PPC: error: call to 'vec_packs' is ambiguous @@ -572,7 +572,7 @@ void test1() { // CHECK-PPC: error: call to 'vec_packs' is ambiguous /* vec_packsu */ - res_vui = vec_packsu(vll, vll); + res_vui = vec_packsu(vsll, vsll); // CHECK: @llvm.ppc.altivec.vpksdus // CHECK-LE: @llvm.ppc.altivec.vpksdus // CHECK-PPC: error: call to 'vec_packsu' is ambiguous @@ -583,7 +583,7 @@ void test1() { // CHECK-PPC: error: call to 'vec_packsu' is ambiguous /* vec_rl */ - res_vll = vec_rl(vll, vull); + res_vsll = vec_rl(vsll, vull); // CHECK: @llvm.ppc.altivec.vrld // CHECK-LE: @llvm.ppc.altivec.vrld // CHECK-PPC: error: call to 'vec_rl' is ambiguous @@ -594,7 +594,7 @@ void test1() { // CHECK-PPC: error: call to 'vec_rl' is ambiguous /* vec_sl */ - res_vll = vec_sl(vll, vull); + res_vsll = vec_sl(vsll, vull); // CHECK: shl <2 x i64> // CHECK-LE: shl <2 x i64> // CHECK-PPC: error: call to 'vec_sl' is ambiguous @@ -605,7 +605,7 @@ void test1() { // CHECK-PPC: error: call to 'vec_sl' is ambiguous /* vec_sr */ - res_vll = vec_sr(vll, vull); + res_vsll = vec_sr(vsll, vull); // CHECK: ashr <2 x i64> // CHECK-LE: ashr <2 x i64> // CHECK-PPC: error: call to 'vec_sr' is ambiguous @@ -616,7 +616,7 @@ void test1() { // CHECK-PPC: error: call to 'vec_sr' is ambiguous /* vec_sra */ - res_vll = vec_sra(vll, vull); + res_vsll = vec_sra(vsll, vull); // CHECK: ashr <2 x i64> // CHECK-LE: ashr <2 x i64> // CHECK-PPC: error: call to 'vec_sra' is ambiguous @@ -627,7 +627,7 @@ void test1() { // CHECK-PPC: error: call to 'vec_sra' is ambiguous /* vec_unpackh */ - res_vll = vec_unpackh(vi); + res_vsll = vec_unpackh(vi); // CHECK: llvm.ppc.altivec.vupkhsw // CHECK-LE: llvm.ppc.altivec.vupklsw // CHECK-PPC: error: call to 'vec_unpackh' is ambiguous @@ -638,7 +638,7 @@ void test1() { // CHECK-PPC: error: call to 'vec_unpackh' is ambiguous /* vec_unpackl */ - res_vll = vec_unpackl(vi); + res_vsll = vec_unpackl(vi); // CHECK: llvm.ppc.altivec.vupklsw // CHECK-LE: llvm.ppc.altivec.vupkhsw // CHECK-PPC: error: call to 'vec_unpackl' is ambiguous @@ -649,19 +649,19 @@ void test1() { // CHECK-PPC: error: call to 'vec_unpackl' is ambiguous /* vec_vpksdss */ - res_vi = vec_vpksdss(vll, vll); + res_vi = vec_vpksdss(vsll, vsll); // CHECK: llvm.ppc.altivec.vpksdss // CHECK-LE: llvm.ppc.altivec.vpksdss // CHECK-PPC: warning: implicit declaration of function 'vec_vpksdss' /* vec_vpksdus */ - res_vui = vec_vpksdus(vll, vll); + res_vui = vec_vpksdus(vsll, vsll); // CHECK: llvm.ppc.altivec.vpksdus // CHECK-LE: llvm.ppc.altivec.vpksdus // CHECK-PPC: warning: implicit declaration of function 'vec_vpksdus' /* vec_vpkudum */ - res_vi = vec_vpkudum(vll, vll); + res_vi = vec_vpkudum(vsll, vsll); // CHECK: vperm // CHECK-LE: vperm // CHECK-PPC: warning: implicit declaration of function 'vec_vpkudum' @@ -676,7 +676,7 @@ void test1() { // CHECK-PPC: warning: implicit declaration of function 'vec_vpkudus' /* vec_vupkhsw */ - res_vll = vec_vupkhsw(vi); + res_vsll = vec_vupkhsw(vi); // CHECK: llvm.ppc.altivec.vupkhsw // CHECK-LE: llvm.ppc.altivec.vupklsw // CHECK-PPC: warning: implicit declaration of function 'vec_vupkhsw' @@ -686,7 +686,7 @@ void test1() { // CHECK-LE: llvm.ppc.altivec.vupklsw /* vec_vupklsw */ - res_vll = vec_vupklsw(vi); + res_vsll = vec_vupklsw(vi); // CHECK: llvm.ppc.altivec.vupklsw // CHECK-LE: llvm.ppc.altivec.vupkhsw // CHECK-PPC: warning: implicit declaration of function 'vec_vupklsw' @@ -695,4 +695,46 @@ void test1() { // CHECK: llvm.ppc.altivec.vupklsw // CHECK-LE: llvm.ppc.altivec.vupkhsw + /* vec_max */ + res_vsll = vec_max(vsll, vsll); +// CHECK: @llvm.ppc.altivec.vmaxsd +// CHECK-LE: @llvm.ppc.altivec.vmaxsd + + res_vsll = vec_max(vbll, vsll); +// CHECK: @llvm.ppc.altivec.vmaxsd +// CHECK-LE: @llvm.ppc.altivec.vmaxsd + + res_vsll = vec_max(vsll, vbll); +// CHECK: @llvm.ppc.altivec.vmaxsd +// CHECK-LE: @llvm.ppc.altivec.vmaxsd + + res_vull = vec_max(vull, vull); +// CHECK: @llvm.ppc.altivec.vmaxud +// CHECK-LE: @llvm.ppc.altivec.vmaxud + + res_vull = vec_max(vbll, vull); +// CHECK: @llvm.ppc.altivec.vmaxud +// CHECK-LE: @llvm.ppc.altivec.vmaxud + + /* vec_min */ + res_vsll = vec_min(vsll, vsll); +// CHECK: @llvm.ppc.altivec.vminsd +// CHECK-LE: @llvm.ppc.altivec.vminsd + + res_vsll = vec_min(vbll, vsll); +// CHECK: @llvm.ppc.altivec.vminsd +// CHECK-LE: @llvm.ppc.altivec.vminsd + + res_vsll = vec_min(vsll, vbll); +// CHECK: @llvm.ppc.altivec.vminsd +// CHECK-LE: @llvm.ppc.altivec.vminsd + + res_vull = vec_min(vull, vull); +// CHECK: @llvm.ppc.altivec.vminud +// CHECK-LE: @llvm.ppc.altivec.vminud + + res_vull = vec_min(vbll, vull); +// CHECK: @llvm.ppc.altivec.vminud +// CHECK-LE: @llvm.ppc.altivec.vminud + } diff --git a/test/CodeGen/builtins-ppc-vsx.c b/test/CodeGen/builtins-ppc-vsx.c index 58a8cc32dce30..631cb6ccafbed 100644 --- a/test/CodeGen/builtins-ppc-vsx.c +++ b/test/CodeGen/builtins-ppc-vsx.c @@ -7,6 +7,7 @@ vector float vf = { -1.5, 2.5, -3.5, 4.5 }; vector double vd = { 3.5, -7.5 }; vector signed int vsi = { -1, 2, -3, 4 }; vector unsigned int vui = { 0, 1, 2, 3 }; +vector bool long long vbll = { 1, 0 }; vector signed long long vsll = { 255LL, -937LL }; vector unsigned long long vull = { 1447LL, 2894LL }; double d = 23.4; @@ -15,6 +16,7 @@ vector float res_vf; vector double res_vd; vector signed int res_vsi; vector unsigned int res_vui; +vector bool long long res_vbll; vector signed long long res_vsll; vector unsigned long long res_vull; double res_d; @@ -113,4 +115,179 @@ void test1() { vec_vsx_st(vd, 0, &res_vd); // CHECK: @llvm.ppc.vsx.stxvd2x + + /* vec_and */ + res_vsll = vec_and(vsll, vsll); +// CHECK: and <2 x i64> + + res_vsll = vec_and(vbll, vsll); +// CHECK: and <2 x i64> + + res_vsll = vec_and(vsll, vbll); +// CHECK: and <2 x i64> + + res_vull = vec_and(vull, vull); +// CHECK: and <2 x i64> + + res_vull = vec_and(vbll, vull); +// CHECK: and <2 x i64> + + res_vull = vec_and(vull, vbll); +// CHECK: and <2 x i64> + + res_vbll = vec_and(vbll, vbll); +// CHECK: and <2 x i64> + + /* vec_vand */ + res_vsll = vec_vand(vsll, vsll); +// CHECK: and <2 x i64> + + res_vsll = vec_vand(vbll, vsll); +// CHECK: and <2 x i64> + + res_vsll = vec_vand(vsll, vbll); +// CHECK: and <2 x i64> + + res_vull = vec_vand(vull, vull); +// CHECK: and <2 x i64> + + res_vull = vec_vand(vbll, vull); +// CHECK: and <2 x i64> + + res_vull = vec_vand(vull, vbll); +// CHECK: and <2 x i64> + + res_vbll = vec_vand(vbll, vbll); +// CHECK: and <2 x i64> + + /* vec_andc */ + res_vsll = vec_andc(vsll, vsll); +// CHECK: xor <2 x i64> +// CHECK: and <2 x i64> + + res_vsll = vec_andc(vbll, vsll); +// CHECK: xor <2 x i64> +// CHECK: and <2 x i64> + + res_vsll = vec_andc(vsll, vbll); +// CHECK: xor <2 x i64> +// CHECK: and <2 x i64> + + res_vull = vec_andc(vull, vull); +// CHECK: xor <2 x i64> +// CHECK: and <2 x i64> + + res_vull = vec_andc(vbll, vull); +// CHECK: xor <2 x i64> +// CHECK: and <2 x i64> + + res_vull = vec_andc(vull, vbll); +// CHECK: xor <2 x i64> +// CHECK: and <2 x i64> + + res_vbll = vec_andc(vbll, vbll); +// CHECK: xor <2 x i64> +// CHECK: and <2 x i64> + + /* vec_nor */ + res_vsll = vec_nor(vsll, vsll); +// CHECK: or <2 x i64> +// CHECK: xor <2 x i64> + + res_vull = vec_nor(vull, vull); +// CHECK: or <2 x i64> +// CHECK: xor <2 x i64> + + res_vull = vec_nor(vbll, vbll); +// CHECK: or <2 x i64> +// CHECK: xor <2 x i64> + + /* vec_or */ + res_vsll = vec_or(vsll, vsll); +// CHECK: or <2 x i64> + + res_vsll = vec_or(vbll, vsll); +// CHECK: or <2 x i64> + + res_vsll = vec_or(vsll, vbll); +// CHECK: or <2 x i64> + + res_vull = vec_or(vull, vull); +// CHECK: or <2 x i64> + + res_vull = vec_or(vbll, vull); +// CHECK: or <2 x i64> + + res_vull = vec_or(vull, vbll); +// CHECK: or <2 x i64> + + res_vbll = vec_or(vbll, vbll); +// CHECK: or <2 x i64> + + /* vec_vor */ + res_vsll = vec_vor(vsll, vsll); +// CHECK: or <2 x i64> + + res_vsll = vec_vor(vbll, vsll); +// CHECK: or <2 x i64> + + res_vsll = vec_vor(vsll, vbll); +// CHECK: or <2 x i64> + + res_vull = vec_vor(vull, vull); +// CHECK: or <2 x i64> + + res_vull = vec_vor(vbll, vull); +// CHECK: or <2 x i64> + + res_vull = vec_vor(vull, vbll); +// CHECK: or <2 x i64> + + res_vbll = vec_vor(vbll, vbll); +// CHECK: or <2 x i64> + + /* vec_xor */ + res_vsll = vec_xor(vsll, vsll); +// CHECK: xor <2 x i64> + + res_vsll = vec_xor(vbll, vsll); +// CHECK: xor <2 x i64> + + res_vsll = vec_xor(vsll, vbll); +// CHECK: xor <2 x i64> + + res_vull = vec_xor(vull, vull); +// CHECK: xor <2 x i64> + + res_vull = vec_xor(vbll, vull); +// CHECK: xor <2 x i64> + + res_vull = vec_xor(vull, vbll); +// CHECK: xor <2 x i64> + + res_vbll = vec_xor(vbll, vbll); +// CHECK: xor <2 x i64> + + /* vec_vxor */ + res_vsll = vec_vxor(vsll, vsll); +// CHECK: xor <2 x i64> + + res_vsll = vec_vxor(vbll, vsll); +// CHECK: xor <2 x i64> + + res_vsll = vec_vxor(vsll, vbll); +// CHECK: xor <2 x i64> + + res_vull = vec_vxor(vull, vull); +// CHECK: xor <2 x i64> + + res_vull = vec_vxor(vbll, vull); +// CHECK: xor <2 x i64> + + res_vull = vec_vxor(vull, vbll); +// CHECK: xor <2 x i64> + + res_vbll = vec_vxor(vbll, vbll); +// CHECK: xor <2 x i64> + } diff --git a/test/CodeGen/catch-undef-behavior.c b/test/CodeGen/catch-undef-behavior.c index a4386588757d1..66954190aff7a 100644 --- a/test/CodeGen/catch-undef-behavior.c +++ b/test/CodeGen/catch-undef-behavior.c @@ -371,6 +371,34 @@ void call_decl_nonnull(int *a) { decl_nonnull(a); } +extern void *memcpy (void *, const void *, unsigned) __attribute__((nonnull(1, 2))); + +// CHECK-COMMON-LABEL: @call_memcpy_nonnull +void call_memcpy_nonnull(void *p, void *q, int sz) { + // CHECK-COMMON: icmp ne i8* {{.*}}, null + // CHECK-UBSAN: call void @__ubsan_handle_nonnull_arg + // CHECK-TRAP: call void @llvm.trap() + + // CHECK-COMMON: icmp ne i8* {{.*}}, null + // CHECK-UBSAN: call void @__ubsan_handle_nonnull_arg + // CHECK-TRAP: call void @llvm.trap() + memcpy(p, q, sz); +} + +extern void *memmove (void *, const void *, unsigned) __attribute__((nonnull(1, 2))); + +// CHECK-COMMON-LABEL: @call_memmove_nonnull +void call_memmove_nonnull(void *p, void *q, int sz) { + // CHECK-COMMON: icmp ne i8* {{.*}}, null + // CHECK-UBSAN: call void @__ubsan_handle_nonnull_arg + // CHECK-TRAP: call void @llvm.trap() + + // CHECK-COMMON: icmp ne i8* {{.*}}, null + // CHECK-UBSAN: call void @__ubsan_handle_nonnull_arg + // CHECK-TRAP: call void @llvm.trap() + memmove(p, q, sz); +} + // CHECK-COMMON-LABEL: @call_nonnull_variadic __attribute__((nonnull)) void nonnull_variadic(int a, ...); void call_nonnull_variadic(int a, int *b) { diff --git a/test/CodeGen/fp16-ops.c b/test/CodeGen/fp16-ops.c index fe0fa2c2667ed..7cd08a03d6420 100644 --- a/test/CodeGen/fp16-ops.c +++ b/test/CodeGen/fp16-ops.c @@ -10,6 +10,7 @@ typedef unsigned cond_t; volatile cond_t test; +volatile int i0; volatile __fp16 h0 = 0.0, h1 = 1.0, h2; volatile float f0, f1, f2; volatile double d0; @@ -91,6 +92,11 @@ void foo(void) { // NATIVE-HALF: fpext half // NATIVE-HALF: fmul float h1 = f0 * h2; + // CHECK: [[F16TOF32]] + // CHECK: fmul float + // CHECK: [[F32TOF16]] + // NATIVE-HALF: fmul half + h1 = h0 * i0; // CHECK: [[F16TOF32]] // CHECK: [[F16TOF32]] @@ -116,6 +122,11 @@ void foo(void) { // NATIVE-HALF: fpext half // NATIVE-HALF: fdiv float h1 = (f0 / h2); + // CHECK: [[F16TOF32]] + // CHECK: fdiv float + // CHECK: [[F32TOF16]] + // NATIVE-HALF: fdiv half + h1 = (h0 / i0); // CHECK: [[F16TOF32]] // CHECK: [[F16TOF32]] @@ -141,6 +152,11 @@ void foo(void) { // NATIVE-HALF: fpext half // NATIVE-HALF: fadd float h1 = (f2 + h0); + // CHECK: [[F16TOF32]] + // CHECK: fadd float + // CHECK: [[F32TOF16]] + // NATIVE-HALF: fadd half + h1 = (h0 + i0); // CHECK: [[F16TOF32]] // CHECK: [[F16TOF32]] @@ -166,6 +182,11 @@ void foo(void) { // NATIVE-HALF: fpext half // NATIVE-HALF: fsub float h1 = (f2 - h0); + // CHECK: [[F16TOF32]] + // CHECK: fsub float + // CHECK: [[F32TOF16]] + // NATIVE-HALF: fsub half + h1 = (h0 - i0); // CHECK: [[F16TOF32]] // CHECK: [[F16TOF32]] @@ -187,6 +208,14 @@ void foo(void) { // NATIVE-HALF: fpext half // NATIVE-HALF: fcmp olt float test = (f2 < h0); + // CHECK: [[F16TOF32]] + // CHECK: fcmp olt float + // NATIVE-HALF: fcmp olt half + test = (i0 < h0); + // CHECK: [[F16TOF32]] + // CHECK: fcmp olt float + // NATIVE-HALF: fcmp olt half + test = (h0 < i0); // CHECK: [[F16TOF32]] // CHECK: [[F16TOF32]] @@ -208,6 +237,14 @@ void foo(void) { // NATIVE-HALF: fpext half // NATIVE-HALF: fcmp ogt float test = (f0 > h2); + // CHECK: [[F16TOF32]] + // CHECK: fcmp ogt float + // NATIVE-HALF: fcmp ogt half + test = (i0 > h0); + // CHECK: [[F16TOF32]] + // CHECK: fcmp ogt float + // NATIVE-HALF: fcmp ogt half + test = (h0 > i0); // CHECK: [[F16TOF32]] // CHECK: [[F16TOF32]] @@ -229,6 +266,15 @@ void foo(void) { // NATIVE-HALF: fpext half // NATIVE-HALF: fcmp ole float test = (f2 <= h0); + // CHECK: [[F16TOF32]] + // CHECK: fcmp ole float + // NATIVE-HALF: fcmp ole half + test = (i0 <= h0); + // CHECK: [[F16TOF32]] + // CHECK: fcmp ole float + // NATIVE-HALF: fcmp ole half + test = (h0 <= i0); + // CHECK: [[F16TOF32]] // CHECK: [[F16TOF32]] @@ -250,6 +296,14 @@ void foo(void) { // NATIVE-HALF: fpext half // NATIVE-HALF: fcmp oge float test = (f0 >= h2); + // CHECK: [[F16TOF32]] + // CHECK: fcmp oge float + // NATIVE-HALF: fcmp oge half + test = (i0 >= h0); + // CHECK: [[F16TOF32]] + // CHECK: fcmp oge float + // NATIVE-HALF: fcmp oge half + test = (h0 >= i0); // CHECK: [[F16TOF32]] // CHECK: [[F16TOF32]] @@ -271,6 +325,14 @@ void foo(void) { // NATIVE-HALF: fpext half // NATIVE-HALF: fcmp oeq float test = (f1 == h1); + // CHECK: [[F16TOF32]] + // CHECK: fcmp oeq float + // NATIVE-HALF: fcmp oeq half + test = (i0 == h0); + // CHECK: [[F16TOF32]] + // CHECK: fcmp oeq float + // NATIVE-HALF: fcmp oeq half + test = (h0 == i0); // CHECK: [[F16TOF32]] // CHECK: [[F16TOF32]] @@ -292,6 +354,14 @@ void foo(void) { // NATIVE-HALF: fpext half // NATIVE-HALF: fcmp une float test = (f1 != h1); + // CHECK: [[F16TOF32]] + // CHECK: fcmp une float + // NATIVE-HALF: fcmp une half + test = (i0 != h0); + // CHECK: [[F16TOF32]] + // CHECK: fcmp une float + // NATIVE-HALF: fcmp une half + test = (h0 != i0); // CHECK: [[F16TOF32]] // CHECK: fcmp une float @@ -310,6 +380,15 @@ void foo(void) { // NATIVE-HALF: fptrunc float h0 = f0; + // CHECK: sitofp i32 {{.*}} to float + // CHECK: [[F32TOF16]] + // NATIVE-HALF: sitofp i32 {{.*}} to half + h0 = i0; + // CHECK: [[F16TOF32]] + // CHECK: fptosi float {{.*}} to i32 + // NATIVE-HALF: fptosi half {{.*}} to i32 + i0 = h0; + // CHECK: [[F16TOF32]] // CHECK: [[F16TOF32]] // CHECK: fadd float @@ -329,6 +408,21 @@ void foo(void) { // NATIVE-HALF: fadd float // NATIVE-HALF: fptrunc float h0 += f2; + // CHECK: [[F16TOF32]] + // CHECK: sitofp i32 {{.*}} to float + // CHECK: fadd float + // CHECK: fptosi float {{.*}} to i32 + // NATIVE-HALF: sitofp i32 {{.*}} to half + // NATIVE-HALF: fadd half + // NATIVE-HALF: fptosi half {{.*}} to i32 + i0 += h0; + // CHECK: sitofp i32 {{.*}} to float + // CHECK: [[F16TOF32]] + // CHECK: fadd float + // CHECK: [[F32TOF16]] + // NATIVE-HALF: sitofp i32 {{.*}} to half + // NATIVE-HALF: fadd half + h0 += i0; // CHECK: [[F16TOF32]] // CHECK: [[F16TOF32]] @@ -349,6 +443,21 @@ void foo(void) { // NATIVE-HALF: fsub float // NATIVE-HALF: fptrunc float h0 -= f2; + // CHECK: [[F16TOF32]] + // CHECK: sitofp i32 {{.*}} to float + // CHECK: fsub float + // CHECK: fptosi float {{.*}} to i32 + // NATIVE-HALF: sitofp i32 {{.*}} to half + // NATIVE-HALF: fsub half + // NATIVE-HALF: fptosi half {{.*}} to i32 + i0 -= h0; + // CHECK: sitofp i32 {{.*}} to float + // CHECK: [[F16TOF32]] + // CHECK: fsub float + // CHECK: [[F32TOF16]] + // NATIVE-HALF: sitofp i32 {{.*}} to half + // NATIVE-HALF: fsub half + h0 -= i0; // CHECK: [[F16TOF32]] // CHECK: [[F16TOF32]] @@ -369,6 +478,21 @@ void foo(void) { // NATIVE-HALF: fmul float // NATIVE-HALF: fptrunc float h0 *= f2; + // CHECK: [[F16TOF32]] + // CHECK: sitofp i32 {{.*}} to float + // CHECK: fmul float + // CHECK: fptosi float {{.*}} to i32 + // NATIVE-HALF: sitofp i32 {{.*}} to half + // NATIVE-HALF: fmul half + // NATIVE-HALF: fptosi half {{.*}} to i32 + i0 *= h0; + // CHECK: sitofp i32 {{.*}} to float + // CHECK: [[F16TOF32]] + // CHECK: fmul float + // CHECK: [[F32TOF16]] + // NATIVE-HALF: sitofp i32 {{.*}} to half + // NATIVE-HALF: fmul half + h0 *= i0; // CHECK: [[F16TOF32]] // CHECK: [[F16TOF32]] @@ -389,6 +513,21 @@ void foo(void) { // NATIVE-HALF: fdiv float // NATIVE-HALF: fptrunc float h0 /= f2; + // CHECK: [[F16TOF32]] + // CHECK: sitofp i32 {{.*}} to float + // CHECK: fdiv float + // CHECK: fptosi float {{.*}} to i32 + // NATIVE-HALF: sitofp i32 {{.*}} to half + // NATIVE-HALF: fdiv half + // NATIVE-HALF: fptosi half {{.*}} to i32 + i0 /= h0; + // CHECK: sitofp i32 {{.*}} to float + // CHECK: [[F16TOF32]] + // CHECK: fdiv float + // CHECK: [[F32TOF16]] + // NATIVE-HALF: sitofp i32 {{.*}} to half + // NATIVE-HALF: fdiv half + h0 /= i0; // Check conversions to/from double // NOHALF: call i16 @llvm.convert.to.fp16.f64( diff --git a/test/CodeGen/mips-varargs.c b/test/CodeGen/mips-varargs.c index 8fd1df60b728a..891769c711ddc 100644 --- a/test/CodeGen/mips-varargs.c +++ b/test/CodeGen/mips-varargs.c @@ -111,14 +111,14 @@ long long test_i64(char *fmt, ...) { // ALL: [[VA1:%.+]] = bitcast i8** %va to i8* // ALL: call void @llvm.va_start(i8* [[VA1]]) // -// O32: [[AP_CUR:%.+]] = load i8*, i8** %va, align [[PTRALIGN]] +// O32: [[TMP0:%.+]] = bitcast i8** %va to i32* +// O32: [[AP_CUR:%.+]] = load [[INTPTR_T:i32]], i32* [[TMP0]], align [[PTRALIGN]] // NEW: [[TMP0:%.+]] = bitcast i8** %va to i64** // NEW: [[AP_CUR:%.+]] = load i64*, i64** [[TMP0]], align [[PTRALIGN]] // // i64 is 8-byte aligned, while this is within O32's stack alignment there's no // guarantee that the offset is still 8-byte aligned after earlier reads. -// O32: [[PTR0:%.+]] = ptrtoint i8* [[AP_CUR]] to [[INTPTR_T:i32]] -// O32: [[PTR1:%.+]] = add i32 [[PTR0]], 7 +// O32: [[PTR1:%.+]] = add i32 [[AP_CUR]], 7 // O32: [[PTR2:%.+]] = and i32 [[PTR1]], -8 // O32: [[PTR3:%.+]] = inttoptr [[INTPTR_T]] [[PTR2]] to i64* // O32: [[PTR4:%.+]] = inttoptr [[INTPTR_T]] [[PTR2]] to i8* @@ -200,11 +200,14 @@ int test_v4i32(char *fmt, ...) { // ALL: %va = alloca i8*, align [[PTRALIGN]] // ALL: [[VA1:%.+]] = bitcast i8** %va to i8* // ALL: call void @llvm.va_start(i8* [[VA1]]) -// ALL: [[AP_CUR:%.+]] = load i8*, i8** %va, align [[PTRALIGN]] // -// O32: [[PTR0:%.+]] = ptrtoint i8* [[AP_CUR]] to [[INTPTR_T:i32]] -// N32: [[PTR0:%.+]] = ptrtoint i8* [[AP_CUR]] to [[INTPTR_T:i32]] -// N64: [[PTR0:%.+]] = ptrtoint i8* [[AP_CUR]] to [[INTPTR_T:i64]] +// O32: [[TMP0:%.+]] = bitcast i8** %va to i32* +// N32: [[TMP0:%.+]] = bitcast i8** %va to i32* +// N64: [[TMP0:%.+]] = bitcast i8** %va to i64* +// +// O32: [[PTR0:%.+]] = load [[INTPTR_T:i32]], i32* [[TMP0]], align [[PTRALIGN]] +// N32: [[PTR0:%.+]] = load [[INTPTR_T:i32]], i32* [[TMP0]], align [[PTRALIGN]] +// N64: [[PTR0:%.+]] = load [[INTPTR_T:i64]], i64* [[TMP0]], align [[PTRALIGN]] // // Vectors are 16-byte aligned, however the O32 ABI has a maximum alignment of // 8-bytes since the base of the stack is 8-byte aligned. diff --git a/test/CodeGen/neon-immediate-ubsan.c b/test/CodeGen/neon-immediate-ubsan.c new file mode 100644 index 0000000000000..3fe4b003972b5 --- /dev/null +++ b/test/CodeGen/neon-immediate-ubsan.c @@ -0,0 +1,24 @@ +// RUN: %clang_cc1 -triple armv7s-linux-gnu -emit-llvm -O1 -o - %s \ +// RUN: -target-feature +neon -target-cpu cortex-a8 \ +// RUN: -fsanitize=signed-integer-overflow \ +// RUN: | FileCheck %s --check-prefix=CHECK --check-prefix=ARMV7 + +// RUN: %clang_cc1 -triple aarch64-unknown-unknown -emit-llvm -O1 -o - %s \ +// RUN: -target-feature +neon -target-cpu cortex-a53 \ +// RUN: -fsanitize=signed-integer-overflow \ +// RUN: | FileCheck %s --check-prefix=CHECK --check-prefix=AARCH64 + +// Verify we emit constants for "immediate" builtin arguments. +// Emitting a scalar expression can make the immediate be generated as +// overflow intrinsics, if the overflow sanitizer is enabled. + +// PR23517 + +#include <arm_neon.h> + +int32x2_t test_vqrshrn_n_s64(int64x2_t a) { + // CHECK-LABEL: @test_vqrshrn_n_s64 + // CHECK-AARCH64: call <2 x i32> @llvm.aarch64.neon.sqrshrn.v2i32(<2 x i64> {{.*}}, i32 1) + // CHECK-ARMV7: call <2 x i32> @llvm.arm.neon.vqrshiftns.v2i32(<2 x i64> {{.*}}, <2 x i64> <i64 -1, i64 -1>) + return vqrshrn_n_s64(a, 0 + 1); +} diff --git a/test/CodeGen/pragma-loop.cpp b/test/CodeGen/pragma-loop.cpp deleted file mode 100644 index dd40c1d72600e..0000000000000 --- a/test/CodeGen/pragma-loop.cpp +++ /dev/null @@ -1,191 +0,0 @@ -// RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++11 -emit-llvm -o - %s | FileCheck %s - -// Verify while loop is recognized after sequence of pragma clang loop directives. -void while_test(int *List, int Length) { - // CHECK: define {{.*}} @_Z10while_test - int i = 0; - -#pragma clang loop vectorize(enable) -#pragma clang loop interleave_count(4) -#pragma clang loop vectorize_width(4) -#pragma clang loop unroll(full) - while (i < Length) { - // CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[LOOP_1:.*]] - List[i] = i * 2; - i++; - } -} - -// Verify do loop is recognized after multi-option pragma clang loop directive. -void do_test(int *List, int Length) { - int i = 0; - -#pragma clang loop vectorize_width(8) interleave_count(4) unroll(disable) - do { - // CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[LOOP_2:.*]] - List[i] = i * 2; - i++; - } while (i < Length); -} - -enum struct Tuner : short { Interleave = 4, Unroll = 8 }; - -// Verify for loop is recognized after sequence of pragma clang loop directives. -void for_test(int *List, int Length) { -#pragma clang loop interleave(enable) -#pragma clang loop interleave_count(static_cast<int>(Tuner::Interleave)) -#pragma clang loop unroll_count(static_cast<int>(Tuner::Unroll)) - for (int i = 0; i < Length; i++) { - // CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[LOOP_3:.*]] - List[i] = i * 2; - } -} - -// Verify c++11 for range loop is recognized after -// sequence of pragma clang loop directives. -void for_range_test() { - double List[100]; - -#pragma clang loop vectorize_width(2) interleave_count(2) - for (int i : List) { - // CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[LOOP_4:.*]] - List[i] = i; - } -} - -// Verify disable pragma clang loop directive generates correct metadata -void disable_test(int *List, int Length) { -#pragma clang loop vectorize(disable) unroll(disable) - for (int i = 0; i < Length; i++) { - // CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[LOOP_5:.*]] - List[i] = i * 2; - } -} - -#define VECWIDTH 2 -#define INTCOUNT 2 -#define UNROLLCOUNT 8 - -// Verify defines are correctly resolved in pragma clang loop directive -void for_define_test(int *List, int Length, int Value) { -#pragma clang loop vectorize_width(VECWIDTH) interleave_count(INTCOUNT) -#pragma clang loop unroll_count(UNROLLCOUNT) - for (int i = 0; i < Length; i++) { - // CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[LOOP_6:.*]] - List[i] = i * Value; - } -} - -// Verify constant expressions are handled correctly. -void for_contant_expression_test(int *List, int Length) { -#pragma clang loop vectorize_width(1 + 4) - for (int i = 0; i < Length; i++) { - // CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[LOOP_7:.*]] - List[i] = i; - } - -#pragma clang loop vectorize_width(3 + VECWIDTH) - for (int i = 0; i < Length; i++) { - // CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[LOOP_8:.*]] - List[i] += i; - } -} - -// Verify metadata is generated when template is used. -template <typename A> -void for_template_test(A *List, int Length, A Value) { -#pragma clang loop vectorize_width(8) interleave_count(8) unroll_count(8) - for (int i = 0; i < Length; i++) { - // CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[LOOP_9:.*]] - List[i] = i * Value; - } -} - -// Verify define is resolved correctly when template is used. -template <typename A, typename T> -void for_template_define_test(A *List, int Length, A Value) { - const T VWidth = VECWIDTH; - const T ICount = INTCOUNT; - const T UCount = UNROLLCOUNT; -#pragma clang loop vectorize_width(VWidth) interleave_count(ICount) -#pragma clang loop unroll_count(UCount) - for (int i = 0; i < Length; i++) { - // CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[LOOP_10:.*]] - List[i] = i * Value; - } -} - -// Verify templates and constant expressions are handled correctly. -template <typename A, int V, int I, int U> -void for_template_constant_expression_test(A *List, int Length) { -#pragma clang loop vectorize_width(V) interleave_count(I) unroll_count(U) - for (int i = 0; i < Length; i++) { - // CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[LOOP_11:.*]] - List[i] = i; - } - -#pragma clang loop vectorize_width(V * 2 + VECWIDTH) interleave_count(I * 2 + INTCOUNT) unroll_count(U * 2 + UNROLLCOUNT) - for (int i = 0; i < Length; i++) { - // CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[LOOP_12:.*]] - List[i] += i; - } - - const int Scale = 4; -#pragma clang loop vectorize_width(Scale * V) interleave_count(Scale * I) unroll_count(Scale * U) - for (int i = 0; i < Length; i++) { - // CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[LOOP_13:.*]] - List[i] += i; - } - -#pragma clang loop vectorize_width((Scale * V) + 2) - for (int i = 0; i < Length; i++) { - // CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[LOOP_14:.*]] - List[i] += i; - } -} - -#undef VECWIDTH -#undef INTCOUNT -#undef UNROLLCOUNT - -// Use templates defined above. Test verifies metadata is generated correctly. -void template_test(double *List, int Length) { - double Value = 10; - - for_template_test<double>(List, Length, Value); - for_template_define_test<double, int>(List, Length, Value); - for_template_constant_expression_test<double, 2, 4, 8>(List, Length); -} - -// CHECK: ![[LOOP_1]] = distinct !{![[LOOP_1]], ![[UNROLL_FULL:.*]], ![[WIDTH_4:.*]], ![[INTERLEAVE_4:.*]], ![[INTENABLE_1:.*]]} -// CHECK: ![[UNROLL_FULL]] = !{!"llvm.loop.unroll.full"} -// CHECK: ![[WIDTH_4]] = !{!"llvm.loop.vectorize.width", i32 4} -// CHECK: ![[INTERLEAVE_4]] = !{!"llvm.loop.interleave.count", i32 4} -// CHECK: ![[INTENABLE_1]] = !{!"llvm.loop.vectorize.enable", i1 true} -// CHECK: ![[LOOP_2]] = distinct !{![[LOOP_2:.*]], ![[UNROLL_DISABLE:.*]], ![[INTERLEAVE_4:.*]], ![[WIDTH_8:.*]]} -// CHECK: ![[UNROLL_DISABLE]] = !{!"llvm.loop.unroll.disable"} -// CHECK: ![[WIDTH_8]] = !{!"llvm.loop.vectorize.width", i32 8} -// CHECK: ![[LOOP_3]] = distinct !{![[LOOP_3]], ![[UNROLL_8:.*]], ![[INTERLEAVE_4:.*]], ![[ENABLE_1:.*]]} -// CHECK: ![[UNROLL_8]] = !{!"llvm.loop.unroll.count", i32 8} -// CHECK: ![[LOOP_4]] = distinct !{![[LOOP_4]], ![[INTERLEAVE_2:.*]], ![[WIDTH_2:.*]]} -// CHECK: ![[INTERLEAVE_2]] = !{!"llvm.loop.interleave.count", i32 2} -// CHECK: ![[WIDTH_2]] = !{!"llvm.loop.vectorize.width", i32 2} -// CHECK: ![[LOOP_5]] = distinct !{![[LOOP_5]], ![[UNROLL_DISABLE:.*]], ![[WIDTH_1:.*]]} -// CHECK: ![[WIDTH_1]] = !{!"llvm.loop.vectorize.width", i32 1} -// CHECK: ![[LOOP_6]] = distinct !{![[LOOP_6]], ![[UNROLL_8:.*]], ![[INTERLEAVE_2:.*]], ![[WIDTH_2:.*]]} -// CHECK: ![[LOOP_7]] = distinct !{![[LOOP_7]], ![[WIDTH_5:.*]]} -// CHECK: ![[WIDTH_5]] = !{!"llvm.loop.vectorize.width", i32 5} -// CHECK: ![[LOOP_8]] = distinct !{![[LOOP_8]], ![[WIDTH_5:.*]]} -// CHECK: ![[LOOP_9]] = distinct !{![[LOOP_9]], ![[UNROLL_8:.*]], ![[INTERLEAVE_8:.*]], ![[WIDTH_8:.*]]} -// CHECK: ![[INTERLEAVE_8]] = !{!"llvm.loop.interleave.count", i32 8} -// CHECK: ![[LOOP_10]] = distinct !{![[LOOP_10]], ![[UNROLL_8:.*]], ![[INTERLEAVE_2:.*]], ![[WIDTH_2:.*]]} -// CHECK: ![[LOOP_11]] = distinct !{![[LOOP_11]], ![[UNROLL_8:.*]], ![[INTERLEAVE_4:.*]], ![[WIDTH_2:.*]]} -// CHECK: ![[LOOP_12]] = distinct !{![[LOOP_12]], ![[UNROLL_24:.*]], ![[INTERLEAVE_10:.*]], ![[WIDTH_6:.*]]} -// CHECK: ![[UNROLL_24]] = !{!"llvm.loop.unroll.count", i32 24} -// CHECK: ![[INTERLEAVE_10]] = !{!"llvm.loop.interleave.count", i32 10} -// CHECK: ![[WIDTH_6]] = !{!"llvm.loop.vectorize.width", i32 6} -// CHECK: ![[LOOP_13]] = distinct !{![[LOOP_13]], ![[UNROLL_32:.*]], ![[INTERLEAVE_16:.*]], ![[WIDTH_8:.*]]} -// CHECK: ![[UNROLL_32]] = !{!"llvm.loop.unroll.count", i32 32} -// CHECK: ![[INTERLEAVE_16]] = !{!"llvm.loop.interleave.count", i32 16} -// CHECK: ![[LOOP_14]] = distinct !{![[LOOP_14]], ![[WIDTH_10:.*]]} -// CHECK: ![[WIDTH_10]] = !{!"llvm.loop.vectorize.width", i32 10} diff --git a/test/CodeGen/pragma-unroll.cpp b/test/CodeGen/pragma-unroll.cpp deleted file mode 100644 index 8b73fa6c8aab4..0000000000000 --- a/test/CodeGen/pragma-unroll.cpp +++ /dev/null @@ -1,99 +0,0 @@ -// RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++11 -emit-llvm -o - %s | FileCheck %s - -// Verify while loop is recognized after unroll pragma. -void while_test(int *List, int Length) { - // CHECK: define {{.*}} @_Z10while_test - int i = 0; - -#pragma unroll - while (i < Length) { - // CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[LOOP_1:.*]] - List[i] = i * 2; - i++; - } -} - -// Verify do loop is recognized after multi-option pragma clang loop directive. -void do_test(int *List, int Length) { - int i = 0; - -#pragma nounroll - do { - // CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[LOOP_2:.*]] - List[i] = i * 2; - i++; - } while (i < Length); -} - -// Verify for loop is recognized after unroll pragma. -void for_test(int *List, int Length) { -#pragma unroll 8 - for (int i = 0; i < Length; i++) { - // CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[LOOP_3:.*]] - List[i] = i * 2; - } -} - -// Verify c++11 for range loop is recognized after unroll pragma. -void for_range_test() { - double List[100]; - -#pragma unroll(4) - for (int i : List) { - // CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[LOOP_4:.*]] - List[i] = i; - } -} - -#define UNROLLCOUNT 8 - -// Verify defines are correctly resolved in unroll pragmas. -void for_define_test(int *List, int Length, int Value) { -#pragma unroll(UNROLLCOUNT) - for (int i = 0; i < Length; i++) { - // CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[LOOP_5:.*]] - List[i] = i * Value; - } -} - -// Verify metadata is generated when template is used. -template <typename A> -void for_template_test(A *List, int Length, A Value) { -#pragma unroll 8 - for (int i = 0; i < Length; i++) { - // CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[LOOP_6:.*]] - List[i] = i * Value; - } -} - -// Verify define is resolved correctly when template is used. -template <typename A> -void for_template_define_test(A *List, int Length, A Value) { -#pragma unroll(UNROLLCOUNT) - for (int i = 0; i < Length; i++) { - // CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[LOOP_7:.*]] - List[i] = i * Value; - } -} - -#undef UNROLLCOUNT - -// Use templates defined above. Test verifies metadata is generated correctly. -void template_test(double *List, int Length) { - double Value = 10; - - for_template_test<double>(List, Length, Value); - for_template_define_test<double>(List, Length, Value); -} - -// CHECK: ![[LOOP_1]] = distinct !{![[LOOP_1]], ![[UNROLL_FULL:.*]]} -// CHECK: ![[UNROLL_FULL]] = !{!"llvm.loop.unroll.full"} -// CHECK: ![[LOOP_2]] = distinct !{![[LOOP_2:.*]], ![[UNROLL_DISABLE:.*]]} -// CHECK: ![[UNROLL_DISABLE]] = !{!"llvm.loop.unroll.disable"} -// CHECK: ![[LOOP_3]] = distinct !{![[LOOP_3]], ![[UNROLL_8:.*]]} -// CHECK: ![[UNROLL_8]] = !{!"llvm.loop.unroll.count", i32 8} -// CHECK: ![[LOOP_4]] = distinct !{![[LOOP_4]], ![[UNROLL_4:.*]]} -// CHECK: ![[UNROLL_4]] = !{!"llvm.loop.unroll.count", i32 4} -// CHECK: ![[LOOP_5]] = distinct !{![[LOOP_5]], ![[UNROLL_8:.*]]} -// CHECK: ![[LOOP_6]] = distinct !{![[LOOP_6]], ![[UNROLL_8:.*]]} -// CHECK: ![[LOOP_7]] = distinct !{![[LOOP_7]], ![[UNROLL_8:.*]]} |
