| // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5 |
| // RUN: %clang_cc1 -triple s390x-linux-gnu -target-cpu z14 -fzvector \ |
| // RUN: -O -emit-llvm -o - -W -Wall -Werror %s | FileCheck %s |
| |
| volatile vector float ff, ff2; |
| volatile vector bool int bi; |
| |
| // CHECK-LABEL: define dso_local void @test_assign( |
| // CHECK-SAME: ) local_unnamed_addr #[[ATTR0:[0-9]+]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3:![0-9]+]] |
| // CHECK-NEXT: store volatile <4 x float> [[TMP0]], ptr @ff, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: ret void |
| // |
| void test_assign (void) |
| { |
| ff = ff2; |
| } |
| |
| // CHECK-LABEL: define dso_local void @test_pos( |
| // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: store volatile <4 x float> [[TMP0]], ptr @ff, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: ret void |
| // |
| void test_pos (void) |
| { |
| ff = +ff2; |
| } |
| |
| // CHECK-LABEL: define dso_local void @test_neg( |
| // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[FNEG:%.*]] = fneg <4 x float> [[TMP0]] |
| // CHECK-NEXT: store volatile <4 x float> [[FNEG]], ptr @ff, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: ret void |
| // |
| void test_neg (void) |
| { |
| ff = -ff2; |
| } |
| |
| // CHECK-LABEL: define dso_local void @test_preinc( |
| // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[INC:%.*]] = fadd <4 x float> [[TMP0]], splat (float 1.000000e+00) |
| // CHECK-NEXT: store volatile <4 x float> [[INC]], ptr @ff2, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: ret void |
| // |
| void test_preinc (void) |
| { |
| ++ff2; |
| } |
| |
| // CHECK-LABEL: define dso_local void @test_postinc( |
| // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[INC:%.*]] = fadd <4 x float> [[TMP0]], splat (float 1.000000e+00) |
| // CHECK-NEXT: store volatile <4 x float> [[INC]], ptr @ff2, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: ret void |
| // |
| void test_postinc (void) |
| { |
| ff2++; |
| } |
| |
| // CHECK-LABEL: define dso_local void @test_predec( |
| // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[DEC:%.*]] = fadd <4 x float> [[TMP0]], splat (float -1.000000e+00) |
| // CHECK-NEXT: store volatile <4 x float> [[DEC]], ptr @ff2, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: ret void |
| // |
| void test_predec (void) |
| { |
| --ff2; |
| } |
| |
| // CHECK-LABEL: define dso_local void @test_postdec( |
| // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[DEC:%.*]] = fadd <4 x float> [[TMP0]], splat (float -1.000000e+00) |
| // CHECK-NEXT: store volatile <4 x float> [[DEC]], ptr @ff2, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: ret void |
| // |
| void test_postdec (void) |
| { |
| ff2--; |
| } |
| |
| // CHECK-LABEL: define dso_local void @test_add( |
| // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[ADD:%.*]] = fadd <4 x float> [[TMP0]], [[TMP1]] |
| // CHECK-NEXT: store volatile <4 x float> [[ADD]], ptr @ff, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: ret void |
| // |
| void test_add (void) |
| { |
| ff = ff + ff2; |
| } |
| |
| // CHECK-LABEL: define dso_local void @test_add_assign( |
| // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[ADD:%.*]] = fadd <4 x float> [[TMP0]], [[TMP1]] |
| // CHECK-NEXT: store volatile <4 x float> [[ADD]], ptr @ff, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: ret void |
| // |
| void test_add_assign (void) |
| { |
| ff += ff2; |
| } |
| |
| // CHECK-LABEL: define dso_local void @test_sub( |
| // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[SUB:%.*]] = fsub <4 x float> [[TMP0]], [[TMP1]] |
| // CHECK-NEXT: store volatile <4 x float> [[SUB]], ptr @ff, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: ret void |
| // |
| void test_sub (void) |
| { |
| ff = ff - ff2; |
| } |
| |
| // CHECK-LABEL: define dso_local void @test_sub_assign( |
| // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[SUB:%.*]] = fsub <4 x float> [[TMP1]], [[TMP0]] |
| // CHECK-NEXT: store volatile <4 x float> [[SUB]], ptr @ff, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: ret void |
| // |
| void test_sub_assign (void) |
| { |
| ff -= ff2; |
| } |
| |
| // CHECK-LABEL: define dso_local void @test_mul( |
| // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[MUL:%.*]] = fmul <4 x float> [[TMP0]], [[TMP1]] |
| // CHECK-NEXT: store volatile <4 x float> [[MUL]], ptr @ff, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: ret void |
| // |
| void test_mul (void) |
| { |
| ff = ff * ff2; |
| } |
| |
| // CHECK-LABEL: define dso_local void @test_mul_assign( |
| // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[MUL:%.*]] = fmul <4 x float> [[TMP0]], [[TMP1]] |
| // CHECK-NEXT: store volatile <4 x float> [[MUL]], ptr @ff, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: ret void |
| // |
| void test_mul_assign (void) |
| { |
| ff *= ff2; |
| } |
| |
| // CHECK-LABEL: define dso_local void @test_div( |
| // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[DIV:%.*]] = fdiv <4 x float> [[TMP0]], [[TMP1]] |
| // CHECK-NEXT: store volatile <4 x float> [[DIV]], ptr @ff, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: ret void |
| // |
| void test_div (void) |
| { |
| ff = ff / ff2; |
| } |
| |
| // CHECK-LABEL: define dso_local void @test_div_assign( |
| // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[DIV:%.*]] = fdiv <4 x float> [[TMP1]], [[TMP0]] |
| // CHECK-NEXT: store volatile <4 x float> [[DIV]], ptr @ff, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: ret void |
| // |
| void test_div_assign (void) |
| { |
| ff /= ff2; |
| } |
| |
| // CHECK-LABEL: define dso_local void @test_cmpeq( |
| // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[CMP:%.*]] = fcmp oeq <4 x float> [[TMP0]], [[TMP1]] |
| // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32> |
| // CHECK-NEXT: store volatile <4 x i32> [[SEXT]], ptr @bi, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: ret void |
| // |
| void test_cmpeq (void) |
| { |
| bi = ff == ff2; |
| } |
| |
| // CHECK-LABEL: define dso_local void @test_cmpne( |
| // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[CMP:%.*]] = fcmp une <4 x float> [[TMP0]], [[TMP1]] |
| // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32> |
| // CHECK-NEXT: store volatile <4 x i32> [[SEXT]], ptr @bi, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: ret void |
| // |
| void test_cmpne (void) |
| { |
| bi = ff != ff2; |
| } |
| |
| // CHECK-LABEL: define dso_local void @test_cmpge( |
| // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[CMP:%.*]] = fcmp oge <4 x float> [[TMP0]], [[TMP1]] |
| // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32> |
| // CHECK-NEXT: store volatile <4 x i32> [[SEXT]], ptr @bi, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: ret void |
| // |
| void test_cmpge (void) |
| { |
| bi = ff >= ff2; |
| } |
| |
| // CHECK-LABEL: define dso_local void @test_cmpgt( |
| // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[CMP:%.*]] = fcmp ogt <4 x float> [[TMP0]], [[TMP1]] |
| // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32> |
| // CHECK-NEXT: store volatile <4 x i32> [[SEXT]], ptr @bi, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: ret void |
| // |
| void test_cmpgt (void) |
| { |
| bi = ff > ff2; |
| } |
| |
| // CHECK-LABEL: define dso_local void @test_cmple( |
| // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[CMP:%.*]] = fcmp ole <4 x float> [[TMP0]], [[TMP1]] |
| // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32> |
| // CHECK-NEXT: store volatile <4 x i32> [[SEXT]], ptr @bi, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: ret void |
| // |
| void test_cmple (void) |
| { |
| bi = ff <= ff2; |
| } |
| |
| // CHECK-LABEL: define dso_local void @test_cmplt( |
| // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: [[CMP:%.*]] = fcmp olt <4 x float> [[TMP0]], [[TMP1]] |
| // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32> |
| // CHECK-NEXT: store volatile <4 x i32> [[SEXT]], ptr @bi, align 8, !tbaa [[TBAA3]] |
| // CHECK-NEXT: ret void |
| // |
| void test_cmplt (void) |
| { |
| bi = ff < ff2; |
| } |
| |
| //. |
| // CHECK: [[TBAA3]] = !{[[META4:![0-9]+]], [[META4]], i64 0} |
| // CHECK: [[META4]] = !{!"omnipotent char", [[META5:![0-9]+]], i64 0} |
| // CHECK: [[META5]] = !{!"Simple C/C++ TBAA"} |
| //. |