summaryrefslogtreecommitdiff
path: root/test/CodeGen
diff options
context:
space:
mode:
Diffstat (limited to 'test/CodeGen')
-rw-r--r--test/CodeGen/atomic-ops.c8
-rw-r--r--test/CodeGen/avx512f-builtins.c6
-rw-r--r--test/CodeGen/builtins-ppc-p8vector.c166
-rw-r--r--test/CodeGen/builtins-ppc-vsx.c177
-rw-r--r--test/CodeGen/catch-undef-behavior.c28
-rw-r--r--test/CodeGen/fp16-ops.c139
-rw-r--r--test/CodeGen/mips-varargs.c17
-rw-r--r--test/CodeGen/neon-immediate-ubsan.c24
-rw-r--r--test/CodeGen/pragma-loop.cpp191
-rw-r--r--test/CodeGen/pragma-unroll.cpp99
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:.*]]}