diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-07-13 19:25:38 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-07-13 19:25:38 +0000 | 
| commit | 8746d127c04f5bbaf6c6e88cef8606ca5a6a54e9 (patch) | |
| tree | 84c9d77f8c764f04bcef0b1da4eedfa233d67a46 /test | |
| parent | cf1b401909b5e54edfd80656b1a18eaa31f9f6f1 (diff) | |
Diffstat (limited to 'test')
98 files changed, 3609 insertions, 2250 deletions
diff --git a/test/Analysis/analyzer-config.c b/test/Analysis/analyzer-config.c index 70521c63fbad..0d8d34fbf6b0 100644 --- a/test/Analysis/analyzer-config.c +++ b/test/Analysis/analyzer-config.c @@ -12,6 +12,8 @@ void foo() {  // CHECK: [config]  // CHECK-NEXT: cfg-conditional-static-initializers = true +// CHECK-NEXT: cfg-implicit-dtors = true +// CHECK-NEXT: cfg-lifetime = false  // CHECK-NEXT: cfg-temporary-dtors = false  // CHECK-NEXT: faux-bodies = true  // CHECK-NEXT: graph-trim-interval = 1000 @@ -27,5 +29,4 @@ void foo() {  // CHECK-NEXT: region-store-small-struct-limit = 2  // CHECK-NEXT: widen-loops = false  // CHECK-NEXT: [stats] -// CHECK-NEXT: num-entries = 15 - +// CHECK-NEXT: num-entries = 17 diff --git a/test/Analysis/analyzer-config.cpp b/test/Analysis/analyzer-config.cpp index 60c03c1e497b..4166a730cf53 100644 --- a/test/Analysis/analyzer-config.cpp +++ b/test/Analysis/analyzer-config.cpp @@ -23,6 +23,8 @@ public:  // CHECK-NEXT: c++-stdlib-inlining = true  // CHECK-NEXT: c++-template-inlining = true  // CHECK-NEXT: cfg-conditional-static-initializers = true +// CHECK-NEXT: cfg-implicit-dtors = true +// CHECK-NEXT: cfg-lifetime = false  // CHECK-NEXT: cfg-temporary-dtors = false  // CHECK-NEXT: faux-bodies = true  // CHECK-NEXT: graph-trim-interval = 1000 @@ -38,4 +40,4 @@ public:  // CHECK-NEXT: region-store-small-struct-limit = 2  // CHECK-NEXT: widen-loops = false  // CHECK-NEXT: [stats] -// CHECK-NEXT: num-entries = 20 +// CHECK-NEXT: num-entries = 22 diff --git a/test/Analysis/enum.cpp b/test/Analysis/enum.cpp index b561e65ac86e..96408473cede 100644 --- a/test/Analysis/enum.cpp +++ b/test/Analysis/enum.cpp @@ -37,3 +37,33 @@ bool testNoCrashOnSwitchEnumBool(EnumBool E) {    }    return true;  } + +bool testNoCrashOnSwitchEnumBoolConstant() { +  EnumBool E = EnumBool::F; +  switch (E) { +    case EnumBool::F: +      return false;  +  } +  return true;  +} + +typedef __INTPTR_TYPE__ intptr_t; +bool testNoCrashOnSwitchEnumBoolConstantCastedFromNullptr() { +  EnumBool E = static_cast<EnumBool>((intptr_t)nullptr); +  switch (E) { +  case EnumBool::F: +    return false; +  } +  return true; +} + +bool testNoCrashOnSwitchEnumBoolConstantCastedFromPtr() { +  int X; +  intptr_t P = (intptr_t)&X; +  EnumBool E = static_cast<EnumBool>(P); +  switch (E) { +  case EnumBool::F: +    return false; +  } +  return true; +} diff --git a/test/Analysis/lifetime-cfg-output.cpp b/test/Analysis/lifetime-cfg-output.cpp new file mode 100644 index 000000000000..1e6f56df6a47 --- /dev/null +++ b/test/Analysis/lifetime-cfg-output.cpp @@ -0,0 +1,783 @@ +// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -analyze -analyzer-checker=debug.DumpCFG -analyzer-config cfg-lifetime=true -analyzer-config cfg-implicit-dtors=false %s > %t 2>&1 +// RUN: FileCheck --input-file=%t %s + +extern bool UV; +class A { +public: +  // CHECK:       [B2 (ENTRY)] +  // CHECK-NEXT:    Succs (1): B1 +  // CHECK:       [B1] +  // CHECK-NEXT:    1: true +  // CHECK-NEXT:    2: UV +  // CHECK-NEXT:    3: [B1.2] = [B1.1] +  // CHECK-NEXT:    Preds (1): B2 +  // CHECK-NEXT:    Succs (1): B0 +  // CHECK:       [B0 (EXIT)] +  // CHECK-NEXT:    Preds (1): B1 +  A() { +    UV = true; +  } +  // CHECK:       [B3 (ENTRY)] +  // CHECK-NEXT:    Succs (1): B2 +  // CHECK:       [B1] +  // CHECK-NEXT:    1: 0 +  // CHECK-NEXT:    2: this +  // CHECK-NEXT:    3: [B1.2]->p +  // CHECK-NEXT:    4: [B1.3] (ImplicitCastExpr, LValueToRValue, int *) +  // CHECK-NEXT:    5: *[B1.4] +  // CHECK-NEXT:    6: [B1.5] = [B1.1] +  // CHECK-NEXT:    Preds (1): B2 +  // CHECK-NEXT:    Succs (1): B0 +  // CHECK:       [B2] +  // CHECK-NEXT:    1: this +  // CHECK-NEXT:    2: [B2.1]->p +  // CHECK-NEXT:    3: [B2.2] (ImplicitCastExpr, LValueToRValue, int *) +  // CHECK-NEXT:    4: [B2.3] (ImplicitCastExpr, PointerToBoolean, _Bool) +  // CHECK-NEXT:    T: if [B2.4] +  // CHECK-NEXT:    Preds (1): B3 +  // CHECK-NEXT:    Succs (2): B1 B0 +  // CHECK:       [B0 (EXIT)] +  // CHECK-NEXT:    Preds (2): B1 B2 +  ~A() { +    if (p) +      *p = 0; +  } +  // CHECK:       [B2 (ENTRY)] +  // CHECK-NEXT:    Succs (1): B1 +  // CHECK:       [B1] +  // CHECK-NEXT:    1: 1 +  // CHECK-NEXT:    2: return [B1.1]; +  // CHECK-NEXT:    Preds (1): B2 +  // CHECK-NEXT:    Succs (1): B0 +  // CHECK:       [B0 (EXIT)] +  // CHECK-NEXT:    Preds (1): B1 +  operator int() const { return 1; } +  int *p; +}; + +// CHECK:       [B2 (ENTRY)] +// CHECK-NEXT:    Succs (1): B1 +// CHECK:       [B1] +// CHECK-NEXT:    1:  (CXXConstructExpr, class A) +// CHECK-NEXT:    2: A a; +// CHECK-NEXT:    3: a +// CHECK-NEXT:    4: [B1.3] (ImplicitCastExpr, NoOp, const class A) +// CHECK-NEXT:    5: const A &b = a; +// CHECK-NEXT:    6: A() (CXXConstructExpr, class A) +// CHECK-NEXT:    7: [B1.6] (BindTemporary) +// CHECK-NEXT:    8: [B1.7] (ImplicitCastExpr, NoOp, const class A) +// CHECK-NEXT:    9: [B1.8] +// CHECK-NEXT:   10: const A &c = A(); +// CHECK-NEXT:   11: [B1.10] (Lifetime ends) +// CHECK-NEXT:   12: [B1.2] (Lifetime ends) +// CHECK-NEXT:   13: [B1.5] (Lifetime ends) +// CHECK-NEXT:    Preds (1): B2 +// CHECK-NEXT:    Succs (1): B0 +// CHECK:       [B0 (EXIT)] +// CHECK-NEXT:    Preds (1): B1 +void test_const_ref() { +  A a; +  const A &b = a; +  const A &c = A(); +} + +// CHECK:      [B2 (ENTRY)] +// CHECK-NEXT:   Succs (1): B1 +// CHECK:       [B1] +// CHECK-NEXT:    1:  (CXXConstructExpr, class A [2]) +// CHECK-NEXT:    2: A a[2]; +// CHECK-NEXT:    3:  (CXXConstructExpr, class A [0]) +// CHECK-NEXT:    4: A b[0]; +// lifetime of a ends when its destructors are run +// CHECK-NEXT:    5: [B1.2] (Lifetime ends) +// lifetime of b ends when its storage duration ends +// CHECK-NEXT:    6: [B1.4] (Lifetime ends) +// CHECK-NEXT:    Preds (1): B2 +// CHECK-NEXT:    Succs (1): B0 +// CHECK:      [B0 (EXIT)] +// CHECK-NEXT:   Preds (1): B1 +void test_array() { +  A a[2]; +  A b[0]; +} + +// CHECK:      [B2 (ENTRY)] +// CHECK-NEXT:   Succs (1): B1 +// CHECK:       [B1] +// CHECK-NEXT:    1:  (CXXConstructExpr, class A) +// CHECK-NEXT:    2: A a; +// CHECK-NEXT:    3:  (CXXConstructExpr, class A) +// CHECK-NEXT:    4: A c; +// CHECK-NEXT:    5:  (CXXConstructExpr, class A) +// CHECK-NEXT:    6: A d; +// CHECK-NEXT:    7: [B1.6] (Lifetime ends) +// CHECK-NEXT:    8: [B1.4] (Lifetime ends) +// CHECK-NEXT:    9:  (CXXConstructExpr, class A) +// CHECK-NEXT:   10: A b; +// CHECK-NEXT:   11: [B1.10] (Lifetime ends) +// CHECK-NEXT:   12: [B1.2] (Lifetime ends) +// CHECK-NEXT:    Preds (1): B2 +// CHECK-NEXT:    Succs (1): B0 +// CHECK:      [B0 (EXIT)] +// CHECK-NEXT:   Preds (1): B1 +void test_scope() { +  A a; +  { +    A c; +    A d; +  } +  A b; +} + +// CHECK:      [B4 (ENTRY)] +// CHECK-NEXT:   Succs (1): B3 +// CHECK:       [B1] +// CHECK-NEXT:    1:  (CXXConstructExpr, class A) +// CHECK-NEXT:    2: A c; +// CHECK-NEXT:    3: [B1.2] (Lifetime ends) +// CHECK-NEXT:    4: [B3.4] (Lifetime ends) +// CHECK-NEXT:    5: [B3.2] (Lifetime ends) +// CHECK-NEXT:    Preds (1): B3 +// CHECK-NEXT:    Succs (1): B0 +// CHECK:       [B2] +// CHECK-NEXT:    1: return; +// CHECK-NEXT:    2: [B3.4] (Lifetime ends) +// CHECK-NEXT:    3: [B3.2] (Lifetime ends) +// CHECK-NEXT:    Preds (1): B3 +// CHECK-NEXT:    Succs (1): B0 +// CHECK:       [B3] +// CHECK-NEXT:    1:  (CXXConstructExpr, class A) +// CHECK-NEXT:    2: A a; +// CHECK-NEXT:    3:  (CXXConstructExpr, class A) +// CHECK-NEXT:    4: A b; +// CHECK-NEXT:    5: UV +// CHECK-NEXT:    6: [B3.5] (ImplicitCastExpr, LValueToRValue, _Bool) +// CHECK-NEXT:    T: if [B3.6] +// CHECK-NEXT:    Preds (1): B4 +// CHECK-NEXT:    Succs (2): B2 B1 + +// CHECK:      [B0 (EXIT)] +// CHECK-NEXT:   Preds (2): B1 B2 +void test_return() { +  A a; +  A b; +  if (UV) +    return; +  A c; +} + +// CHECK:       [B5 (ENTRY)] +// CHECK-NEXT:    Succs (1): B4 +// CHECK:       [B1] +// CHECK-NEXT:    1: [B4.6] (Lifetime ends) +// CHECK-NEXT:    2: [B4.2] (Lifetime ends) +// CHECK-NEXT:    Preds (2): B2 B3 +// CHECK-NEXT:    Succs (1): B0 +// CHECK:       [B2] +// CHECK-NEXT:    1:  (CXXConstructExpr, class A) +// CHECK-NEXT:    2: A c; +// CHECK-NEXT:    3: [B2.2] (Lifetime ends) +// CHECK-NEXT:    Preds (1): B4 +// CHECK-NEXT:    Succs (1): B1 +// CHECK:       [B3] +// CHECK-NEXT:    1:  (CXXConstructExpr, class A) +// CHECK-NEXT:    2: A c; +// CHECK-NEXT:    3: [B3.2] (Lifetime ends) +// CHECK-NEXT:    Preds (1): B4 +// CHECK-NEXT:    Succs (1): B1 +// CHECK:       [B4] +// CHECK-NEXT:    1:  (CXXConstructExpr, class A) +// CHECK-NEXT:    2: A a; +// CHECK-NEXT:    3: a +// CHECK-NEXT:    4: [B4.3] (ImplicitCastExpr, NoOp, const class A) +// CHECK-NEXT:    5: [B4.4] (CXXConstructExpr, class A) +// CHECK-NEXT:    6: A b = a; +// CHECK-NEXT:    7: b +// CHECK-NEXT:    8: [B4.7] (ImplicitCastExpr, NoOp, const class A) +// CHECK-NEXT:    9: [B4.8].operator int +// CHECK-NEXT:   10: [B4.8] +// CHECK-NEXT:   11: [B4.10] (ImplicitCastExpr, UserDefinedConversion, int) +// CHECK-NEXT:   12: [B4.11] (ImplicitCastExpr, IntegralToBoolean, _Bool) +// CHECK-NEXT:    T: if [B4.12] +// CHECK-NEXT:    Preds (1): B5 +// CHECK-NEXT:    Succs (2): B3 B2 +// CHECK:       [B0 (EXIT)] +// CHECK-NEXT:    Preds (1): B1 +void test_if_implicit_scope() { +  A a; +  if (A b = a) +    A c; +  else +    A c; +} + +// CHECK:       [B9 (ENTRY)] +// CHECK-NEXT:    Succs (1): B8 +// CHECK:       [B1] +// CHECK-NEXT:    1: [B8.6] (Lifetime ends) +// CHECK-NEXT:    2:  (CXXConstructExpr, class A) +// CHECK-NEXT:    3: A e; +// CHECK-NEXT:    4: [B1.3] (Lifetime ends) +// CHECK-NEXT:    5: [B8.2] (Lifetime ends) +// CHECK-NEXT:    Preds (2): B2 B5 +// CHECK-NEXT:    Succs (1): B0 +// CHECK:       [B2] +// CHECK-NEXT:    1:  (CXXConstructExpr, class A) +// CHECK-NEXT:    2: A d; +// CHECK-NEXT:    3: [B2.2] (Lifetime ends) +// CHECK-NEXT:    4: [B4.2] (Lifetime ends) +// CHECK-NEXT:    Preds (1): B4 +// CHECK-NEXT:    Succs (1): B1 +// CHECK:       [B3] +// CHECK-NEXT:    1: return; +// CHECK-NEXT:    2: [B4.2] (Lifetime ends) +// CHECK-NEXT:    3: [B8.6] (Lifetime ends) +// CHECK-NEXT:    4: [B8.2] (Lifetime ends) +// CHECK-NEXT:    Preds (1): B4 +// CHECK-NEXT:    Succs (1): B0 +// CHECK:       [B4] +// CHECK-NEXT:    1:  (CXXConstructExpr, class A) +// CHECK-NEXT:    2: A c; +// CHECK-NEXT:    3: UV +// CHECK-NEXT:    4: [B4.3] (ImplicitCastExpr, LValueToRValue, _Bool) +// CHECK-NEXT:    T: if [B4.4] +// CHECK-NEXT:    Preds (1): B8 +// CHECK-NEXT:    Succs (2): B3 B2 +// CHECK:       [B5] +// CHECK-NEXT:    1:  (CXXConstructExpr, class A) +// CHECK-NEXT:    2: A d; +// CHECK-NEXT:    3: [B5.2] (Lifetime ends) +// CHECK-NEXT:    4: [B7.2] (Lifetime ends) +// CHECK-NEXT:    Preds (1): B7 +// CHECK-NEXT:    Succs (1): B1 +// CHECK:       [B6] +// CHECK-NEXT:    1: return; +// CHECK-NEXT:    2: [B7.2] (Lifetime ends) +// CHECK-NEXT:    3: [B8.6] (Lifetime ends) +// CHECK-NEXT:    4: [B8.2] (Lifetime ends) +// CHECK-NEXT:    Preds (1): B7 +// CHECK-NEXT:    Succs (1): B0 +// CHECK:       [B7] +// CHECK-NEXT:    1:  (CXXConstructExpr, class A) +// CHECK-NEXT:    2: A c; +// CHECK-NEXT:    3: UV +// CHECK-NEXT:    4: [B7.3] (ImplicitCastExpr, LValueToRValue, _Bool) +// CHECK-NEXT:    T: if [B7.4] +// CHECK-NEXT:    Preds (1): B8 +// CHECK-NEXT:    Succs (2): B6 B5 +// CHECK:       [B8] +// CHECK-NEXT:    1:  (CXXConstructExpr, class A) +// CHECK-NEXT:    2: A a; +// CHECK-NEXT:    3: a +// CHECK-NEXT:    4: [B8.3] (ImplicitCastExpr, NoOp, const class A) +// CHECK-NEXT:    5: [B8.4] (CXXConstructExpr, class A) +// CHECK-NEXT:    6: A b = a; +// CHECK-NEXT:    7: b +// CHECK-NEXT:    8: [B8.7] (ImplicitCastExpr, NoOp, const class A) +// CHECK-NEXT:    9: [B8.8].operator int +// CHECK-NEXT:   10: [B8.8] +// CHECK-NEXT:   11: [B8.10] (ImplicitCastExpr, UserDefinedConversion, int) +// CHECK-NEXT:   12: [B8.11] (ImplicitCastExpr, IntegralToBoolean, _Bool) +// CHECK-NEXT:    T: if [B8.12] +// CHECK-NEXT:    Preds (1): B9 +// CHECK-NEXT:    Succs (2): B7 B4 +// CHECK:       [B0 (EXIT)] +// CHECK-NEXT:    Preds (3): B1 B3 B6 +void test_if_jumps() { +  A a; +  if (A b = a) { +    A c; +    if (UV) +      return; +    A d; +  } else { +    A c; +    if (UV) +      return; +    A d; +  } +  A e; +} + +// CHECK:       [B6 (ENTRY)] +// CHECK-NEXT:    Succs (1): B5 +// CHECK:       [B1] +// CHECK-NEXT:    1: [B4.4] (Lifetime ends) +// CHECK-NEXT:    2: [B5.2] (Lifetime ends) +// CHECK-NEXT:    Preds (1): B4 +// CHECK-NEXT:    Succs (1): B0 +// CHECK:       [B2] +// CHECK-NEXT:    Preds (1): B3 +// CHECK-NEXT:    Succs (1): B4 +// CHECK:       [B3] +// CHECK-NEXT:    1:  (CXXConstructExpr, class A) +// CHECK-NEXT:    2: A c; +// CHECK-NEXT:    3: [B3.2] (Lifetime ends) +// CHECK-NEXT:    4: [B4.4] (Lifetime ends) +// CHECK-NEXT:    Preds (1): B4 +// CHECK-NEXT:    Succs (1): B2 +// CHECK:       [B4] +// CHECK-NEXT:    1: a +// CHECK-NEXT:    2: [B4.1] (ImplicitCastExpr, NoOp, const class A) +// CHECK-NEXT:    3: [B4.2] (CXXConstructExpr, class A) +// CHECK-NEXT:    4: A b = a; +// CHECK-NEXT:    5: b +// CHECK-NEXT:    6: [B4.5] (ImplicitCastExpr, NoOp, const class A) +// CHECK-NEXT:    7: [B4.6].operator int +// CHECK-NEXT:    8: [B4.6] +// CHECK-NEXT:    9: [B4.8] (ImplicitCastExpr, UserDefinedConversion, int) +// CHECK-NEXT:   10: [B4.9] (ImplicitCastExpr, IntegralToBoolean, _Bool) +// CHECK-NEXT:    T: while [B4.10] +// CHECK-NEXT:    Preds (2): B2 B5 +// CHECK-NEXT:    Succs (2): B3 B1 +// CHECK:       [B5] +// CHECK-NEXT:    1:  (CXXConstructExpr, class A) +// CHECK-NEXT:    2: A a; +// CHECK-NEXT:    Preds (1): B6 +// CHECK-NEXT:    Succs (1): B4 +// CHECK:       [B0 (EXIT)] +// CHECK-NEXT:    Preds (1): B1 +void test_while_implicit_scope() { +  A a; +  while (A b = a) +    A c; +} + +// CHECK:       [B12 (ENTRY)] +// CHECK-NEXT:    Succs (1): B11 +// CHECK:       [B1] +// CHECK-NEXT:    1: [B10.4] (Lifetime ends) +// CHECK-NEXT:    2:  (CXXConstructExpr, class A) +// CHECK-NEXT:    3: A e; +// CHECK-NEXT:    4: [B1.3] (Lifetime ends) +// CHECK-NEXT:    5: [B11.2] (Lifetime ends) +// CHECK-NEXT:    Preds (2): B8 B10 +// CHECK-NEXT:    Succs (1): B0 +// CHECK:       [B2] +// CHECK-NEXT:    Preds (2): B3 B6 +// CHECK-NEXT:    Succs (1): B10 +// CHECK:       [B3] +// CHECK-NEXT:    1:  (CXXConstructExpr, class A) +// CHECK-NEXT:    2: A d; +// CHECK-NEXT:    3: [B3.2] (Lifetime ends) +// CHECK-NEXT:    4: [B9.2] (Lifetime ends) +// CHECK-NEXT:    5: [B10.4] (Lifetime ends) +// CHECK-NEXT:    Preds (1): B5 +// CHECK-NEXT:    Succs (1): B2 +// CHECK:       [B4] +// CHECK-NEXT:    1: return; +// CHECK-NEXT:    2: [B9.2] (Lifetime ends) +// CHECK-NEXT:    3: [B10.4] (Lifetime ends) +// CHECK-NEXT:    4: [B11.2] (Lifetime ends) +// CHECK-NEXT:    Preds (1): B5 +// CHECK-NEXT:    Succs (1): B0 +// CHECK:       [B5] +// CHECK-NEXT:    1: UV +// CHECK-NEXT:    2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool) +// CHECK-NEXT:    T: if [B5.2] +// CHECK-NEXT:    Preds (1): B7 +// CHECK-NEXT:    Succs (2): B4 B3 +// CHECK:       [B6] +// CHECK-NEXT:    1: [B9.2] (Lifetime ends) +// CHECK-NEXT:    2: [B10.4] (Lifetime ends) +// CHECK-NEXT:    T: continue; +// CHECK-NEXT:    Preds (1): B7 +// CHECK-NEXT:    Succs (1): B2 +// CHECK:       [B7] +// CHECK-NEXT:    1: UV +// CHECK-NEXT:    2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool) +// CHECK-NEXT:    T: if [B7.2] +// CHECK-NEXT:    Preds (1): B9 +// CHECK-NEXT:    Succs (2): B6 B5 +// CHECK:       [B8] +// CHECK-NEXT:    1: [B9.2] (Lifetime ends) +// CHECK-NEXT:    T: break; +// CHECK-NEXT:    Preds (1): B9 +// CHECK-NEXT:    Succs (1): B1 +// CHECK:       [B9] +// CHECK-NEXT:    1:  (CXXConstructExpr, class A) +// CHECK-NEXT:    2: A c; +// CHECK-NEXT:    3: UV +// CHECK-NEXT:    4: [B9.3] (ImplicitCastExpr, LValueToRValue, _Bool) +// CHECK-NEXT:    T: if [B9.4] +// CHECK-NEXT:    Preds (1): B10 +// CHECK-NEXT:    Succs (2): B8 B7 +// CHECK:       [B10] +// CHECK-NEXT:    1: a +// CHECK-NEXT:    2: [B10.1] (ImplicitCastExpr, NoOp, const class A) +// CHECK-NEXT:    3: [B10.2] (CXXConstructExpr, class A) +// CHECK-NEXT:    4: A b = a; +// CHECK-NEXT:    5: b +// CHECK-NEXT:    6: [B10.5] (ImplicitCastExpr, NoOp, const class A) +// CHECK-NEXT:    7: [B10.6].operator int +// CHECK-NEXT:    8: [B10.6] +// CHECK-NEXT:    9: [B10.8] (ImplicitCastExpr, UserDefinedConversion, int) +// CHECK-NEXT:   10: [B10.9] (ImplicitCastExpr, IntegralToBoolean, _Bool) +// CHECK-NEXT:    T: while [B10.10] +// CHECK-NEXT:    Preds (2): B2 B11 +// CHECK-NEXT:    Succs (2): B9 B1 +// CHECK:       [B11] +// CHECK-NEXT:    1:  (CXXConstructExpr, class A) +// CHECK-NEXT:    2: A a; +// CHECK-NEXT:    Preds (1): B12 +// CHECK-NEXT:    Succs (1): B10 +// CHECK:       [B0 (EXIT)] +// CHECK-NEXT:    Preds (2): B1 B4 +void test_while_jumps() { +  A a; +  while (A b = a) { +    A c; +    if (UV) +      break; +    if (UV) +      continue; +    if (UV) +      return; +    A d; +  } +  A e; +} + +// CHECK:       [B12 (ENTRY)] +// CHECK-NEXT:    Succs (1): B11 +// CHECK:       [B1] +// CHECK-NEXT:    1:  (CXXConstructExpr, class A) +// CHECK-NEXT:    2: A d; +// CHECK-NEXT:    3: [B1.2] (Lifetime ends) +// CHECK-NEXT:    4: [B11.2] (Lifetime ends) +// CHECK-NEXT:    Preds (2): B8 B2 +// CHECK-NEXT:    Succs (1): B0 +// CHECK:       [B2] +// CHECK-NEXT:    1: UV +// CHECK-NEXT:    2: [B2.1] (ImplicitCastExpr, LValueToRValue, _Bool) +// CHECK-NEXT:    T: do ... while [B2.2] +// CHECK-NEXT:    Preds (2): B3 B6 +// CHECK-NEXT:    Succs (2): B10 B1 +// CHECK:       [B3] +// CHECK-NEXT:    1:  (CXXConstructExpr, class A) +// CHECK-NEXT:    2: A c; +// CHECK-NEXT:    3: [B3.2] (Lifetime ends) +// CHECK-NEXT:    4: [B9.2] (Lifetime ends) +// CHECK-NEXT:    Preds (1): B5 +// CHECK-NEXT:    Succs (1): B2 +// CHECK:       [B4] +// CHECK-NEXT:    1: return; +// CHECK-NEXT:    2: [B9.2] (Lifetime ends) +// CHECK-NEXT:    3: [B11.2] (Lifetime ends) +// CHECK-NEXT:    Preds (1): B5 +// CHECK-NEXT:    Succs (1): B0 +// CHECK:       [B5] +// CHECK-NEXT:    1: UV +// CHECK-NEXT:    2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool) +// CHECK-NEXT:    T: if [B5.2] +// CHECK-NEXT:    Preds (1): B7 +// CHECK-NEXT:    Succs (2): B4 B3 +// CHECK:       [B6] +// CHECK-NEXT:    1: [B9.2] (Lifetime ends) +// CHECK-NEXT:    T: continue; +// CHECK-NEXT:    Preds (1): B7 +// CHECK-NEXT:    Succs (1): B2 +// CHECK:       [B7] +// CHECK-NEXT:    1: UV +// CHECK-NEXT:    2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool) +// CHECK-NEXT:    T: if [B7.2] +// CHECK-NEXT:    Preds (1): B9 +// CHECK-NEXT:    Succs (2): B6 B5 +// CHECK:       [B8] +// CHECK-NEXT:    1: [B9.2] (Lifetime ends) +// CHECK-NEXT:    T: break; +// CHECK-NEXT:    Preds (1): B9 +// CHECK-NEXT:    Succs (1): B1 +// CHECK:       [B9] +// CHECK-NEXT:    1:  (CXXConstructExpr, class A) +// CHECK-NEXT:    2: A b; +// CHECK-NEXT:    3: UV +// CHECK-NEXT:    4: [B9.3] (ImplicitCastExpr, LValueToRValue, _Bool) +// CHECK-NEXT:    T: if [B9.4] +// CHECK-NEXT:    Preds (2): B10 B11 +// CHECK-NEXT:    Succs (2): B8 B7 +// CHECK:       [B10] +// CHECK-NEXT:    Preds (1): B2 +// CHECK-NEXT:    Succs (1): B9 +// CHECK:       [B11] +// CHECK-NEXT:    1:  (CXXConstructExpr, class A) +// CHECK-NEXT:    2: A a; +// CHECK-NEXT:    Preds (1): B12 +// CHECK-NEXT:    Succs (1): B9 +// CHECK:       [B0 (EXIT)] +// CHECK-NEXT:    Preds (2): B1 B4 +void test_do_jumps() { +  A a; +  do { +    A b; +    if (UV) +      break; +    if (UV) +      continue; +    if (UV) +      return; +    A c; +  } while (UV); +  A d; +} + +// CHECK:       [B6 (ENTRY)] +// CHECK-NEXT:    Succs (1): B5 +// CHECK:       [B1] +// CHECK-NEXT:    1: [B4.4] (Lifetime ends) +// CHECK-NEXT:    2: [B5.2] (Lifetime ends) +// CHECK-NEXT:    Preds (1): B4 +// CHECK-NEXT:    Succs (1): B0 +// CHECK:       [B2] +// CHECK-NEXT:    Preds (1): B3 +// CHECK-NEXT:    Succs (1): B4 +// CHECK:       [B3] +// CHECK-NEXT:    1:  (CXXConstructExpr, class A) +// CHECK-NEXT:    2: A c; +// CHECK-NEXT:    3: [B3.2] (Lifetime ends) +// CHECK-NEXT:    4: [B4.4] (Lifetime ends) +// CHECK-NEXT:    Preds (1): B4 +// CHECK-NEXT:    Succs (1): B2 +// CHECK:       [B4] +// CHECK-NEXT:    1: a +// CHECK-NEXT:    2: [B4.1] (ImplicitCastExpr, NoOp, const class A) +// CHECK-NEXT:    3: [B4.2] (CXXConstructExpr, class A) +// CHECK-NEXT:    4: A b = a; +// CHECK-NEXT:    5: b +// CHECK-NEXT:    6: [B4.5] (ImplicitCastExpr, NoOp, const class A) +// CHECK-NEXT:    7: [B4.6].operator int +// CHECK-NEXT:    8: [B4.6] +// CHECK-NEXT:    9: [B4.8] (ImplicitCastExpr, UserDefinedConversion, int) +// CHECK-NEXT:   10: [B4.9] (ImplicitCastExpr, IntegralToBoolean, _Bool) +// CHECK-NEXT:    T: for (...; [B4.10]; ) +// CHECK-NEXT:    Preds (2): B2 B5 +// CHECK-NEXT:    Succs (2): B3 B1 +// CHECK:       [B5] +// CHECK-NEXT:    1:  (CXXConstructExpr, class A) +// CHECK-NEXT:    2: A a; +// CHECK-NEXT:    Preds (1): B6 +// CHECK-NEXT:    Succs (1): B4 +// CHECK:       [B0 (EXIT)] +// CHECK-NEXT:    Preds (1): B1 +void test_for_implicit_scope() { +  for (A a; A b = a;) +    A c; +} + +// CHECK:       [B12 (ENTRY)] +// CHECK-NEXT:    Succs (1): B11 +// CHECK:       [B1] +// CHECK-NEXT:    1: [B10.4] (Lifetime ends) +// CHECK-NEXT:    2: [B11.4] (Lifetime ends) +// CHECK-NEXT:    3:  (CXXConstructExpr, class A) +// CHECK-NEXT:    4: A f; +// CHECK-NEXT:    5: [B1.4] (Lifetime ends) +// CHECK-NEXT:    6: [B11.2] (Lifetime ends) +// CHECK-NEXT:    Preds (2): B8 B10 +// CHECK-NEXT:    Succs (1): B0 +// CHECK:       [B2] +// CHECK-NEXT:    Preds (2): B3 B6 +// CHECK-NEXT:    Succs (1): B10 +// CHECK:       [B3] +// CHECK-NEXT:    1:  (CXXConstructExpr, class A) +// CHECK-NEXT:    2: A e; +// CHECK-NEXT:    3: [B3.2] (Lifetime ends) +// CHECK-NEXT:    4: [B9.2] (Lifetime ends) +// CHECK-NEXT:    5: [B10.4] (Lifetime ends) +// CHECK-NEXT:    Preds (1): B5 +// CHECK-NEXT:    Succs (1): B2 +// CHECK:       [B4] +// CHECK-NEXT:    1: return; +// CHECK-NEXT:    2: [B9.2] (Lifetime ends) +// CHECK-NEXT:    3: [B10.4] (Lifetime ends) +// CHECK-NEXT:    4: [B11.4] (Lifetime ends) +// CHECK-NEXT:    5: [B11.2] (Lifetime ends) +// CHECK-NEXT:    Preds (1): B5 +// CHECK-NEXT:    Succs (1): B0 +// CHECK:       [B5] +// CHECK-NEXT:    1: UV +// CHECK-NEXT:    2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool) +// CHECK-NEXT:    T: if [B5.2] +// CHECK-NEXT:    Preds (1): B7 +// CHECK-NEXT:    Succs (2): B4 B3 +// CHECK:       [B6] +// CHECK-NEXT:    1: [B9.2] (Lifetime ends) +// CHECK-NEXT:    T: continue; +// CHECK-NEXT:    Preds (1): B7 +// CHECK-NEXT:    Succs (1): B2 +// CHECK:       [B7] +// CHECK-NEXT:    1: UV +// CHECK-NEXT:    2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool) +// CHECK-NEXT:    T: if [B7.2] +// CHECK-NEXT:    Preds (1): B9 +// CHECK-NEXT:    Succs (2): B6 B5 +// CHECK:       [B8] +// CHECK-NEXT:    1: [B9.2] (Lifetime ends) +// CHECK-NEXT:    T: break; +// CHECK-NEXT:    Preds (1): B9 +// CHECK-NEXT:    Succs (1): B1 +// CHECK:       [B9] +// CHECK-NEXT:    1:  (CXXConstructExpr, class A) +// CHECK-NEXT:    2: A d; +// CHECK-NEXT:    3: UV +// CHECK-NEXT:    4: [B9.3] (ImplicitCastExpr, LValueToRValue, _Bool) +// CHECK-NEXT:    T: if [B9.4] +// CHECK-NEXT:    Preds (1): B10 +// CHECK-NEXT:    Succs (2): B8 B7 +// CHECK:       [B10] +// CHECK-NEXT:    1: b +// CHECK-NEXT:    2: [B10.1] (ImplicitCastExpr, NoOp, const class A) +// CHECK-NEXT:    3: [B10.2] (CXXConstructExpr, class A) +// CHECK-NEXT:    4: A c = b; +// CHECK-NEXT:    5: c +// CHECK-NEXT:    6: [B10.5] (ImplicitCastExpr, NoOp, const class A) +// CHECK-NEXT:    7: [B10.6].operator int +// CHECK-NEXT:    8: [B10.6] +// CHECK-NEXT:    9: [B10.8] (ImplicitCastExpr, UserDefinedConversion, int) +// CHECK-NEXT:   10: [B10.9] (ImplicitCastExpr, IntegralToBoolean, _Bool) +// CHECK-NEXT:    T: for (...; [B10.10]; ) +// CHECK-NEXT:    Preds (2): B2 B11 +// CHECK-NEXT:    Succs (2): B9 B1 +// CHECK:       [B11] +// CHECK-NEXT:    1:  (CXXConstructExpr, class A) +// CHECK-NEXT:    2: A a; +// CHECK-NEXT:    3:  (CXXConstructExpr, class A) +// CHECK-NEXT:    4: A b; +// CHECK-NEXT:    Preds (1): B12 +// CHECK-NEXT:    Succs (1): B10 +// CHECK:       [B0 (EXIT)] +// CHECK-NEXT:    Preds (2): B1 B4 +void test_for_jumps() { +  A a; +  for (A b; A c = b;) { +    A d; +    if (UV) +      break; +    if (UV) +      continue; +    if (UV) +      return; +    A e; +  } +  A f; +} + +// CHECK:       [B2 (ENTRY)] +// CHECK-NEXT:    Succs (1): B1 +// CHECK:       [B1] +// CHECK-NEXT:    1:  (CXXConstructExpr, class A) +// CHECK-NEXT:    2: A a; +// CHECK-NEXT:    3: int n; +// CHECK-NEXT:    4: n +// CHECK-NEXT:    5: &[B1.4] +// CHECK-NEXT:    6: a +// CHECK-NEXT:    7: [B1.6].p +// CHECK-NEXT:    8: [B1.7] = [B1.5] +// CHECK-NEXT:    9: [B1.2] (Lifetime ends) +// CHECK-NEXT:   10: [B1.3] (Lifetime ends) +// CHECK-NEXT:    Preds (1): B2 +// CHECK-NEXT:    Succs (1): B0 +// CHECK:       [B0 (EXIT)] +// CHECK-NEXT:    Preds (1): B1 +void test_trivial_vs_non_trivial_order() { +  A a; +  int n; +  a.p = &n; +} + +// CHECK:       [B4 (ENTRY)] +// CHECK-NEXT:    Succs (1): B3 +// CHECK:       [B1] +// CHECK-NEXT:   a: +// CHECK-NEXT:    1: 1 +// CHECK-NEXT:    2: i +// CHECK-NEXT:    3: [B1.2] = [B1.1] +// CHECK-NEXT:    4: [B2.1] (Lifetime ends) +// CHECK-NEXT:    Preds (2): B2 B3 +// CHECK-NEXT:    Succs (1): B0 +// CHECK:       [B2] +// CHECK-NEXT:    1: int i; +// CHECK-NEXT:    Succs (1): B1 +// CHECK:       [B3] +// CHECK-NEXT:    T: goto a; +// CHECK-NEXT:    Preds (1): B4 +// CHECK-NEXT:    Succs (1): B1 +// CHECK:       [B0 (EXIT)] +// CHECK-NEXT:    Preds (1): B1 +void goto_past_declaration() { +  goto a; +  int i; +a: +  i = 1; +} + +// CHECK:       [B4 (ENTRY)] +// CHECK-NEXT:    Succs (1): B3 +// CHECK:       [B1] +// CHECK-NEXT:   a: +// CHECK-NEXT:    1: 1 +// CHECK-NEXT:    2: k +// CHECK-NEXT:    3: [B1.2] = [B1.1] +// CHECK-NEXT:    4: [B2.4] (Lifetime ends) +// CHECK-NEXT:    Preds (2): B2 B3 +// CHECK-NEXT:    Succs (1): B0 +// CHECK:       [B2] +// CHECK-NEXT:    1: int j; +// CHECK-NEXT:    2: [B2.1] (Lifetime ends) +// CHECK-NEXT:    3: [B3.1] (Lifetime ends) +// CHECK-NEXT:    4: int k; +// CHECK-NEXT:    Succs (1): B1 +// CHECK:       [B3] +// CHECK-NEXT:    1: int i; +// CHECK-NEXT:    2: [B3.1] (Lifetime ends) +// CHECK-NEXT:    T: goto a; +// CHECK-NEXT:    Preds (1): B4 +// CHECK-NEXT:    Succs (1): B1 +// CHECK:       [B0 (EXIT)] +// CHECK-NEXT:    Preds (1): B1 +void goto_past_declaration2() { +  { +    int i; +    goto a; +    int j; +  } +  { +    int k; +  a: +    k = 1; +  } +} + +struct B { +  ~B(); +}; + +// CHECK:       [B4 (ENTRY)] +// CHECK-NEXT:    Succs (1): B3 +// CHECK:       [B1] +// CHECK-NEXT:    1: i +// CHECK-NEXT:    2: [B1.1]++ +// CHECK-NEXT:    3: [B2.2] (Lifetime ends) +// CHECK-NEXT:    4: [B3.1] (Lifetime ends) +// CHECK-NEXT:    Succs (1): B0 +// CHECK:       [B2] +// CHECK-NEXT:   label: +// CHECK-NEXT:    1:  (CXXConstructExpr, struct B) +// CHECK-NEXT:    2: B b; +// CHECK-NEXT:    3: [B2.2] (Lifetime ends) +// CHECK-NEXT:    T: goto label; +// CHECK-NEXT:    Preds (2): B3 B2 +// CHECK-NEXT:    Succs (1): B2 +// CHECK:       [B3] +// CHECK-NEXT:    1: int i; +// CHECK-NEXT:    Preds (1): B4 +// CHECK-NEXT:    Succs (1): B2 +// CHECK:       [B0 (EXIT)] +// CHECK-NEXT:    Preds (1): B1 +int backpatched_goto() { +  int i; +label: +  B b; +  goto label; +  i++; +} diff --git a/test/CXX/except/except.spec/p11.cpp b/test/CXX/except/except.spec/p11.cpp index 196f84c557ea..b7b9fcb23144 100644 --- a/test/CXX/except/except.spec/p11.cpp +++ b/test/CXX/except/except.spec/p11.cpp @@ -1,10 +1,10 @@  // RUN: %clang_cc1 -std=c++11 -fexceptions -fcxx-exceptions -fsyntax-only -verify %s  // This is the "let the user shoot themselves in the foot" clause. -void f() noexcept { // expected-note {{non-throwing function declare here}} +void f() noexcept { // expected-note {{function declared non-throwing here}}    throw 0; // expected-warning {{has a non-throwing exception specification but}}   } -void g() throw() { // expected-note {{non-throwing function declare here}} +void g() throw() { // expected-note {{function declared non-throwing here}}    throw 0; // expected-warning {{has a non-throwing exception specification but}}   }  void h() throw(int) { diff --git a/test/CXX/modules-ts/basic/basic.def.odr/p4/module.cpp b/test/CXX/modules-ts/basic/basic.def.odr/p4/module.cpp new file mode 100644 index 000000000000..dc6a3635a8ee --- /dev/null +++ b/test/CXX/modules-ts/basic/basic.def.odr/p4/module.cpp @@ -0,0 +1,46 @@ +// RUN: %clang_cc1 -fmodules-ts %S/module.cppm -triple %itanium_abi_triple -emit-module-interface -o %t +// RUN: %clang_cc1 -fmodules-ts %s -triple %itanium_abi_triple -fmodule-file=%t -emit-llvm -o - | FileCheck %s --implicit-check-not=unused --implicit-check-not=global_module + +// CHECK-DAG: @extern_var_exported = external global +// FIXME: Should this be 'external global'? +// CHECK-DAG: @inline_var_exported = linkonce_odr global +// CHECK-DAG: @_ZL19static_var_exported = external global +// CHECK-DAG: @const_var_exported = external constant +// +// FIXME: The module name should be mangled into all of these. +// CHECK-DAG: @extern_var_module_linkage = external global +// FIXME: Should this be 'external global'? +// CHECK-DAG: @inline_var_module_linkage = linkonce_odr global +// CHECK-DAG: @_ZL25static_var_module_linkage = external global +// CHECK-DAG: @_ZL24const_var_module_linkage = external constant + +module Module; + +void use() { +  // CHECK: define linkonce_odr {{.*}}@_Z20used_inline_exportedv +  used_inline_exported(); +  // CHECK: declare {{.*}}@_Z18noninline_exportedv +  noninline_exported(); + +  (void)&extern_var_exported; +  (void)&inline_var_exported; +  (void)&static_var_exported; // FIXME: Should not be exported. +  (void)&const_var_exported; + +  // FIXME: This symbol should not be visible here. +  // CHECK: declare {{.*}}@_ZL26used_static_module_linkagev +  used_static_module_linkage(); + +  // FIXME: The module name should be mangled into the name of this function. +  // CHECK: define linkonce_odr {{.*}}@_Z26used_inline_module_linkagev +  used_inline_module_linkage(); + +  // FIXME: The module name should be mangled into the name of this function. +  // CHECK: declare {{.*}}@_Z24noninline_module_linkagev +  noninline_module_linkage(); + +  (void)&extern_var_module_linkage; +  (void)&inline_var_module_linkage; +  (void)&static_var_module_linkage; // FIXME: Should not be visible here. +  (void)&const_var_module_linkage; +} diff --git a/test/CXX/modules-ts/basic/basic.def.odr/p4/module.cppm b/test/CXX/modules-ts/basic/basic.def.odr/p4/module.cppm new file mode 100644 index 000000000000..d452f741a0fb --- /dev/null +++ b/test/CXX/modules-ts/basic/basic.def.odr/p4/module.cppm @@ -0,0 +1,118 @@ +// RUN: %clang_cc1 -fmodules-ts %s -triple %itanium_abi_triple -emit-llvm -o - | FileCheck %s --implicit-check-not unused_inline --implicit-check-not unused_stastic_global_module + +// CHECK-DAG: @extern_var_global_module = external global +// CHECK-DAG: @inline_var_global_module = linkonce_odr global +// CHECK-DAG: @_ZL24static_var_global_module = internal global +// CHECK-DAG: @_ZL23const_var_global_module = internal constant +// +// For ABI compatibility, these symbols do not include the module name. +// CHECK-DAG: @extern_var_exported = external global +// FIXME: Should this be 'weak_odr global'? Presumably it must be, since we +// can discard this global and its initializer (if any), and other TUs are not +// permitted to run the initializer for this variable. +// CHECK-DAG: @inline_var_exported = linkonce_odr global +// CHECK-DAG: @_ZL19static_var_exported = global +// CHECK-DAG: @const_var_exported = constant +// +// FIXME: The module name should be mangled into all of these. +// CHECK-DAG: @extern_var_module_linkage = external global +// FIXME: Should this be 'weak_odr global'? Presumably it must be, since we +// can discard this global and its initializer (if any), and other TUs are not +// permitted to run the initializer for this variable. +// CHECK-DAG: @inline_var_module_linkage = linkonce_odr global +// CHECK-DAG: @_ZL25static_var_module_linkage = global +// CHECK-DAG: @_ZL24const_var_module_linkage = constant + +static void unused_static_global_module() {} +static void used_static_global_module() {} + +inline void unused_inline_global_module() {} +inline void used_inline_global_module() {} + +extern int extern_var_global_module; +inline int inline_var_global_module; +static int static_var_global_module; +const int const_var_global_module = 3; + +// CHECK: define void {{.*}}@_Z23noninline_global_modulev +void noninline_global_module() { +  // FIXME: This should be promoted to module linkage and given a +  // module-mangled name, if it's called from an inline function within +  // the module interface. +  // (We should try to avoid this when it's not reachable from outside +  // the module interface unit.) +  // CHECK: define internal {{.*}}@_ZL25used_static_global_modulev +  used_static_global_module(); +  // CHECK: define linkonce_odr {{.*}}@_Z25used_inline_global_modulev +  used_inline_global_module(); + +  (void)&extern_var_global_module; +  (void)&inline_var_global_module; +  (void)&static_var_global_module; +  (void)&const_var_global_module; +} + +export module Module; + +export { +  // FIXME: These should be ill-formed: you can't export an internal linkage +  // symbol, per [dcl.module.interface]p2. +  // CHECK: define void {{.*}}@_ZL22unused_static_exportedv +  static void unused_static_exported() {} +  // CHECK: define void {{.*}}@_ZL20used_static_exportedv +  static void used_static_exported() {} + +  inline void unused_inline_exported() {} +  inline void used_inline_exported() {} + +  extern int extern_var_exported; +  inline int inline_var_exported; +  // FIXME: This should be ill-formed: you can't export an internal linkage +  // symbol. +  static int static_var_exported; +  const int const_var_exported = 3; + +  // CHECK: define void {{.*}}@_Z18noninline_exportedv +  void noninline_exported() { +    used_static_exported(); +    // CHECK: define linkonce_odr {{.*}}@_Z20used_inline_exportedv +    used_inline_exported(); + +    (void)&extern_var_exported; +    (void)&inline_var_exported; +    (void)&static_var_exported; +    (void)&const_var_exported; +  } +} + +// FIXME: Ideally we wouldn't emit this as its name is not visible outside this +// TU, but this module interface might contain a template that can use this +// function so we conservatively emit it for now. +// FIXME: The module name should be mangled into the name of this function. +// CHECK: define void {{.*}}@_ZL28unused_static_module_linkagev +static void unused_static_module_linkage() {} +// FIXME: The module name should be mangled into the name of this function. +// CHECK: define void {{.*}}@_ZL26used_static_module_linkagev +static void used_static_module_linkage() {} + +inline void unused_inline_module_linkage() {} +inline void used_inline_module_linkage() {} + +extern int extern_var_module_linkage; +inline int inline_var_module_linkage; +static int static_var_module_linkage; +const int const_var_module_linkage = 3; + +// FIXME: The module name should be mangled into the name of this function. +// CHECK: define void {{.*}}@_Z24noninline_module_linkagev +void noninline_module_linkage() { +  used_static_module_linkage(); +  // FIXME: The module name should be mangled into the name of this function. +  // CHECK: define linkonce_odr {{.*}}@_Z26used_inline_module_linkagev +  used_inline_module_linkage(); + +  (void)&extern_var_module_linkage; +  (void)&inline_var_module_linkage; +  (void)&static_var_module_linkage; +  (void)&const_var_module_linkage; +} diff --git a/test/CXX/modules-ts/basic/basic.def.odr/p4/user.cpp b/test/CXX/modules-ts/basic/basic.def.odr/p4/user.cpp new file mode 100644 index 000000000000..f6e0238c6b4b --- /dev/null +++ b/test/CXX/modules-ts/basic/basic.def.odr/p4/user.cpp @@ -0,0 +1,25 @@ +// RUN: %clang_cc1 -fmodules-ts %S/module.cppm -triple %itanium_abi_triple -emit-module-interface -o %t +// RUN: %clang_cc1 -fmodules-ts %s -triple %itanium_abi_triple -fmodule-file=%t -emit-llvm -o - | FileCheck %s --implicit-check-not=unused --implicit-check-not=global_module + +// CHECK-DAG: @extern_var_exported = external global +// FIXME: Should this be 'external global'? +// CHECK-DAG: @inline_var_exported = linkonce_odr global +// FIXME: These should be 'extern global' and 'extern constant'. +// CHECK-DAG: @_ZL19static_var_exported = global +// CHECK-DAG: @const_var_exported = constant + +import Module; + +void use() { +  // CHECK: define linkonce_odr {{.*}}@_Z20used_inline_exportedv +  used_inline_exported(); +  // CHECK: declare {{.*}}@_Z18noninline_exportedv +  noninline_exported(); + +  (void)&extern_var_exported; +  (void)&inline_var_exported; +  (void)&static_var_exported; +  (void)&const_var_exported; + +  // Module-linkage declarations are not visible here. +} diff --git a/test/CXX/modules-ts/basic/basic.link/p2/module.cpp b/test/CXX/modules-ts/basic/basic.link/p2/module.cpp new file mode 100644 index 000000000000..3fc6044d8e94 --- /dev/null +++ b/test/CXX/modules-ts/basic/basic.link/p2/module.cpp @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 -std=c++1z -fmodules-ts %S/module.cppm -emit-module-interface -o %t +// RUN: %clang_cc1 -std=c++1z -fmodules-ts -fmodule-file=%t %s -verify +// expected-no-diagnostics +module M; + +// FIXME: Use of internal linkage entities should be rejected. +void use_from_module_impl() { +  external_linkage_fn(); +  module_linkage_fn(); +  internal_linkage_fn(); +  (void)external_linkage_class{}; +  (void)module_linkage_class{}; +  (void)internal_linkage_class{}; +  (void)external_linkage_var; +  (void)module_linkage_var; +  (void)internal_linkage_var; +} diff --git a/test/CXX/modules-ts/basic/basic.link/p2/module.cppm b/test/CXX/modules-ts/basic/basic.link/p2/module.cppm new file mode 100644 index 000000000000..bb261700db84 --- /dev/null +++ b/test/CXX/modules-ts/basic/basic.link/p2/module.cppm @@ -0,0 +1,29 @@ +// RUN: %clang_cc1 -std=c++1z -fmodules-ts %s -verify +// expected-no-diagnostics +export module M; + +export int external_linkage_var; +int module_linkage_var; +static int internal_linkage_var; + +export void external_linkage_fn() {} +void module_linkage_fn() {} +static void internal_linkage_fn() {} + +export struct external_linkage_class {}; +struct module_linkage_class {}; +namespace { +  struct internal_linkage_class {}; +} + +void use() { +  external_linkage_fn(); +  module_linkage_fn(); +  internal_linkage_fn(); +  (void)external_linkage_class{}; +  (void)module_linkage_class{}; +  (void)internal_linkage_class{}; +  (void)external_linkage_var; +  (void)module_linkage_var; +  (void)internal_linkage_var; +} diff --git a/test/CXX/modules-ts/basic/basic.link/p2/other.cpp b/test/CXX/modules-ts/basic/basic.link/p2/other.cpp new file mode 100644 index 000000000000..8370777e7ed4 --- /dev/null +++ b/test/CXX/modules-ts/basic/basic.link/p2/other.cpp @@ -0,0 +1,16 @@ +// RUN: %clang_cc1 -std=c++1z -fmodules-ts %S/module.cppm -emit-module-interface -o %t +// RUN: %clang_cc1 -std=c++1z -fmodules-ts -fmodule-file=%t %s -verify +import M; + +void use_from_module_impl() { +  external_linkage_fn(); +  module_linkage_fn(); // expected-error {{undeclared identifier}} +  internal_linkage_fn(); // expected-error {{undeclared identifier}} +  (void)external_linkage_class{}; +  (void)module_linkage_class{}; // expected-error {{undeclared identifier}} expected-error 0+{{}} +  (void)internal_linkage_class{}; // expected-error {{undeclared identifier}} expected-error 0+{{}} +  // expected-note@module.cppm:9 {{here}} +  (void)external_linkage_var; +  (void)module_linkage_var; // expected-error {{undeclared identifier}} +  (void)internal_linkage_var; // expected-error {{undeclared identifier}} +} diff --git a/test/CXX/modules-ts/dcl.dcl/dcl.module/dcl.module.import/p1.cpp b/test/CXX/modules-ts/dcl.dcl/dcl.module/dcl.module.import/p1.cpp index aaf43d6584a4..aad31b4b46d1 100644 --- a/test/CXX/modules-ts/dcl.dcl/dcl.module/dcl.module.import/p1.cpp +++ b/test/CXX/modules-ts/dcl.dcl/dcl.module/dcl.module.import/p1.cpp @@ -1,7 +1,7 @@  // RUN: rm -rf %t  // RUN: mkdir -p %t -// RUN: echo 'export module x; int a, b;' > %t/x.cppm -// RUN: echo 'export module x.y; int c;' > %t/x.y.cppm +// RUN: echo 'export module x; export int a, b;' > %t/x.cppm +// RUN: echo 'export module x.y; export int c;' > %t/x.y.cppm  //  // RUN: %clang_cc1 -std=c++1z -fmodules-ts -emit-module-interface %t/x.cppm -o %t/x.pcm  // RUN: %clang_cc1 -std=c++1z -fmodules-ts -emit-module-interface -fmodule-file=%t/x.pcm %t/x.y.cppm -o %t/x.y.pcm diff --git a/test/CXX/modules-ts/dcl.dcl/dcl.module/p5.cpp b/test/CXX/modules-ts/dcl.dcl/dcl.module/p5.cpp new file mode 100644 index 000000000000..734b89173df9 --- /dev/null +++ b/test/CXX/modules-ts/dcl.dcl/dcl.module/p5.cpp @@ -0,0 +1,33 @@ +// RUN: rm -f %t +// RUN: %clang_cc1 -std=c++1z -fmodules-ts -emit-module-interface %s -o %t -DINTERFACE +// RUN: %clang_cc1 -std=c++1z -fmodules-ts -fmodule-file=%t %s -verify -DIMPLEMENTATION +// RUN: %clang_cc1 -std=c++1z -fmodules-ts -fmodule-file=%t %s -verify -DEARLY_IMPLEMENTATION +// RUN: %clang_cc1 -std=c++1z -fmodules-ts -fmodule-file=%t %s -verify -DUSER + +// expected-no-diagnostics + +#ifdef USER +import Foo; +#endif + +#ifdef EARLY_IMPLEMENTATION +module Foo; +#endif + +template<typename T> struct type_template { +  typedef T type; +  void f(type); +}; + +template<typename T> void type_template<T>::f(type) {} + +template<int = 0, typename = int, template<typename> class = type_template> +struct default_template_args {}; + +#ifdef INTERFACE +export module Foo; +#endif + +#ifdef IMPLEMENTATION +module Foo; +#endif diff --git a/test/CodeGen/aarch64-neon-intrinsics.c b/test/CodeGen/aarch64-neon-intrinsics.c index cbc2e72fcbac..bcb680c4b518 100644 --- a/test/CodeGen/aarch64-neon-intrinsics.c +++ b/test/CodeGen/aarch64-neon-intrinsics.c @@ -9037,9 +9037,10 @@ int64x2_t test_vld1q_s64(int64_t const *a) {  // CHECK-LABEL: @test_vld1q_f16(  // CHECK:   [[TMP0:%.*]] = bitcast half* %a to i8* -// CHECK:   [[TMP1:%.*]] = bitcast i8* [[TMP0]] to <8 x half>* -// CHECK:   [[TMP2:%.*]] = load <8 x half>, <8 x half>* [[TMP1]] -// CHECK:   ret <8 x half> [[TMP2]] +// CHECK:   [[TMP1:%.*]] = bitcast i8* [[TMP0]] to <8 x i16>* +// CHECK:   [[TMP2:%.*]] = load <8 x i16>, <8 x i16>* [[TMP1]] +// CHECK:   [[TMP3:%.*]] = bitcast <8 x i16> [[TMP2]] to <8 x half> +// CHECK:   ret <8 x half> [[TMP3]]  float16x8_t test_vld1q_f16(float16_t const *a) {    return vld1q_f16(a);  } @@ -9151,9 +9152,10 @@ int64x1_t test_vld1_s64(int64_t const *a) {  // CHECK-LABEL: @test_vld1_f16(  // CHECK:   [[TMP0:%.*]] = bitcast half* %a to i8* -// CHECK:   [[TMP1:%.*]] = bitcast i8* [[TMP0]] to <4 x half>* -// CHECK:   [[TMP2:%.*]] = load <4 x half>, <4 x half>* [[TMP1]] -// CHECK:   ret <4 x half> [[TMP2]] +// CHECK:   [[TMP1:%.*]] = bitcast i8* [[TMP0]] to <4 x i16>* +// CHECK:   [[TMP2:%.*]] = load <4 x i16>, <4 x i16>* [[TMP1]] +// CHECK:   [[TMP3:%.*]] = bitcast <4 x i16> [[TMP2]] to <4 x half> +// CHECK:   ret <4 x half> [[TMP3]]  float16x4_t test_vld1_f16(float16_t const *a) {    return vld1_f16(a);  } @@ -9340,10 +9342,10 @@ int64x2x2_t test_vld2q_s64(int64_t const *a) {  // CHECK:   [[__RET:%.*]] = alloca %struct.float16x8x2_t, align 16  // CHECK:   [[TMP0:%.*]] = bitcast %struct.float16x8x2_t* [[__RET]] to i8*  // CHECK:   [[TMP1:%.*]] = bitcast half* %a to i8* -// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to <8 x half>* -// CHECK:   [[VLD2:%.*]] = call { <8 x half>, <8 x half> } @llvm.aarch64.neon.ld2.v8f16.p0v8f16(<8 x half>* [[TMP2]]) -// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <8 x half>, <8 x half> }* -// CHECK:   store { <8 x half>, <8 x half> } [[VLD2]], { <8 x half>, <8 x half> }* [[TMP3]] +// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to <8 x i16>* +// CHECK:   [[VLD2:%.*]] = call { <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld2.v8i16.p0v8i16(<8 x i16>* [[TMP2]]) +// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <8 x i16>, <8 x i16> }* +// CHECK:   store { <8 x i16>, <8 x i16> } [[VLD2]], { <8 x i16>, <8 x i16> }* [[TMP3]]  // CHECK:   [[TMP4:%.*]] = bitcast %struct.float16x8x2_t* [[RETVAL]] to i8*  // CHECK:   [[TMP5:%.*]] = bitcast %struct.float16x8x2_t* [[__RET]] to i8*  // CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[TMP4]], i8* [[TMP5]], i64 32, i32 16, i1 false) @@ -9571,10 +9573,10 @@ int64x1x2_t test_vld2_s64(int64_t const *a) {  // CHECK:   [[__RET:%.*]] = alloca %struct.float16x4x2_t, align 8  // CHECK:   [[TMP0:%.*]] = bitcast %struct.float16x4x2_t* [[__RET]] to i8*  // CHECK:   [[TMP1:%.*]] = bitcast half* %a to i8* -// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to <4 x half>* -// CHECK:   [[VLD2:%.*]] = call { <4 x half>, <4 x half> } @llvm.aarch64.neon.ld2.v4f16.p0v4f16(<4 x half>* [[TMP2]]) -// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <4 x half>, <4 x half> }* -// CHECK:   store { <4 x half>, <4 x half> } [[VLD2]], { <4 x half>, <4 x half> }* [[TMP3]] +// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to <4 x i16>* +// CHECK:   [[VLD2:%.*]] = call { <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld2.v4i16.p0v4i16(<4 x i16>* [[TMP2]]) +// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <4 x i16>, <4 x i16> }* +// CHECK:   store { <4 x i16>, <4 x i16> } [[VLD2]], { <4 x i16>, <4 x i16> }* [[TMP3]]  // CHECK:   [[TMP4:%.*]] = bitcast %struct.float16x4x2_t* [[RETVAL]] to i8*  // CHECK:   [[TMP5:%.*]] = bitcast %struct.float16x4x2_t* [[__RET]] to i8*  // CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[TMP4]], i8* [[TMP5]], i64 16, i32 8, i1 false) @@ -9802,10 +9804,10 @@ int64x2x3_t test_vld3q_s64(int64_t const *a) {  // CHECK:   [[__RET:%.*]] = alloca %struct.float16x8x3_t, align 16  // CHECK:   [[TMP0:%.*]] = bitcast %struct.float16x8x3_t* [[__RET]] to i8*  // CHECK:   [[TMP1:%.*]] = bitcast half* %a to i8* -// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to <8 x half>* -// CHECK:   [[VLD3:%.*]] = call { <8 x half>, <8 x half>, <8 x half> } @llvm.aarch64.neon.ld3.v8f16.p0v8f16(<8 x half>* [[TMP2]]) -// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <8 x half>, <8 x half>, <8 x half> }* -// CHECK:   store { <8 x half>, <8 x half>, <8 x half> } [[VLD3]], { <8 x half>, <8 x half>, <8 x half> }* [[TMP3]] +// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to <8 x i16>* +// CHECK:   [[VLD3:%.*]] = call { <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld3.v8i16.p0v8i16(<8 x i16>* [[TMP2]]) +// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <8 x i16>, <8 x i16>, <8 x i16> }* +// CHECK:   store { <8 x i16>, <8 x i16>, <8 x i16> } [[VLD3]], { <8 x i16>, <8 x i16>, <8 x i16> }* [[TMP3]]  // CHECK:   [[TMP4:%.*]] = bitcast %struct.float16x8x3_t* [[RETVAL]] to i8*  // CHECK:   [[TMP5:%.*]] = bitcast %struct.float16x8x3_t* [[__RET]] to i8*  // CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[TMP4]], i8* [[TMP5]], i64 48, i32 16, i1 false) @@ -10033,10 +10035,10 @@ int64x1x3_t test_vld3_s64(int64_t const *a) {  // CHECK:   [[__RET:%.*]] = alloca %struct.float16x4x3_t, align 8  // CHECK:   [[TMP0:%.*]] = bitcast %struct.float16x4x3_t* [[__RET]] to i8*  // CHECK:   [[TMP1:%.*]] = bitcast half* %a to i8* -// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to <4 x half>* -// CHECK:   [[VLD3:%.*]] = call { <4 x half>, <4 x half>, <4 x half> } @llvm.aarch64.neon.ld3.v4f16.p0v4f16(<4 x half>* [[TMP2]]) -// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <4 x half>, <4 x half>, <4 x half> }* -// CHECK:   store { <4 x half>, <4 x half>, <4 x half> } [[VLD3]], { <4 x half>, <4 x half>, <4 x half> }* [[TMP3]] +// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to <4 x i16>* +// CHECK:   [[VLD3:%.*]] = call { <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld3.v4i16.p0v4i16(<4 x i16>* [[TMP2]]) +// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <4 x i16>, <4 x i16>, <4 x i16> }* +// CHECK:   store { <4 x i16>, <4 x i16>, <4 x i16> } [[VLD3]], { <4 x i16>, <4 x i16>, <4 x i16> }* [[TMP3]]  // CHECK:   [[TMP4:%.*]] = bitcast %struct.float16x4x3_t* [[RETVAL]] to i8*  // CHECK:   [[TMP5:%.*]] = bitcast %struct.float16x4x3_t* [[__RET]] to i8*  // CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[TMP4]], i8* [[TMP5]], i64 24, i32 8, i1 false) @@ -10264,10 +10266,10 @@ int64x2x4_t test_vld4q_s64(int64_t const *a) {  // CHECK:   [[__RET:%.*]] = alloca %struct.float16x8x4_t, align 16  // CHECK:   [[TMP0:%.*]] = bitcast %struct.float16x8x4_t* [[__RET]] to i8*  // CHECK:   [[TMP1:%.*]] = bitcast half* %a to i8* -// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to <8 x half>* -// CHECK:   [[VLD4:%.*]] = call { <8 x half>, <8 x half>, <8 x half>, <8 x half> } @llvm.aarch64.neon.ld4.v8f16.p0v8f16(<8 x half>* [[TMP2]]) -// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <8 x half>, <8 x half>, <8 x half>, <8 x half> }* -// CHECK:   store { <8 x half>, <8 x half>, <8 x half>, <8 x half> } [[VLD4]], { <8 x half>, <8 x half>, <8 x half>, <8 x half> }* [[TMP3]] +// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to <8 x i16>* +// CHECK:   [[VLD4:%.*]] = call { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld4.v8i16.p0v8i16(<8 x i16>* [[TMP2]]) +// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> }* +// CHECK:   store { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } [[VLD4]], { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> }* [[TMP3]]  // CHECK:   [[TMP4:%.*]] = bitcast %struct.float16x8x4_t* [[RETVAL]] to i8*  // CHECK:   [[TMP5:%.*]] = bitcast %struct.float16x8x4_t* [[__RET]] to i8*  // CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[TMP4]], i8* [[TMP5]], i64 64, i32 16, i1 false) @@ -10495,10 +10497,10 @@ int64x1x4_t test_vld4_s64(int64_t const *a) {  // CHECK:   [[__RET:%.*]] = alloca %struct.float16x4x4_t, align 8  // CHECK:   [[TMP0:%.*]] = bitcast %struct.float16x4x4_t* [[__RET]] to i8*  // CHECK:   [[TMP1:%.*]] = bitcast half* %a to i8* -// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to <4 x half>* -// CHECK:   [[VLD4:%.*]] = call { <4 x half>, <4 x half>, <4 x half>, <4 x half> } @llvm.aarch64.neon.ld4.v4f16.p0v4f16(<4 x half>* [[TMP2]]) -// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <4 x half>, <4 x half>, <4 x half>, <4 x half> }* -// CHECK:   store { <4 x half>, <4 x half>, <4 x half>, <4 x half> } [[VLD4]], { <4 x half>, <4 x half>, <4 x half>, <4 x half> }* [[TMP3]] +// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to <4 x i16>* +// CHECK:   [[VLD4:%.*]] = call { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld4.v4i16.p0v4i16(<4 x i16>* [[TMP2]]) +// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> }* +// CHECK:   store { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } [[VLD4]], { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> }* [[TMP3]]  // CHECK:   [[TMP4:%.*]] = bitcast %struct.float16x4x4_t* [[RETVAL]] to i8*  // CHECK:   [[TMP5:%.*]] = bitcast %struct.float16x4x4_t* [[__RET]] to i8*  // CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[TMP4]], i8* [[TMP5]], i64 32, i32 8, i1 false) @@ -10664,9 +10666,9 @@ void test_vst1q_s64(int64_t *a, int64x2_t b) {  // CHECK-LABEL: @test_vst1q_f16(  // CHECK:   [[TMP0:%.*]] = bitcast half* %a to i8*  // CHECK:   [[TMP1:%.*]] = bitcast <8 x half> %b to <16 x i8> -// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP0]] to <8 x half>* -// CHECK:   [[TMP3:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x half> -// CHECK:   store <8 x half> [[TMP3]], <8 x half>* [[TMP2]] +// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP0]] to <8 x i16>* +// CHECK:   [[TMP3:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x i16> +// CHECK:   store <8 x i16> [[TMP3]], <8 x i16>* [[TMP2]]  // CHECK:   ret void  void test_vst1q_f16(float16_t *a, float16x8_t b) {    vst1q_f16(a, b); @@ -10798,9 +10800,9 @@ void test_vst1_s64(int64_t *a, int64x1_t b) {  // CHECK-LABEL: @test_vst1_f16(  // CHECK:   [[TMP0:%.*]] = bitcast half* %a to i8*  // CHECK:   [[TMP1:%.*]] = bitcast <4 x half> %b to <8 x i8> -// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP0]] to <4 x half>* -// CHECK:   [[TMP3:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x half> -// CHECK:   store <4 x half> [[TMP3]], <4 x half>* [[TMP2]] +// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP0]] to <4 x i16>* +// CHECK:   [[TMP3:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x i16> +// CHECK:   store <4 x i16> [[TMP3]], <4 x i16>* [[TMP2]]  // CHECK:   ret void  void test_vst1_f16(float16_t *a, float16x4_t b) {    vst1_f16(a, b); @@ -11054,9 +11056,9 @@ void test_vst2q_s64(int64_t *a, int64x2x2_t b) {  // CHECK:   [[ARRAYIDX2:%.*]] = getelementptr inbounds [2 x <8 x half>], [2 x <8 x half>]* [[VAL1]], i64 0, i64 1  // CHECK:   [[TMP5:%.*]] = load <8 x half>, <8 x half>* [[ARRAYIDX2]], align 16  // CHECK:   [[TMP6:%.*]] = bitcast <8 x half> [[TMP5]] to <16 x i8> -// CHECK:   [[TMP7:%.*]] = bitcast <16 x i8> [[TMP4]] to <8 x half> -// CHECK:   [[TMP8:%.*]] = bitcast <16 x i8> [[TMP6]] to <8 x half> -// CHECK:   call void @llvm.aarch64.neon.st2.v8f16.p0i8(<8 x half> [[TMP7]], <8 x half> [[TMP8]], i8* [[TMP2]]) +// CHECK:   [[TMP7:%.*]] = bitcast <16 x i8> [[TMP4]] to <8 x i16> +// CHECK:   [[TMP8:%.*]] = bitcast <16 x i8> [[TMP6]] to <8 x i16> +// CHECK:   call void @llvm.aarch64.neon.st2.v8i16.p0i8(<8 x i16> [[TMP7]], <8 x i16> [[TMP8]], i8* [[TMP2]])  // CHECK:   ret void  void test_vst2q_f16(float16_t *a, float16x8x2_t b) {    vst2q_f16(a, b); @@ -11364,9 +11366,9 @@ void test_vst2_s64(int64_t *a, int64x1x2_t b) {  // CHECK:   [[ARRAYIDX2:%.*]] = getelementptr inbounds [2 x <4 x half>], [2 x <4 x half>]* [[VAL1]], i64 0, i64 1  // CHECK:   [[TMP5:%.*]] = load <4 x half>, <4 x half>* [[ARRAYIDX2]], align 8  // CHECK:   [[TMP6:%.*]] = bitcast <4 x half> [[TMP5]] to <8 x i8> -// CHECK:   [[TMP7:%.*]] = bitcast <8 x i8> [[TMP4]] to <4 x half> -// CHECK:   [[TMP8:%.*]] = bitcast <8 x i8> [[TMP6]] to <4 x half> -// CHECK:   call void @llvm.aarch64.neon.st2.v4f16.p0i8(<4 x half> [[TMP7]], <4 x half> [[TMP8]], i8* [[TMP2]]) +// CHECK:   [[TMP7:%.*]] = bitcast <8 x i8> [[TMP4]] to <4 x i16> +// CHECK:   [[TMP8:%.*]] = bitcast <8 x i8> [[TMP6]] to <4 x i16> +// CHECK:   call void @llvm.aarch64.neon.st2.v4i16.p0i8(<4 x i16> [[TMP7]], <4 x i16> [[TMP8]], i8* [[TMP2]])  // CHECK:   ret void  void test_vst2_f16(float16_t *a, float16x4x2_t b) {    vst2_f16(a, b); @@ -11714,10 +11716,10 @@ void test_vst3q_s64(int64_t *a, int64x2x3_t b) {  // CHECK:   [[ARRAYIDX4:%.*]] = getelementptr inbounds [3 x <8 x half>], [3 x <8 x half>]* [[VAL3]], i64 0, i64 2  // CHECK:   [[TMP7:%.*]] = load <8 x half>, <8 x half>* [[ARRAYIDX4]], align 16  // CHECK:   [[TMP8:%.*]] = bitcast <8 x half> [[TMP7]] to <16 x i8> -// CHECK:   [[TMP9:%.*]] = bitcast <16 x i8> [[TMP4]] to <8 x half> -// CHECK:   [[TMP10:%.*]] = bitcast <16 x i8> [[TMP6]] to <8 x half> -// CHECK:   [[TMP11:%.*]] = bitcast <16 x i8> [[TMP8]] to <8 x half> -// CHECK:   call void @llvm.aarch64.neon.st3.v8f16.p0i8(<8 x half> [[TMP9]], <8 x half> [[TMP10]], <8 x half> [[TMP11]], i8* [[TMP2]]) +// CHECK:   [[TMP9:%.*]] = bitcast <16 x i8> [[TMP4]] to <8 x i16> +// CHECK:   [[TMP10:%.*]] = bitcast <16 x i8> [[TMP6]] to <8 x i16> +// CHECK:   [[TMP11:%.*]] = bitcast <16 x i8> [[TMP8]] to <8 x i16> +// CHECK:   call void @llvm.aarch64.neon.st3.v8i16.p0i8(<8 x i16> [[TMP9]], <8 x i16> [[TMP10]], <8 x i16> [[TMP11]], i8* [[TMP2]])  // CHECK:   ret void  void test_vst3q_f16(float16_t *a, float16x8x3_t b) {    vst3q_f16(a, b); @@ -12083,10 +12085,10 @@ void test_vst3_s64(int64_t *a, int64x1x3_t b) {  // CHECK:   [[ARRAYIDX4:%.*]] = getelementptr inbounds [3 x <4 x half>], [3 x <4 x half>]* [[VAL3]], i64 0, i64 2  // CHECK:   [[TMP7:%.*]] = load <4 x half>, <4 x half>* [[ARRAYIDX4]], align 8  // CHECK:   [[TMP8:%.*]] = bitcast <4 x half> [[TMP7]] to <8 x i8> -// CHECK:   [[TMP9:%.*]] = bitcast <8 x i8> [[TMP4]] to <4 x half> -// CHECK:   [[TMP10:%.*]] = bitcast <8 x i8> [[TMP6]] to <4 x half> -// CHECK:   [[TMP11:%.*]] = bitcast <8 x i8> [[TMP8]] to <4 x half> -// CHECK:   call void @llvm.aarch64.neon.st3.v4f16.p0i8(<4 x half> [[TMP9]], <4 x half> [[TMP10]], <4 x half> [[TMP11]], i8* [[TMP2]]) +// CHECK:   [[TMP9:%.*]] = bitcast <8 x i8> [[TMP4]] to <4 x i16> +// CHECK:   [[TMP10:%.*]] = bitcast <8 x i8> [[TMP6]] to <4 x i16> +// CHECK:   [[TMP11:%.*]] = bitcast <8 x i8> [[TMP8]] to <4 x i16> +// CHECK:   call void @llvm.aarch64.neon.st3.v4i16.p0i8(<4 x i16> [[TMP9]], <4 x i16> [[TMP10]], <4 x i16> [[TMP11]], i8* [[TMP2]])  // CHECK:   ret void  void test_vst3_f16(float16_t *a, float16x4x3_t b) {    vst3_f16(a, b); @@ -12492,11 +12494,11 @@ void test_vst4q_s64(int64_t *a, int64x2x4_t b) {  // CHECK:   [[ARRAYIDX6:%.*]] = getelementptr inbounds [4 x <8 x half>], [4 x <8 x half>]* [[VAL5]], i64 0, i64 3  // CHECK:   [[TMP9:%.*]] = load <8 x half>, <8 x half>* [[ARRAYIDX6]], align 16  // CHECK:   [[TMP10:%.*]] = bitcast <8 x half> [[TMP9]] to <16 x i8> -// CHECK:   [[TMP11:%.*]] = bitcast <16 x i8> [[TMP4]] to <8 x half> -// CHECK:   [[TMP12:%.*]] = bitcast <16 x i8> [[TMP6]] to <8 x half> -// CHECK:   [[TMP13:%.*]] = bitcast <16 x i8> [[TMP8]] to <8 x half> -// CHECK:   [[TMP14:%.*]] = bitcast <16 x i8> [[TMP10]] to <8 x half> -// CHECK:   call void @llvm.aarch64.neon.st4.v8f16.p0i8(<8 x half> [[TMP11]], <8 x half> [[TMP12]], <8 x half> [[TMP13]], <8 x half> [[TMP14]], i8* [[TMP2]]) +// CHECK:   [[TMP11:%.*]] = bitcast <16 x i8> [[TMP4]] to <8 x i16> +// CHECK:   [[TMP12:%.*]] = bitcast <16 x i8> [[TMP6]] to <8 x i16> +// CHECK:   [[TMP13:%.*]] = bitcast <16 x i8> [[TMP8]] to <8 x i16> +// CHECK:   [[TMP14:%.*]] = bitcast <16 x i8> [[TMP10]] to <8 x i16> +// CHECK:   call void @llvm.aarch64.neon.st4.v8i16.p0i8(<8 x i16> [[TMP11]], <8 x i16> [[TMP12]], <8 x i16> [[TMP13]], <8 x i16> [[TMP14]], i8* [[TMP2]])  // CHECK:   ret void  void test_vst4q_f16(float16_t *a, float16x8x4_t b) {    vst4q_f16(a, b); @@ -12920,11 +12922,11 @@ void test_vst4_s64(int64_t *a, int64x1x4_t b) {  // CHECK:   [[ARRAYIDX6:%.*]] = getelementptr inbounds [4 x <4 x half>], [4 x <4 x half>]* [[VAL5]], i64 0, i64 3  // CHECK:   [[TMP9:%.*]] = load <4 x half>, <4 x half>* [[ARRAYIDX6]], align 8  // CHECK:   [[TMP10:%.*]] = bitcast <4 x half> [[TMP9]] to <8 x i8> -// CHECK:   [[TMP11:%.*]] = bitcast <8 x i8> [[TMP4]] to <4 x half> -// CHECK:   [[TMP12:%.*]] = bitcast <8 x i8> [[TMP6]] to <4 x half> -// CHECK:   [[TMP13:%.*]] = bitcast <8 x i8> [[TMP8]] to <4 x half> -// CHECK:   [[TMP14:%.*]] = bitcast <8 x i8> [[TMP10]] to <4 x half> -// CHECK:   call void @llvm.aarch64.neon.st4.v4f16.p0i8(<4 x half> [[TMP11]], <4 x half> [[TMP12]], <4 x half> [[TMP13]], <4 x half> [[TMP14]], i8* [[TMP2]]) +// CHECK:   [[TMP11:%.*]] = bitcast <8 x i8> [[TMP4]] to <4 x i16> +// CHECK:   [[TMP12:%.*]] = bitcast <8 x i8> [[TMP6]] to <4 x i16> +// CHECK:   [[TMP13:%.*]] = bitcast <8 x i8> [[TMP8]] to <4 x i16> +// CHECK:   [[TMP14:%.*]] = bitcast <8 x i8> [[TMP10]] to <4 x i16> +// CHECK:   call void @llvm.aarch64.neon.st4.v4i16.p0i8(<4 x i16> [[TMP11]], <4 x i16> [[TMP12]], <4 x i16> [[TMP13]], <4 x i16> [[TMP14]], i8* [[TMP2]])  // CHECK:   ret void  void test_vst4_f16(float16_t *a, float16x4x4_t b) {    vst4_f16(a, b); @@ -13206,10 +13208,10 @@ int64x2x2_t test_vld1q_s64_x2(int64_t const *a) {  // CHECK:   [[__RET:%.*]] = alloca %struct.float16x8x2_t, align 16  // CHECK:   [[TMP0:%.*]] = bitcast %struct.float16x8x2_t* [[__RET]] to i8*  // CHECK:   [[TMP1:%.*]] = bitcast half* %a to i8* -// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to half* -// CHECK:   [[VLD1XN:%.*]] = call { <8 x half>, <8 x half> } @llvm.aarch64.neon.ld1x2.v8f16.p0f16(half* [[TMP2]]) -// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <8 x half>, <8 x half> }* -// CHECK:   store { <8 x half>, <8 x half> } [[VLD1XN]], { <8 x half>, <8 x half> }* [[TMP3]] +// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to i16* +// CHECK:   [[VLD1XN:%.*]] = call { <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld1x2.v8i16.p0i16(i16* [[TMP2]]) +// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <8 x i16>, <8 x i16> }* +// CHECK:   store { <8 x i16>, <8 x i16> } [[VLD1XN]], { <8 x i16>, <8 x i16> }* [[TMP3]]  // CHECK:   [[TMP4:%.*]] = bitcast %struct.float16x8x2_t* [[RETVAL]] to i8*  // CHECK:   [[TMP5:%.*]] = bitcast %struct.float16x8x2_t* [[__RET]] to i8*  // CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[TMP4]], i8* [[TMP5]], i64 32, i32 16, i1 false) @@ -13452,10 +13454,10 @@ int64x1x2_t test_vld1_s64_x2(int64_t const *a) {  // CHECK:   [[__RET:%.*]] = alloca %struct.float16x4x2_t, align 8  // CHECK:   [[TMP0:%.*]] = bitcast %struct.float16x4x2_t* [[__RET]] to i8*  // CHECK:   [[TMP1:%.*]] = bitcast half* %a to i8* -// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to half* -// CHECK:   [[VLD1XN:%.*]] = call { <4 x half>, <4 x half> } @llvm.aarch64.neon.ld1x2.v4f16.p0f16(half* [[TMP2]]) -// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <4 x half>, <4 x half> }* -// CHECK:   store { <4 x half>, <4 x half> } [[VLD1XN]], { <4 x half>, <4 x half> }* [[TMP3]] +// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to i16* +// CHECK:   [[VLD1XN:%.*]] = call { <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld1x2.v4i16.p0i16(i16* [[TMP2]]) +// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <4 x i16>, <4 x i16> }* +// CHECK:   store { <4 x i16>, <4 x i16> } [[VLD1XN]], { <4 x i16>, <4 x i16> }* [[TMP3]]  // CHECK:   [[TMP4:%.*]] = bitcast %struct.float16x4x2_t* [[RETVAL]] to i8*  // CHECK:   [[TMP5:%.*]] = bitcast %struct.float16x4x2_t* [[__RET]] to i8*  // CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[TMP4]], i8* [[TMP5]], i64 16, i32 8, i1 false) @@ -13698,10 +13700,10 @@ int64x2x3_t test_vld1q_s64_x3(int64_t const *a) {  // CHECK:   [[__RET:%.*]] = alloca %struct.float16x8x3_t, align 16  // CHECK:   [[TMP0:%.*]] = bitcast %struct.float16x8x3_t* [[__RET]] to i8*  // CHECK:   [[TMP1:%.*]] = bitcast half* %a to i8* -// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to half* -// CHECK:   [[VLD1XN:%.*]] = call { <8 x half>, <8 x half>, <8 x half> } @llvm.aarch64.neon.ld1x3.v8f16.p0f16(half* [[TMP2]]) -// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <8 x half>, <8 x half>, <8 x half> }* -// CHECK:   store { <8 x half>, <8 x half>, <8 x half> } [[VLD1XN]], { <8 x half>, <8 x half>, <8 x half> }* [[TMP3]] +// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to i16* +// CHECK:   [[VLD1XN:%.*]] = call { <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld1x3.v8i16.p0i16(i16* [[TMP2]]) +// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <8 x i16>, <8 x i16>, <8 x i16> }* +// CHECK:   store { <8 x i16>, <8 x i16>, <8 x i16> } [[VLD1XN]], { <8 x i16>, <8 x i16>, <8 x i16> }* [[TMP3]]  // CHECK:   [[TMP4:%.*]] = bitcast %struct.float16x8x3_t* [[RETVAL]] to i8*  // CHECK:   [[TMP5:%.*]] = bitcast %struct.float16x8x3_t* [[__RET]] to i8*  // CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[TMP4]], i8* [[TMP5]], i64 48, i32 16, i1 false) @@ -13944,10 +13946,10 @@ int64x1x3_t test_vld1_s64_x3(int64_t const *a) {  // CHECK:   [[__RET:%.*]] = alloca %struct.float16x4x3_t, align 8  // CHECK:   [[TMP0:%.*]] = bitcast %struct.float16x4x3_t* [[__RET]] to i8*  // CHECK:   [[TMP1:%.*]] = bitcast half* %a to i8* -// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to half* -// CHECK:   [[VLD1XN:%.*]] = call { <4 x half>, <4 x half>, <4 x half> } @llvm.aarch64.neon.ld1x3.v4f16.p0f16(half* [[TMP2]]) -// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <4 x half>, <4 x half>, <4 x half> }* -// CHECK:   store { <4 x half>, <4 x half>, <4 x half> } [[VLD1XN]], { <4 x half>, <4 x half>, <4 x half> }* [[TMP3]] +// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to i16* +// CHECK:   [[VLD1XN:%.*]] = call { <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld1x3.v4i16.p0i16(i16* [[TMP2]]) +// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <4 x i16>, <4 x i16>, <4 x i16> }* +// CHECK:   store { <4 x i16>, <4 x i16>, <4 x i16> } [[VLD1XN]], { <4 x i16>, <4 x i16>, <4 x i16> }* [[TMP3]]  // CHECK:   [[TMP4:%.*]] = bitcast %struct.float16x4x3_t* [[RETVAL]] to i8*  // CHECK:   [[TMP5:%.*]] = bitcast %struct.float16x4x3_t* [[__RET]] to i8*  // CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[TMP4]], i8* [[TMP5]], i64 24, i32 8, i1 false) @@ -14190,10 +14192,10 @@ int64x2x4_t test_vld1q_s64_x4(int64_t const *a) {  // CHECK:   [[__RET:%.*]] = alloca %struct.float16x8x4_t, align 16  // CHECK:   [[TMP0:%.*]] = bitcast %struct.float16x8x4_t* [[__RET]] to i8*  // CHECK:   [[TMP1:%.*]] = bitcast half* %a to i8* -// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to half* -// CHECK:   [[VLD1XN:%.*]] = call { <8 x half>, <8 x half>, <8 x half>, <8 x half> } @llvm.aarch64.neon.ld1x4.v8f16.p0f16(half* [[TMP2]]) -// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <8 x half>, <8 x half>, <8 x half>, <8 x half> }* -// CHECK:   store { <8 x half>, <8 x half>, <8 x half>, <8 x half> } [[VLD1XN]], { <8 x half>, <8 x half>, <8 x half>, <8 x half> }* [[TMP3]] +// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to i16* +// CHECK:   [[VLD1XN:%.*]] = call { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld1x4.v8i16.p0i16(i16* [[TMP2]]) +// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> }* +// CHECK:   store { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } [[VLD1XN]], { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> }* [[TMP3]]  // CHECK:   [[TMP4:%.*]] = bitcast %struct.float16x8x4_t* [[RETVAL]] to i8*  // CHECK:   [[TMP5:%.*]] = bitcast %struct.float16x8x4_t* [[__RET]] to i8*  // CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[TMP4]], i8* [[TMP5]], i64 64, i32 16, i1 false) @@ -14436,10 +14438,10 @@ int64x1x4_t test_vld1_s64_x4(int64_t const *a) {  // CHECK:   [[__RET:%.*]] = alloca %struct.float16x4x4_t, align 8  // CHECK:   [[TMP0:%.*]] = bitcast %struct.float16x4x4_t* [[__RET]] to i8*  // CHECK:   [[TMP1:%.*]] = bitcast half* %a to i8* -// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to half* -// CHECK:   [[VLD1XN:%.*]] = call { <4 x half>, <4 x half>, <4 x half>, <4 x half> } @llvm.aarch64.neon.ld1x4.v4f16.p0f16(half* [[TMP2]]) -// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <4 x half>, <4 x half>, <4 x half>, <4 x half> }* -// CHECK:   store { <4 x half>, <4 x half>, <4 x half>, <4 x half> } [[VLD1XN]], { <4 x half>, <4 x half>, <4 x half>, <4 x half> }* [[TMP3]] +// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to i16* +// CHECK:   [[VLD1XN:%.*]] = call { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld1x4.v4i16.p0i16(i16* [[TMP2]]) +// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> }* +// CHECK:   store { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } [[VLD1XN]], { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> }* [[TMP3]]  // CHECK:   [[TMP4:%.*]] = bitcast %struct.float16x4x4_t* [[RETVAL]] to i8*  // CHECK:   [[TMP5:%.*]] = bitcast %struct.float16x4x4_t* [[__RET]] to i8*  // CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[TMP4]], i8* [[TMP5]], i64 32, i32 8, i1 false) @@ -14750,10 +14752,10 @@ void test_vst1q_s64_x2(int64_t *a, int64x2x2_t b) {  // CHECK:   [[ARRAYIDX2:%.*]] = getelementptr inbounds [2 x <8 x half>], [2 x <8 x half>]* [[VAL1]], i64 0, i64 1  // CHECK:   [[TMP5:%.*]] = load <8 x half>, <8 x half>* [[ARRAYIDX2]], align 16  // CHECK:   [[TMP6:%.*]] = bitcast <8 x half> [[TMP5]] to <16 x i8> -// CHECK:   [[TMP7:%.*]] = bitcast <16 x i8> [[TMP4]] to <8 x half> -// CHECK:   [[TMP8:%.*]] = bitcast <16 x i8> [[TMP6]] to <8 x half> -// CHECK:   [[TMP9:%.*]] = bitcast i8* [[TMP2]] to half* -// CHECK:   call void @llvm.aarch64.neon.st1x2.v8f16.p0f16(<8 x half> [[TMP7]], <8 x half> [[TMP8]], half* [[TMP9]]) +// CHECK:   [[TMP7:%.*]] = bitcast <16 x i8> [[TMP4]] to <8 x i16> +// CHECK:   [[TMP8:%.*]] = bitcast <16 x i8> [[TMP6]] to <8 x i16> +// CHECK:   [[TMP9:%.*]] = bitcast i8* [[TMP2]] to i16* +// CHECK:   call void @llvm.aarch64.neon.st1x2.v8i16.p0i16(<8 x i16> [[TMP7]], <8 x i16> [[TMP8]], i16* [[TMP9]])  // CHECK:   ret void  void test_vst1q_f16_x2(float16_t *a, float16x8x2_t b) {    vst1q_f16_x2(a, b); @@ -15096,10 +15098,10 @@ void test_vst1_s64_x2(int64_t *a, int64x1x2_t b) {  // CHECK:   [[ARRAYIDX2:%.*]] = getelementptr inbounds [2 x <4 x half>], [2 x <4 x half>]* [[VAL1]], i64 0, i64 1  // CHECK:   [[TMP5:%.*]] = load <4 x half>, <4 x half>* [[ARRAYIDX2]], align 8  // CHECK:   [[TMP6:%.*]] = bitcast <4 x half> [[TMP5]] to <8 x i8> -// CHECK:   [[TMP7:%.*]] = bitcast <8 x i8> [[TMP4]] to <4 x half> -// CHECK:   [[TMP8:%.*]] = bitcast <8 x i8> [[TMP6]] to <4 x half> -// CHECK:   [[TMP9:%.*]] = bitcast i8* [[TMP2]] to half* -// CHECK:   call void @llvm.aarch64.neon.st1x2.v4f16.p0f16(<4 x half> [[TMP7]], <4 x half> [[TMP8]], half* [[TMP9]]) +// CHECK:   [[TMP7:%.*]] = bitcast <8 x i8> [[TMP4]] to <4 x i16> +// CHECK:   [[TMP8:%.*]] = bitcast <8 x i8> [[TMP6]] to <4 x i16> +// CHECK:   [[TMP9:%.*]] = bitcast i8* [[TMP2]] to i16* +// CHECK:   call void @llvm.aarch64.neon.st1x2.v4i16.p0i16(<4 x i16> [[TMP7]], <4 x i16> [[TMP8]], i16* [[TMP9]])  // CHECK:   ret void  void test_vst1_f16_x2(float16_t *a, float16x4x2_t b) {    vst1_f16_x2(a, b); @@ -15482,11 +15484,11 @@ void test_vst1q_s64_x3(int64_t *a, int64x2x3_t b) {  // CHECK:   [[ARRAYIDX4:%.*]] = getelementptr inbounds [3 x <8 x half>], [3 x <8 x half>]* [[VAL3]], i64 0, i64 2  // CHECK:   [[TMP7:%.*]] = load <8 x half>, <8 x half>* [[ARRAYIDX4]], align 16  // CHECK:   [[TMP8:%.*]] = bitcast <8 x half> [[TMP7]] to <16 x i8> -// CHECK:   [[TMP9:%.*]] = bitcast <16 x i8> [[TMP4]] to <8 x half> -// CHECK:   [[TMP10:%.*]] = bitcast <16 x i8> [[TMP6]] to <8 x half> -// CHECK:   [[TMP11:%.*]] = bitcast <16 x i8> [[TMP8]] to <8 x half> -// CHECK:   [[TMP12:%.*]] = bitcast i8* [[TMP2]] to half* -// CHECK:   call void @llvm.aarch64.neon.st1x3.v8f16.p0f16(<8 x half> [[TMP9]], <8 x half> [[TMP10]], <8 x half> [[TMP11]], half* [[TMP12]]) +// CHECK:   [[TMP9:%.*]] = bitcast <16 x i8> [[TMP4]] to <8 x i16> +// CHECK:   [[TMP10:%.*]] = bitcast <16 x i8> [[TMP6]] to <8 x i16> +// CHECK:   [[TMP11:%.*]] = bitcast <16 x i8> [[TMP8]] to <8 x i16> +// CHECK:   [[TMP12:%.*]] = bitcast i8* [[TMP2]] to i16* +// CHECK:   call void @llvm.aarch64.neon.st1x3.v8i16.p0i16(<8 x i16> [[TMP9]], <8 x i16> [[TMP10]], <8 x i16> [[TMP11]], i16* [[TMP12]])  // CHECK:   ret void  void test_vst1q_f16_x3(float16_t *a, float16x8x3_t b) {    vst1q_f16_x3(a, b); @@ -15892,11 +15894,11 @@ void test_vst1_s64_x3(int64_t *a, int64x1x3_t b) {  // CHECK:   [[ARRAYIDX4:%.*]] = getelementptr inbounds [3 x <4 x half>], [3 x <4 x half>]* [[VAL3]], i64 0, i64 2  // CHECK:   [[TMP7:%.*]] = load <4 x half>, <4 x half>* [[ARRAYIDX4]], align 8  // CHECK:   [[TMP8:%.*]] = bitcast <4 x half> [[TMP7]] to <8 x i8> -// CHECK:   [[TMP9:%.*]] = bitcast <8 x i8> [[TMP4]] to <4 x half> -// CHECK:   [[TMP10:%.*]] = bitcast <8 x i8> [[TMP6]] to <4 x half> -// CHECK:   [[TMP11:%.*]] = bitcast <8 x i8> [[TMP8]] to <4 x half> -// CHECK:   [[TMP12:%.*]] = bitcast i8* [[TMP2]] to half* -// CHECK:   call void @llvm.aarch64.neon.st1x3.v4f16.p0f16(<4 x half> [[TMP9]], <4 x half> [[TMP10]], <4 x half> [[TMP11]], half* [[TMP12]]) +// CHECK:   [[TMP9:%.*]] = bitcast <8 x i8> [[TMP4]] to <4 x i16> +// CHECK:   [[TMP10:%.*]] = bitcast <8 x i8> [[TMP6]] to <4 x i16> +// CHECK:   [[TMP11:%.*]] = bitcast <8 x i8> [[TMP8]] to <4 x i16> +// CHECK:   [[TMP12:%.*]] = bitcast i8* [[TMP2]] to i16* +// CHECK:   call void @llvm.aarch64.neon.st1x3.v4i16.p0i16(<4 x i16> [[TMP9]], <4 x i16> [[TMP10]], <4 x i16> [[TMP11]], i16* [[TMP12]])  // CHECK:   ret void  void test_vst1_f16_x3(float16_t *a, float16x4x3_t b) {    vst1_f16_x3(a, b); @@ -16342,12 +16344,12 @@ void test_vst1q_s64_x4(int64_t *a, int64x2x4_t b) {  // CHECK:   [[ARRAYIDX6:%.*]] = getelementptr inbounds [4 x <8 x half>], [4 x <8 x half>]* [[VAL5]], i64 0, i64 3  // CHECK:   [[TMP9:%.*]] = load <8 x half>, <8 x half>* [[ARRAYIDX6]], align 16  // CHECK:   [[TMP10:%.*]] = bitcast <8 x half> [[TMP9]] to <16 x i8> -// CHECK:   [[TMP11:%.*]] = bitcast <16 x i8> [[TMP4]] to <8 x half> -// CHECK:   [[TMP12:%.*]] = bitcast <16 x i8> [[TMP6]] to <8 x half> -// CHECK:   [[TMP13:%.*]] = bitcast <16 x i8> [[TMP8]] to <8 x half> -// CHECK:   [[TMP14:%.*]] = bitcast <16 x i8> [[TMP10]] to <8 x half> -// CHECK:   [[TMP15:%.*]] = bitcast i8* [[TMP2]] to half* -// CHECK:   call void @llvm.aarch64.neon.st1x4.v8f16.p0f16(<8 x half> [[TMP11]], <8 x half> [[TMP12]], <8 x half> [[TMP13]], <8 x half> [[TMP14]], half* [[TMP15]]) +// CHECK:   [[TMP11:%.*]] = bitcast <16 x i8> [[TMP4]] to <8 x i16> +// CHECK:   [[TMP12:%.*]] = bitcast <16 x i8> [[TMP6]] to <8 x i16> +// CHECK:   [[TMP13:%.*]] = bitcast <16 x i8> [[TMP8]] to <8 x i16> +// CHECK:   [[TMP14:%.*]] = bitcast <16 x i8> [[TMP10]] to <8 x i16> +// CHECK:   [[TMP15:%.*]] = bitcast i8* [[TMP2]] to i16* +// CHECK:   call void @llvm.aarch64.neon.st1x4.v8i16.p0i16(<8 x i16> [[TMP11]], <8 x i16> [[TMP12]], <8 x i16> [[TMP13]], <8 x i16> [[TMP14]], i16* [[TMP15]])  // CHECK:   ret void  void test_vst1q_f16_x4(float16_t *a, float16x8x4_t b) {    vst1q_f16_x4(a, b); @@ -16816,12 +16818,12 @@ void test_vst1_s64_x4(int64_t *a, int64x1x4_t b) {  // CHECK:   [[ARRAYIDX6:%.*]] = getelementptr inbounds [4 x <4 x half>], [4 x <4 x half>]* [[VAL5]], i64 0, i64 3  // CHECK:   [[TMP9:%.*]] = load <4 x half>, <4 x half>* [[ARRAYIDX6]], align 8  // CHECK:   [[TMP10:%.*]] = bitcast <4 x half> [[TMP9]] to <8 x i8> -// CHECK:   [[TMP11:%.*]] = bitcast <8 x i8> [[TMP4]] to <4 x half> -// CHECK:   [[TMP12:%.*]] = bitcast <8 x i8> [[TMP6]] to <4 x half> -// CHECK:   [[TMP13:%.*]] = bitcast <8 x i8> [[TMP8]] to <4 x half> -// CHECK:   [[TMP14:%.*]] = bitcast <8 x i8> [[TMP10]] to <4 x half> -// CHECK:   [[TMP15:%.*]] = bitcast i8* [[TMP2]] to half* -// CHECK:   call void @llvm.aarch64.neon.st1x4.v4f16.p0f16(<4 x half> [[TMP11]], <4 x half> [[TMP12]], <4 x half> [[TMP13]], <4 x half> [[TMP14]], half* [[TMP15]]) +// CHECK:   [[TMP11:%.*]] = bitcast <8 x i8> [[TMP4]] to <4 x i16> +// CHECK:   [[TMP12:%.*]] = bitcast <8 x i8> [[TMP6]] to <4 x i16> +// CHECK:   [[TMP13:%.*]] = bitcast <8 x i8> [[TMP8]] to <4 x i16> +// CHECK:   [[TMP14:%.*]] = bitcast <8 x i8> [[TMP10]] to <4 x i16> +// CHECK:   [[TMP15:%.*]] = bitcast i8* [[TMP2]] to i16* +// CHECK:   call void @llvm.aarch64.neon.st1x4.v4i16.p0i16(<4 x i16> [[TMP11]], <4 x i16> [[TMP12]], <4 x i16> [[TMP13]], <4 x i16> [[TMP14]], i16* [[TMP15]])  // CHECK:   ret void  void test_vst1_f16_x4(float16_t *a, float16x4x4_t b) {    vst1_f16_x4(a, b); diff --git a/test/CodeGen/aarch64-neon-ldst-one.c b/test/CodeGen/aarch64-neon-ldst-one.c index a3c5b140a0d2..9bd9ab1cb61b 100644 --- a/test/CodeGen/aarch64-neon-ldst-one.c +++ b/test/CodeGen/aarch64-neon-ldst-one.c @@ -90,11 +90,12 @@ int64x2_t test_vld1q_dup_s64(int64_t  *a) {  // CHECK-LABEL: define <8 x half> @test_vld1q_dup_f16(half* %a) #0 {  // CHECK:   [[TMP0:%.*]] = bitcast half* %a to i8* -// CHECK:   [[TMP1:%.*]] = bitcast i8* [[TMP0]] to half* -// CHECK:   [[TMP2:%.*]] = load half, half* [[TMP1]] -// CHECK:   [[TMP3:%.*]] = insertelement <8 x half> undef, half [[TMP2]], i32 0 -// CHECK:   [[LANE:%.*]] = shufflevector <8 x half> [[TMP3]], <8 x half> [[TMP3]], <8 x i32> zeroinitializer -// CHECK:   ret <8 x half> [[LANE]] +// CHECK:   [[TMP1:%.*]] = bitcast i8* [[TMP0]] to i16* +// CHECK:   [[TMP2:%.*]] = load i16, i16* [[TMP1]] +// CHECK:   [[TMP3:%.*]] = insertelement <8 x i16> undef, i16 [[TMP2]], i32 0 +// CHECK:   [[LANE:%.*]] = shufflevector <8 x i16> [[TMP3]], <8 x i16> [[TMP3]], <8 x i32> zeroinitializer +// CHECK:   [[TMP4:%.*]] = bitcast <8 x i16> [[LANE]] to <8 x half> +// CHECK:   ret <8 x half> [[TMP4]]  float16x8_t test_vld1q_dup_f16(float16_t  *a) {    return vld1q_dup_f16(a);  } @@ -238,11 +239,12 @@ int64x1_t test_vld1_dup_s64(int64_t  *a) {  // CHECK-LABEL: define <4 x half> @test_vld1_dup_f16(half* %a) #0 {  // CHECK:   [[TMP0:%.*]] = bitcast half* %a to i8* -// CHECK:   [[TMP1:%.*]] = bitcast i8* [[TMP0]] to half* -// CHECK:   [[TMP2:%.*]] = load half, half* [[TMP1]] -// CHECK:   [[TMP3:%.*]] = insertelement <4 x half> undef, half [[TMP2]], i32 0 -// CHECK:   [[LANE:%.*]] = shufflevector <4 x half> [[TMP3]], <4 x half> [[TMP3]], <4 x i32> zeroinitializer -// CHECK:   ret <4 x half> [[LANE]] +// CHECK:   [[TMP1:%.*]] = bitcast i8* [[TMP0]] to i16* +// CHECK:   [[TMP2:%.*]] = load i16, i16* [[TMP1]] +// CHECK:   [[TMP3:%.*]] = insertelement <4 x i16> undef, i16 [[TMP2]], i32 0 +// CHECK:   [[LANE:%.*]] = shufflevector <4 x i16> [[TMP3]], <4 x i16> [[TMP3]], <4 x i32> zeroinitializer +// CHECK:   [[TMP4:%.*]] = bitcast <4 x i16> [[LANE]] to <4 x half> +// CHECK:   ret <4 x half> [[TMP4]]  float16x4_t test_vld1_dup_f16(float16_t  *a) {    return vld1_dup_f16(a);  } @@ -445,10 +447,10 @@ int64x2x2_t test_vld2q_dup_s64(int64_t  *a) {  // CHECK:   [[__RET:%.*]] = alloca %struct.float16x8x2_t, align 16  // CHECK:   [[TMP0:%.*]] = bitcast %struct.float16x8x2_t* [[__RET]] to i8*  // CHECK:   [[TMP1:%.*]] = bitcast half* %a to i8* -// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to half* -// CHECK:   [[VLD2:%.*]] = call { <8 x half>, <8 x half> } @llvm.aarch64.neon.ld2r.v8f16.p0f16(half* [[TMP2]]) -// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <8 x half>, <8 x half> }* -// CHECK:   store { <8 x half>, <8 x half> } [[VLD2]], { <8 x half>, <8 x half> }* [[TMP3]] +// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to i16* +// CHECK:   [[VLD2:%.*]] = call { <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld2r.v8i16.p0i16(i16* [[TMP2]]) +// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <8 x i16>, <8 x i16> }* +// CHECK:   store { <8 x i16>, <8 x i16> } [[VLD2]], { <8 x i16>, <8 x i16> }* [[TMP3]]  // CHECK:   [[TMP4:%.*]] = bitcast %struct.float16x8x2_t* [[RETVAL]] to i8*  // CHECK:   [[TMP5:%.*]] = bitcast %struct.float16x8x2_t* [[__RET]] to i8*  // CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[TMP4]], i8* [[TMP5]], i64 32, i32 16, i1 false) @@ -691,10 +693,10 @@ int64x1x2_t test_vld2_dup_s64(int64_t  *a) {  // CHECK:   [[__RET:%.*]] = alloca %struct.float16x4x2_t, align 8  // CHECK:   [[TMP0:%.*]] = bitcast %struct.float16x4x2_t* [[__RET]] to i8*  // CHECK:   [[TMP1:%.*]] = bitcast half* %a to i8* -// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to half* -// CHECK:   [[VLD2:%.*]] = call { <4 x half>, <4 x half> } @llvm.aarch64.neon.ld2r.v4f16.p0f16(half* [[TMP2]]) -// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <4 x half>, <4 x half> }* -// CHECK:   store { <4 x half>, <4 x half> } [[VLD2]], { <4 x half>, <4 x half> }* [[TMP3]] +// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to i16* +// CHECK:   [[VLD2:%.*]] = call { <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld2r.v4i16.p0i16(i16* [[TMP2]]) +// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <4 x i16>, <4 x i16> }* +// CHECK:   store { <4 x i16>, <4 x i16> } [[VLD2]], { <4 x i16>, <4 x i16> }* [[TMP3]]  // CHECK:   [[TMP4:%.*]] = bitcast %struct.float16x4x2_t* [[RETVAL]] to i8*  // CHECK:   [[TMP5:%.*]] = bitcast %struct.float16x4x2_t* [[__RET]] to i8*  // CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[TMP4]], i8* [[TMP5]], i64 16, i32 8, i1 false) @@ -945,10 +947,10 @@ int64x2x3_t test_vld3q_dup_s64(int64_t  *a) {  // CHECK:   [[__RET:%.*]] = alloca %struct.float16x8x3_t, align 16  // CHECK:   [[TMP0:%.*]] = bitcast %struct.float16x8x3_t* [[__RET]] to i8*  // CHECK:   [[TMP1:%.*]] = bitcast half* %a to i8* -// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to half* -// CHECK:   [[VLD3:%.*]] = call { <8 x half>, <8 x half>, <8 x half> } @llvm.aarch64.neon.ld3r.v8f16.p0f16(half* [[TMP2]]) -// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <8 x half>, <8 x half>, <8 x half> }* -// CHECK:   store { <8 x half>, <8 x half>, <8 x half> } [[VLD3]], { <8 x half>, <8 x half>, <8 x half> }* [[TMP3]] +// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to i16* +// CHECK:   [[VLD3:%.*]] = call { <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld3r.v8i16.p0i16(i16* [[TMP2]]) +// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <8 x i16>, <8 x i16>, <8 x i16> }* +// CHECK:   store { <8 x i16>, <8 x i16>, <8 x i16> } [[VLD3]], { <8 x i16>, <8 x i16>, <8 x i16> }* [[TMP3]]  // CHECK:   [[TMP4:%.*]] = bitcast %struct.float16x8x3_t* [[RETVAL]] to i8*  // CHECK:   [[TMP5:%.*]] = bitcast %struct.float16x8x3_t* [[__RET]] to i8*  // CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[TMP4]], i8* [[TMP5]], i64 48, i32 16, i1 false) @@ -1205,10 +1207,10 @@ int64x1x3_t test_vld3_dup_s64(int64_t  *a) {  // CHECK:   [[__RET:%.*]] = alloca %struct.float16x4x3_t, align 8  // CHECK:   [[TMP0:%.*]] = bitcast %struct.float16x4x3_t* [[__RET]] to i8*  // CHECK:   [[TMP1:%.*]] = bitcast half* %a to i8* -// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to half* -// CHECK:   [[VLD3:%.*]] = call { <4 x half>, <4 x half>, <4 x half> } @llvm.aarch64.neon.ld3r.v4f16.p0f16(half* [[TMP2]]) -// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <4 x half>, <4 x half>, <4 x half> }* -// CHECK:   store { <4 x half>, <4 x half>, <4 x half> } [[VLD3]], { <4 x half>, <4 x half>, <4 x half> }* [[TMP3]] +// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to i16* +// CHECK:   [[VLD3:%.*]] = call { <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld3r.v4i16.p0i16(i16* [[TMP2]]) +// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <4 x i16>, <4 x i16>, <4 x i16> }* +// CHECK:   store { <4 x i16>, <4 x i16>, <4 x i16> } [[VLD3]], { <4 x i16>, <4 x i16>, <4 x i16> }* [[TMP3]]  // CHECK:   [[TMP4:%.*]] = bitcast %struct.float16x4x3_t* [[RETVAL]] to i8*  // CHECK:   [[TMP5:%.*]] = bitcast %struct.float16x4x3_t* [[__RET]] to i8*  // CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[TMP4]], i8* [[TMP5]], i64 24, i32 8, i1 false) @@ -1457,10 +1459,10 @@ int64x2x4_t test_vld4q_dup_s64(int64_t  *a) {  // CHECK:   [[__RET:%.*]] = alloca %struct.float16x8x4_t, align 16  // CHECK:   [[TMP0:%.*]] = bitcast %struct.float16x8x4_t* [[__RET]] to i8*  // CHECK:   [[TMP1:%.*]] = bitcast half* %a to i8* -// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to half* -// CHECK:   [[VLD4:%.*]] = call { <8 x half>, <8 x half>, <8 x half>, <8 x half> } @llvm.aarch64.neon.ld4r.v8f16.p0f16(half* [[TMP2]]) -// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <8 x half>, <8 x half>, <8 x half>, <8 x half> }* -// CHECK:   store { <8 x half>, <8 x half>, <8 x half>, <8 x half> } [[VLD4]], { <8 x half>, <8 x half>, <8 x half>, <8 x half> }* [[TMP3]] +// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to i16* +// CHECK:   [[VLD4:%.*]] = call { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld4r.v8i16.p0i16(i16* [[TMP2]]) +// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> }* +// CHECK:   store { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } [[VLD4]], { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> }* [[TMP3]]  // CHECK:   [[TMP4:%.*]] = bitcast %struct.float16x8x4_t* [[RETVAL]] to i8*  // CHECK:   [[TMP5:%.*]] = bitcast %struct.float16x8x4_t* [[__RET]] to i8*  // CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[TMP4]], i8* [[TMP5]], i64 64, i32 16, i1 false) @@ -1703,10 +1705,10 @@ int64x1x4_t test_vld4_dup_s64(int64_t  *a) {  // CHECK:   [[__RET:%.*]] = alloca %struct.float16x4x4_t, align 8  // CHECK:   [[TMP0:%.*]] = bitcast %struct.float16x4x4_t* [[__RET]] to i8*  // CHECK:   [[TMP1:%.*]] = bitcast half* %a to i8* -// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to half* -// CHECK:   [[VLD4:%.*]] = call { <4 x half>, <4 x half>, <4 x half>, <4 x half> } @llvm.aarch64.neon.ld4r.v4f16.p0f16(half* [[TMP2]]) -// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <4 x half>, <4 x half>, <4 x half>, <4 x half> }* -// CHECK:   store { <4 x half>, <4 x half>, <4 x half>, <4 x half> } [[VLD4]], { <4 x half>, <4 x half>, <4 x half>, <4 x half> }* [[TMP3]] +// CHECK:   [[TMP2:%.*]] = bitcast i8* [[TMP1]] to i16* +// CHECK:   [[VLD4:%.*]] = call { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld4r.v4i16.p0i16(i16* [[TMP2]]) +// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> }* +// CHECK:   store { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } [[VLD4]], { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> }* [[TMP3]]  // CHECK:   [[TMP4:%.*]] = bitcast %struct.float16x4x4_t* [[RETVAL]] to i8*  // CHECK:   [[TMP5:%.*]] = bitcast %struct.float16x4x4_t* [[__RET]] to i8*  // CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[TMP4]], i8* [[TMP5]], i64 32, i32 8, i1 false) @@ -1895,11 +1897,12 @@ int64x2_t test_vld1q_lane_s64(int64_t  *a, int64x2_t b) {  // CHECK-LABEL: define <8 x half> @test_vld1q_lane_f16(half* %a, <8 x half> %b) #0 {  // CHECK:   [[TMP0:%.*]] = bitcast half* %a to i8*  // CHECK:   [[TMP1:%.*]] = bitcast <8 x half> %b to <16 x i8> -// CHECK:   [[TMP2:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x half> -// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to half* -// CHECK:   [[TMP4:%.*]] = load half, half* [[TMP3]] -// CHECK:   [[VLD1_LANE:%.*]] = insertelement <8 x half> [[TMP2]], half [[TMP4]], i32 7 -// CHECK:   ret <8 x half> [[VLD1_LANE]] +// CHECK:   [[TMP2:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x i16> +// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to i16* +// CHECK:   [[TMP4:%.*]] = load i16, i16* [[TMP3]] +// CHECK:   [[VLD1_LANE:%.*]] = insertelement <8 x i16> [[TMP2]], i16 [[TMP4]], i32 7 +// CHECK:   [[TMP5:%.*]] = bitcast <8 x i16> [[VLD1_LANE]] to <8 x half> +// CHECK:   ret <8 x half> [[TMP5]]  float16x8_t test_vld1q_lane_f16(float16_t  *a, float16x8_t b) {    return vld1q_lane_f16(a, b, 7);  } @@ -2051,11 +2054,12 @@ int64x1_t test_vld1_lane_s64(int64_t  *a, int64x1_t b) {  // CHECK-LABEL: define <4 x half> @test_vld1_lane_f16(half* %a, <4 x half> %b) #0 {  // CHECK:   [[TMP0:%.*]] = bitcast half* %a to i8*  // CHECK:   [[TMP1:%.*]] = bitcast <4 x half> %b to <8 x i8> -// CHECK:   [[TMP2:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x half> -// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to half* -// CHECK:   [[TMP4:%.*]] = load half, half* [[TMP3]] -// CHECK:   [[VLD1_LANE:%.*]] = insertelement <4 x half> [[TMP2]], half [[TMP4]], i32 3 -// CHECK:   ret <4 x half> [[VLD1_LANE]] +// CHECK:   [[TMP2:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x i16> +// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to i16* +// CHECK:   [[TMP4:%.*]] = load i16, i16* [[TMP3]] +// CHECK:   [[VLD1_LANE:%.*]] = insertelement <4 x i16> [[TMP2]], i16 [[TMP4]], i32 3 +// CHECK:   [[TMP5:%.*]] = bitcast <4 x i16> [[VLD1_LANE]] to <4 x half> +// CHECK:   ret <4 x half> [[TMP5]]  float16x4_t test_vld1_lane_f16(float16_t  *a, float16x4_t b) {    return vld1_lane_f16(a, b, 3);  } @@ -2491,11 +2495,11 @@ int64x2x2_t test_vld2q_lane_s64(int64_t  *a, int64x2x2_t b) {  // CHECK:   [[ARRAYIDX2:%.*]] = getelementptr inbounds [2 x <8 x half>], [2 x <8 x half>]* [[VAL1]], i64 0, i64 1  // CHECK:   [[TMP6:%.*]] = load <8 x half>, <8 x half>* [[ARRAYIDX2]], align 16  // CHECK:   [[TMP7:%.*]] = bitcast <8 x half> [[TMP6]] to <16 x i8> -// CHECK:   [[TMP8:%.*]] = bitcast <16 x i8> [[TMP5]] to <8 x half> -// CHECK:   [[TMP9:%.*]] = bitcast <16 x i8> [[TMP7]] to <8 x half> -// CHECK:   [[VLD2_LANE:%.*]] = call { <8 x half>, <8 x half> } @llvm.aarch64.neon.ld2lane.v8f16.p0i8(<8 x half> [[TMP8]], <8 x half> [[TMP9]], i64 7, i8* [[TMP3]]) -// CHECK:   [[TMP10:%.*]] = bitcast i8* [[TMP2]] to { <8 x half>, <8 x half> }* -// CHECK:   store { <8 x half>, <8 x half> } [[VLD2_LANE]], { <8 x half>, <8 x half> }* [[TMP10]] +// CHECK:   [[TMP8:%.*]] = bitcast <16 x i8> [[TMP5]] to <8 x i16> +// CHECK:   [[TMP9:%.*]] = bitcast <16 x i8> [[TMP7]] to <8 x i16> +// CHECK:   [[VLD2_LANE:%.*]] = call { <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld2lane.v8i16.p0i8(<8 x i16> [[TMP8]], <8 x i16> [[TMP9]], i64 7, i8* [[TMP3]]) +// CHECK:   [[TMP10:%.*]] = bitcast i8* [[TMP2]] to { <8 x i16>, <8 x i16> }* +// CHECK:   store { <8 x i16>, <8 x i16> } [[VLD2_LANE]], { <8 x i16>, <8 x i16> }* [[TMP10]]  // CHECK:   [[TMP11:%.*]] = bitcast %struct.float16x8x2_t* [[RETVAL]] to i8*  // CHECK:   [[TMP12:%.*]] = bitcast %struct.float16x8x2_t* [[__RET]] to i8*  // CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[TMP11]], i8* [[TMP12]], i64 32, i32 16, i1 false) @@ -2923,11 +2927,11 @@ int64x1x2_t test_vld2_lane_s64(int64_t  *a, int64x1x2_t b) {  // CHECK:   [[ARRAYIDX2:%.*]] = getelementptr inbounds [2 x <4 x half>], [2 x <4 x half>]* [[VAL1]], i64 0, i64 1  // CHECK:   [[TMP6:%.*]] = load <4 x half>, <4 x half>* [[ARRAYIDX2]], align 8  // CHECK:   [[TMP7:%.*]] = bitcast <4 x half> [[TMP6]] to <8 x i8> -// CHECK:   [[TMP8:%.*]] = bitcast <8 x i8> [[TMP5]] to <4 x half> -// CHECK:   [[TMP9:%.*]] = bitcast <8 x i8> [[TMP7]] to <4 x half> -// CHECK:   [[VLD2_LANE:%.*]] = call { <4 x half>, <4 x half> } @llvm.aarch64.neon.ld2lane.v4f16.p0i8(<4 x half> [[TMP8]], <4 x half> [[TMP9]], i64 3, i8* [[TMP3]]) -// CHECK:   [[TMP10:%.*]] = bitcast i8* [[TMP2]] to { <4 x half>, <4 x half> }* -// CHECK:   store { <4 x half>, <4 x half> } [[VLD2_LANE]], { <4 x half>, <4 x half> }* [[TMP10]] +// CHECK:   [[TMP8:%.*]] = bitcast <8 x i8> [[TMP5]] to <4 x i16> +// CHECK:   [[TMP9:%.*]] = bitcast <8 x i8> [[TMP7]] to <4 x i16> +// CHECK:   [[VLD2_LANE:%.*]] = call { <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld2lane.v4i16.p0i8(<4 x i16> [[TMP8]], <4 x i16> [[TMP9]], i64 3, i8* [[TMP3]]) +// CHECK:   [[TMP10:%.*]] = bitcast i8* [[TMP2]] to { <4 x i16>, <4 x i16> }* +// CHECK:   store { <4 x i16>, <4 x i16> } [[VLD2_LANE]], { <4 x i16>, <4 x i16> }* [[TMP10]]  // CHECK:   [[TMP11:%.*]] = bitcast %struct.float16x4x2_t* [[RETVAL]] to i8*  // CHECK:   [[TMP12:%.*]] = bitcast %struct.float16x4x2_t* [[__RET]] to i8*  // CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[TMP11]], i8* [[TMP12]], i64 16, i32 8, i1 false) @@ -3360,12 +3364,12 @@ int64x2x3_t test_vld3q_lane_s64(int64_t  *a, int64x2x3_t b) {  // CHECK:   [[ARRAYIDX4:%.*]] = getelementptr inbounds [3 x <8 x half>], [3 x <8 x half>]* [[VAL3]], i64 0, i64 2  // CHECK:   [[TMP8:%.*]] = load <8 x half>, <8 x half>* [[ARRAYIDX4]], align 16  // CHECK:   [[TMP9:%.*]] = bitcast <8 x half> [[TMP8]] to <16 x i8> -// CHECK:   [[TMP10:%.*]] = bitcast <16 x i8> [[TMP5]] to <8 x half> -// CHECK:   [[TMP11:%.*]] = bitcast <16 x i8> [[TMP7]] to <8 x half> -// CHECK:   [[TMP12:%.*]] = bitcast <16 x i8> [[TMP9]] to <8 x half> -// CHECK:   [[VLD3_LANE:%.*]] = call { <8 x half>, <8 x half>, <8 x half> } @llvm.aarch64.neon.ld3lane.v8f16.p0i8(<8 x half> [[TMP10]], <8 x half> [[TMP11]], <8 x half> [[TMP12]], i64 7, i8* [[TMP3]]) -// CHECK:   [[TMP13:%.*]] = bitcast i8* [[TMP2]] to { <8 x half>, <8 x half>, <8 x half> }* -// CHECK:   store { <8 x half>, <8 x half>, <8 x half> } [[VLD3_LANE]], { <8 x half>, <8 x half>, <8 x half> }* [[TMP13]] +// CHECK:   [[TMP10:%.*]] = bitcast <16 x i8> [[TMP5]] to <8 x i16> +// CHECK:   [[TMP11:%.*]] = bitcast <16 x i8> [[TMP7]] to <8 x i16> +// CHECK:   [[TMP12:%.*]] = bitcast <16 x i8> [[TMP9]] to <8 x i16> +// CHECK:   [[VLD3_LANE:%.*]] = call { <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld3lane.v8i16.p0i8(<8 x i16> [[TMP10]], <8 x i16> [[TMP11]], <8 x i16> [[TMP12]], i64 7, i8* [[TMP3]]) +// CHECK:   [[TMP13:%.*]] = bitcast i8* [[TMP2]] to { <8 x i16>, <8 x i16>, <8 x i16> }* +// CHECK:   store { <8 x i16>, <8 x i16>, <8 x i16> } [[VLD3_LANE]], { <8 x i16>, <8 x i16>, <8 x i16> }* [[TMP13]]  // CHECK:   [[TMP14:%.*]] = bitcast %struct.float16x8x3_t* [[RETVAL]] to i8*  // CHECK:   [[TMP15:%.*]] = bitcast %struct.float16x8x3_t* [[__RET]] to i8*  // CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[TMP14]], i8* [[TMP15]], i64 48, i32 16, i1 false) @@ -3885,12 +3889,12 @@ int64x1x3_t test_vld3_lane_s64(int64_t  *a, int64x1x3_t b) {  // CHECK:   [[ARRAYIDX4:%.*]] = getelementptr inbounds [3 x <4 x half>], [3 x <4 x half>]* [[VAL3]], i64 0, i64 2  // CHECK:   [[TMP8:%.*]] = load <4 x half>, <4 x half>* [[ARRAYIDX4]], align 8  // CHECK:   [[TMP9:%.*]] = bitcast <4 x half> [[TMP8]] to <8 x i8> -// CHECK:   [[TMP10:%.*]] = bitcast <8 x i8> [[TMP5]] to <4 x half> -// CHECK:   [[TMP11:%.*]] = bitcast <8 x i8> [[TMP7]] to <4 x half> -// CHECK:   [[TMP12:%.*]] = bitcast <8 x i8> [[TMP9]] to <4 x half> -// CHECK:   [[VLD3_LANE:%.*]] = call { <4 x half>, <4 x half>, <4 x half> } @llvm.aarch64.neon.ld3lane.v4f16.p0i8(<4 x half> [[TMP10]], <4 x half> [[TMP11]], <4 x half> [[TMP12]], i64 3, i8* [[TMP3]]) -// CHECK:   [[TMP13:%.*]] = bitcast i8* [[TMP2]] to { <4 x half>, <4 x half>, <4 x half> }* -// CHECK:   store { <4 x half>, <4 x half>, <4 x half> } [[VLD3_LANE]], { <4 x half>, <4 x half>, <4 x half> }* [[TMP13]] +// CHECK:   [[TMP10:%.*]] = bitcast <8 x i8> [[TMP5]] to <4 x i16> +// CHECK:   [[TMP11:%.*]] = bitcast <8 x i8> [[TMP7]] to <4 x i16> +// CHECK:   [[TMP12:%.*]] = bitcast <8 x i8> [[TMP9]] to <4 x i16> +// CHECK:   [[VLD3_LANE:%.*]] = call { <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld3lane.v4i16.p0i8(<4 x i16> [[TMP10]], <4 x i16> [[TMP11]], <4 x i16> [[TMP12]], i64 3, i8* [[TMP3]]) +// CHECK:   [[TMP13:%.*]] = bitcast i8* [[TMP2]] to { <4 x i16>, <4 x i16>, <4 x i16> }* +// CHECK:   store { <4 x i16>, <4 x i16>, <4 x i16> } [[VLD3_LANE]], { <4 x i16>, <4 x i16>, <4 x i16> }* [[TMP13]]  // CHECK:   [[TMP14:%.*]] = bitcast %struct.float16x4x3_t* [[RETVAL]] to i8*  // CHECK:   [[TMP15:%.*]] = bitcast %struct.float16x4x3_t* [[__RET]] to i8*  // CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[TMP14]], i8* [[TMP15]], i64 24, i32 8, i1 false) @@ -4450,13 +4454,13 @@ int64x2x4_t test_vld4q_lane_s64(int64_t  *a, int64x2x4_t b) {  // CHECK:   [[ARRAYIDX6:%.*]] = getelementptr inbounds [4 x <8 x half>], [4 x <8 x half>]* [[VAL5]], i64 0, i64 3  // CHECK:   [[TMP10:%.*]] = load <8 x half>, <8 x half>* [[ARRAYIDX6]], align 16  // CHECK:   [[TMP11:%.*]] = bitcast <8 x half> [[TMP10]] to <16 x i8> -// CHECK:   [[TMP12:%.*]] = bitcast <16 x i8> [[TMP5]] to <8 x half> -// CHECK:   [[TMP13:%.*]] = bitcast <16 x i8> [[TMP7]] to <8 x half> -// CHECK:   [[TMP14:%.*]] = bitcast <16 x i8> [[TMP9]] to <8 x half> -// CHECK:   [[TMP15:%.*]] = bitcast <16 x i8> [[TMP11]] to <8 x half> -// CHECK:   [[VLD4_LANE:%.*]] = call { <8 x half>, <8 x half>, <8 x half>, <8 x half> } @llvm.aarch64.neon.ld4lane.v8f16.p0i8(<8 x half> [[TMP12]], <8 x half> [[TMP13]], <8 x half> [[TMP14]], <8 x half> [[TMP15]], i64 7, i8* [[TMP3]]) -// CHECK:   [[TMP16:%.*]] = bitcast i8* [[TMP2]] to { <8 x half>, <8 x half>, <8 x half>, <8 x half> }* -// CHECK:   store { <8 x half>, <8 x half>, <8 x half>, <8 x half> } [[VLD4_LANE]], { <8 x half>, <8 x half>, <8 x half>, <8 x half> }* [[TMP16]] +// CHECK:   [[TMP12:%.*]] = bitcast <16 x i8> [[TMP5]] to <8 x i16> +// CHECK:   [[TMP13:%.*]] = bitcast <16 x i8> [[TMP7]] to <8 x i16> +// CHECK:   [[TMP14:%.*]] = bitcast <16 x i8> [[TMP9]] to <8 x i16> +// CHECK:   [[TMP15:%.*]] = bitcast <16 x i8> [[TMP11]] to <8 x i16> +// CHECK:   [[VLD4_LANE:%.*]] = call { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld4lane.v8i16.p0i8(<8 x i16> [[TMP12]], <8 x i16> [[TMP13]], <8 x i16> [[TMP14]], <8 x i16> [[TMP15]], i64 7, i8* [[TMP3]]) +// CHECK:   [[TMP16:%.*]] = bitcast i8* [[TMP2]] to { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> }* +// CHECK:   store { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } [[VLD4_LANE]], { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> }* [[TMP16]]  // CHECK:   [[TMP17:%.*]] = bitcast %struct.float16x8x4_t* [[RETVAL]] to i8*  // CHECK:   [[TMP18:%.*]] = bitcast %struct.float16x8x4_t* [[__RET]] to i8*  // CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[TMP17]], i8* [[TMP18]], i64 64, i32 16, i1 false) @@ -5039,13 +5043,13 @@ int64x1x4_t test_vld4_lane_s64(int64_t  *a, int64x1x4_t b) {  // CHECK:   [[ARRAYIDX6:%.*]] = getelementptr inbounds [4 x <4 x half>], [4 x <4 x half>]* [[VAL5]], i64 0, i64 3  // CHECK:   [[TMP10:%.*]] = load <4 x half>, <4 x half>* [[ARRAYIDX6]], align 8  // CHECK:   [[TMP11:%.*]] = bitcast <4 x half> [[TMP10]] to <8 x i8> -// CHECK:   [[TMP12:%.*]] = bitcast <8 x i8> [[TMP5]] to <4 x half> -// CHECK:   [[TMP13:%.*]] = bitcast <8 x i8> [[TMP7]] to <4 x half> -// CHECK:   [[TMP14:%.*]] = bitcast <8 x i8> [[TMP9]] to <4 x half> -// CHECK:   [[TMP15:%.*]] = bitcast <8 x i8> [[TMP11]] to <4 x half> -// CHECK:   [[VLD4_LANE:%.*]] = call { <4 x half>, <4 x half>, <4 x half>, <4 x half> } @llvm.aarch64.neon.ld4lane.v4f16.p0i8(<4 x half> [[TMP12]], <4 x half> [[TMP13]], <4 x half> [[TMP14]], <4 x half> [[TMP15]], i64 3, i8* [[TMP3]]) -// CHECK:   [[TMP16:%.*]] = bitcast i8* [[TMP2]] to { <4 x half>, <4 x half>, <4 x half>, <4 x half> }* -// CHECK:   store { <4 x half>, <4 x half>, <4 x half>, <4 x half> } [[VLD4_LANE]], { <4 x half>, <4 x half>, <4 x half>, <4 x half> }* [[TMP16]] +// CHECK:   [[TMP12:%.*]] = bitcast <8 x i8> [[TMP5]] to <4 x i16> +// CHECK:   [[TMP13:%.*]] = bitcast <8 x i8> [[TMP7]] to <4 x i16> +// CHECK:   [[TMP14:%.*]] = bitcast <8 x i8> [[TMP9]] to <4 x i16> +// CHECK:   [[TMP15:%.*]] = bitcast <8 x i8> [[TMP11]] to <4 x i16> +// CHECK:   [[VLD4_LANE:%.*]] = call { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld4lane.v4i16.p0i8(<4 x i16> [[TMP12]], <4 x i16> [[TMP13]], <4 x i16> [[TMP14]], <4 x i16> [[TMP15]], i64 3, i8* [[TMP3]]) +// CHECK:   [[TMP16:%.*]] = bitcast i8* [[TMP2]] to { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> }* +// CHECK:   store { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } [[VLD4_LANE]], { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> }* [[TMP16]]  // CHECK:   [[TMP17:%.*]] = bitcast %struct.float16x4x4_t* [[RETVAL]] to i8*  // CHECK:   [[TMP18:%.*]] = bitcast %struct.float16x4x4_t* [[__RET]] to i8*  // CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[TMP17]], i8* [[TMP18]], i64 32, i32 8, i1 false) @@ -5357,10 +5361,10 @@ void test_vst1q_lane_s64(int64_t  *a, int64x2_t b) {  // CHECK-LABEL: define void @test_vst1q_lane_f16(half* %a, <8 x half> %b) #0 {  // CHECK:   [[TMP0:%.*]] = bitcast half* %a to i8*  // CHECK:   [[TMP1:%.*]] = bitcast <8 x half> %b to <16 x i8> -// CHECK:   [[TMP2:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x half> -// CHECK:   [[TMP3:%.*]] = extractelement <8 x half> [[TMP2]], i32 7 -// CHECK:   [[TMP4:%.*]] = bitcast i8* [[TMP0]] to half* -// CHECK:   store half [[TMP3]], half* [[TMP4]] +// CHECK:   [[TMP2:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x i16> +// CHECK:   [[TMP3:%.*]] = extractelement <8 x i16> [[TMP2]], i32 7 +// CHECK:   [[TMP4:%.*]] = bitcast i8* [[TMP0]] to i16* +// CHECK:   store i16 [[TMP3]], i16* [[TMP4]]  // CHECK:   ret void  void test_vst1q_lane_f16(float16_t  *a, float16x8_t b) {    vst1q_lane_f16(a, b, 7); @@ -5513,10 +5517,10 @@ void test_vst1_lane_s64(int64_t  *a, int64x1_t b) {  // CHECK-LABEL: define void @test_vst1_lane_f16(half* %a, <4 x half> %b) #0 {  // CHECK:   [[TMP0:%.*]] = bitcast half* %a to i8*  // CHECK:   [[TMP1:%.*]] = bitcast <4 x half> %b to <8 x i8> -// CHECK:   [[TMP2:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x half> -// CHECK:   [[TMP3:%.*]] = extractelement <4 x half> [[TMP2]], i32 3 -// CHECK:   [[TMP4:%.*]] = bitcast i8* [[TMP0]] to half* -// CHECK:   store half [[TMP3]], half* [[TMP4]] +// CHECK:   [[TMP2:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x i16> +// CHECK:   [[TMP3:%.*]] = extractelement <4 x i16> [[TMP2]], i32 3 +// CHECK:   [[TMP4:%.*]] = bitcast i8* [[TMP0]] to i16* +// CHECK:   store i16 [[TMP3]], i16* [[TMP4]]  // CHECK:   ret void  void test_vst1_lane_f16(float16_t  *a, float16x4_t b) {    vst1_lane_f16(a, b, 3); @@ -5785,9 +5789,9 @@ void test_vst2q_lane_s64(int64_t  *a, int64x2x2_t b) {  // CHECK:   [[ARRAYIDX2:%.*]] = getelementptr inbounds [2 x <8 x half>], [2 x <8 x half>]* [[VAL1]], i64 0, i64 1  // CHECK:   [[TMP5:%.*]] = load <8 x half>, <8 x half>* [[ARRAYIDX2]], align 16  // CHECK:   [[TMP6:%.*]] = bitcast <8 x half> [[TMP5]] to <16 x i8> -// CHECK:   [[TMP7:%.*]] = bitcast <16 x i8> [[TMP4]] to <8 x half> -// CHECK:   [[TMP8:%.*]] = bitcast <16 x i8> [[TMP6]] to <8 x half> -// CHECK:   call void @llvm.aarch64.neon.st2lane.v8f16.p0i8(<8 x half> [[TMP7]], <8 x half> [[TMP8]], i64 7, i8* [[TMP2]]) +// CHECK:   [[TMP7:%.*]] = bitcast <16 x i8> [[TMP4]] to <8 x i16> +// CHECK:   [[TMP8:%.*]] = bitcast <16 x i8> [[TMP6]] to <8 x i16> +// CHECK:   call void @llvm.aarch64.neon.st2lane.v8i16.p0i8(<8 x i16> [[TMP7]], <8 x i16> [[TMP8]], i64 7, i8* [[TMP2]])  // CHECK:   ret void  void test_vst2q_lane_f16(float16_t  *a, float16x8x2_t b) {    vst2q_lane_f16(a, b, 7); @@ -6120,9 +6124,9 @@ void test_vst2_lane_s64(int64_t  *a, int64x1x2_t b) {  // CHECK:   [[ARRAYIDX2:%.*]] = getelementptr inbounds [2 x <4 x half>], [2 x <4 x half>]* [[VAL1]], i64 0, i64 1  // CHECK:   [[TMP5:%.*]] = load <4 x half>, <4 x half>* [[ARRAYIDX2]], align 8  // CHECK:   [[TMP6:%.*]] = bitcast <4 x half> [[TMP5]] to <8 x i8> -// CHECK:   [[TMP7:%.*]] = bitcast <8 x i8> [[TMP4]] to <4 x half> -// CHECK:   [[TMP8:%.*]] = bitcast <8 x i8> [[TMP6]] to <4 x half> -// CHECK:   call void @llvm.aarch64.neon.st2lane.v4f16.p0i8(<4 x half> [[TMP7]], <4 x half> [[TMP8]], i64 3, i8* [[TMP2]]) +// CHECK:   [[TMP7:%.*]] = bitcast <8 x i8> [[TMP4]] to <4 x i16> +// CHECK:   [[TMP8:%.*]] = bitcast <8 x i8> [[TMP6]] to <4 x i16> +// CHECK:   call void @llvm.aarch64.neon.st2lane.v4i16.p0i8(<4 x i16> [[TMP7]], <4 x i16> [[TMP8]], i64 3, i8* [[TMP2]])  // CHECK:   ret void  void test_vst2_lane_f16(float16_t  *a, float16x4x2_t b) {    vst2_lane_f16(a, b, 3); @@ -6495,10 +6499,10 @@ void test_vst3q_lane_s64(int64_t  *a, int64x2x3_t b) {  // CHECK:   [[ARRAYIDX4:%.*]] = getelementptr inbounds [3 x <8 x half>], [3 x <8 x half>]* [[VAL3]], i64 0, i64 2  // CHECK:   [[TMP7:%.*]] = load <8 x half>, <8 x half>* [[ARRAYIDX4]], align 16  // CHECK:   [[TMP8:%.*]] = bitcast <8 x half> [[TMP7]] to <16 x i8> -// CHECK:   [[TMP9:%.*]] = bitcast <16 x i8> [[TMP4]] to <8 x half> -// CHECK:   [[TMP10:%.*]] = bitcast <16 x i8> [[TMP6]] to <8 x half> -// CHECK:   [[TMP11:%.*]] = bitcast <16 x i8> [[TMP8]] to <8 x half> -// CHECK:   call void @llvm.aarch64.neon.st3lane.v8f16.p0i8(<8 x half> [[TMP9]], <8 x half> [[TMP10]], <8 x half> [[TMP11]], i64 7, i8* [[TMP2]]) +// CHECK:   [[TMP9:%.*]] = bitcast <16 x i8> [[TMP4]] to <8 x i16> +// CHECK:   [[TMP10:%.*]] = bitcast <16 x i8> [[TMP6]] to <8 x i16> +// CHECK:   [[TMP11:%.*]] = bitcast <16 x i8> [[TMP8]] to <8 x i16> +// CHECK:   call void @llvm.aarch64.neon.st3lane.v8i16.p0i8(<8 x i16> [[TMP9]], <8 x i16> [[TMP10]], <8 x i16> [[TMP11]], i64 7, i8* [[TMP2]])  // CHECK:   ret void  void test_vst3q_lane_f16(float16_t  *a, float16x8x3_t b) {    vst3q_lane_f16(a, b, 7); @@ -6894,10 +6898,10 @@ void test_vst3_lane_s64(int64_t  *a, int64x1x3_t b) {  // CHECK:   [[ARRAYIDX4:%.*]] = getelementptr inbounds [3 x <4 x half>], [3 x <4 x half>]* [[VAL3]], i64 0, i64 2  // CHECK:   [[TMP7:%.*]] = load <4 x half>, <4 x half>* [[ARRAYIDX4]], align 8  // CHECK:   [[TMP8:%.*]] = bitcast <4 x half> [[TMP7]] to <8 x i8> -// CHECK:   [[TMP9:%.*]] = bitcast <8 x i8> [[TMP4]] to <4 x half> -// CHECK:   [[TMP10:%.*]] = bitcast <8 x i8> [[TMP6]] to <4 x half> -// CHECK:   [[TMP11:%.*]] = bitcast <8 x i8> [[TMP8]] to <4 x half> -// CHECK:   call void @llvm.aarch64.neon.st3lane.v4f16.p0i8(<4 x half> [[TMP9]], <4 x half> [[TMP10]], <4 x half> [[TMP11]], i64 3, i8* [[TMP2]]) +// CHECK:   [[TMP9:%.*]] = bitcast <8 x i8> [[TMP4]] to <4 x i16> +// CHECK:   [[TMP10:%.*]] = bitcast <8 x i8> [[TMP6]] to <4 x i16> +// CHECK:   [[TMP11:%.*]] = bitcast <8 x i8> [[TMP8]] to <4 x i16> +// CHECK:   call void @llvm.aarch64.neon.st3lane.v4i16.p0i8(<4 x i16> [[TMP9]], <4 x i16> [[TMP10]], <4 x i16> [[TMP11]], i64 3, i8* [[TMP2]])  // CHECK:   ret void  void test_vst3_lane_f16(float16_t  *a, float16x4x3_t b) {    vst3_lane_f16(a, b, 3); @@ -7333,11 +7337,11 @@ void test_vst4q_lane_s64(int64_t  *a, int64x2x4_t b) {  // CHECK:   [[ARRAYIDX6:%.*]] = getelementptr inbounds [4 x <8 x half>], [4 x <8 x half>]* [[VAL5]], i64 0, i64 3  // CHECK:   [[TMP9:%.*]] = load <8 x half>, <8 x half>* [[ARRAYIDX6]], align 16  // CHECK:   [[TMP10:%.*]] = bitcast <8 x half> [[TMP9]] to <16 x i8> -// CHECK:   [[TMP11:%.*]] = bitcast <16 x i8> [[TMP4]] to <8 x half> -// CHECK:   [[TMP12:%.*]] = bitcast <16 x i8> [[TMP6]] to <8 x half> -// CHECK:   [[TMP13:%.*]] = bitcast <16 x i8> [[TMP8]] to <8 x half> -// CHECK:   [[TMP14:%.*]] = bitcast <16 x i8> [[TMP10]] to <8 x half> -// CHECK:   call void @llvm.aarch64.neon.st4lane.v8f16.p0i8(<8 x half> [[TMP11]], <8 x half> [[TMP12]], <8 x half> [[TMP13]], <8 x half> [[TMP14]], i64 7, i8* [[TMP2]]) +// CHECK:   [[TMP11:%.*]] = bitcast <16 x i8> [[TMP4]] to <8 x i16> +// CHECK:   [[TMP12:%.*]] = bitcast <16 x i8> [[TMP6]] to <8 x i16> +// CHECK:   [[TMP13:%.*]] = bitcast <16 x i8> [[TMP8]] to <8 x i16> +// CHECK:   [[TMP14:%.*]] = bitcast <16 x i8> [[TMP10]] to <8 x i16> +// CHECK:   call void @llvm.aarch64.neon.st4lane.v8i16.p0i8(<8 x i16> [[TMP11]], <8 x i16> [[TMP12]], <8 x i16> [[TMP13]], <8 x i16> [[TMP14]], i64 7, i8* [[TMP2]])  // CHECK:   ret void  void test_vst4q_lane_f16(float16_t  *a, float16x8x4_t b) {    vst4q_lane_f16(a, b, 7); @@ -7796,11 +7800,11 @@ void test_vst4_lane_s64(int64_t  *a, int64x1x4_t b) {  // CHECK:   [[ARRAYIDX6:%.*]] = getelementptr inbounds [4 x <4 x half>], [4 x <4 x half>]* [[VAL5]], i64 0, i64 3  // CHECK:   [[TMP9:%.*]] = load <4 x half>, <4 x half>* [[ARRAYIDX6]], align 8  // CHECK:   [[TMP10:%.*]] = bitcast <4 x half> [[TMP9]] to <8 x i8> -// CHECK:   [[TMP11:%.*]] = bitcast <8 x i8> [[TMP4]] to <4 x half> -// CHECK:   [[TMP12:%.*]] = bitcast <8 x i8> [[TMP6]] to <4 x half> -// CHECK:   [[TMP13:%.*]] = bitcast <8 x i8> [[TMP8]] to <4 x half> -// CHECK:   [[TMP14:%.*]] = bitcast <8 x i8> [[TMP10]] to <4 x half> -// CHECK:   call void @llvm.aarch64.neon.st4lane.v4f16.p0i8(<4 x half> [[TMP11]], <4 x half> [[TMP12]], <4 x half> [[TMP13]], <4 x half> [[TMP14]], i64 3, i8* [[TMP2]]) +// CHECK:   [[TMP11:%.*]] = bitcast <8 x i8> [[TMP4]] to <4 x i16> +// CHECK:   [[TMP12:%.*]] = bitcast <8 x i8> [[TMP6]] to <4 x i16> +// CHECK:   [[TMP13:%.*]] = bitcast <8 x i8> [[TMP8]] to <4 x i16> +// CHECK:   [[TMP14:%.*]] = bitcast <8 x i8> [[TMP10]] to <4 x i16> +// CHECK:   call void @llvm.aarch64.neon.st4lane.v4i16.p0i8(<4 x i16> [[TMP11]], <4 x i16> [[TMP12]], <4 x i16> [[TMP13]], <4 x i16> [[TMP14]], i64 3, i8* [[TMP2]])  // CHECK:   ret void  void test_vst4_lane_f16(float16_t  *a, float16x4x4_t b) {    vst4_lane_f16(a, b, 3); diff --git a/test/CodeGen/aarch64-v8.2a-neon-intrinsics.c b/test/CodeGen/aarch64-v8.2a-neon-intrinsics.c deleted file mode 100644 index 3f61238b64fb..000000000000 --- a/test/CodeGen/aarch64-v8.2a-neon-intrinsics.c +++ /dev/null @@ -1,1633 +0,0 @@ -// RUN: %clang_cc1 -triple arm64-none-linux-gnu -target-feature +neon -target-feature +fullfp16 -target-feature +v8.2a\ -// RUN: -fallow-half-arguments-and-returns -S -disable-O0-optnone -emit-llvm -o - %s \ -// RUN: | opt -S -mem2reg \ -// RUN: | FileCheck %s - -// REQUIRES: aarch64-registered-target - -#include <arm_neon.h> - -// CHECK-LABEL: test_vabs_f16 -// CHECK:  [[ABS:%.*]] =  call <4 x half> @llvm.fabs.v4f16(<4 x half> %a) -// CHECK:  ret <4 x half> [[ABS]] -float16x4_t test_vabs_f16(float16x4_t a) { -  return vabs_f16(a); -} - -// CHECK-LABEL: test_vabsq_f16 -// CHECK:  [[ABS:%.*]] = call <8 x half> @llvm.fabs.v8f16(<8 x half> %a) -// CHECK:  ret <8 x half> [[ABS]] -float16x8_t test_vabsq_f16(float16x8_t a) { -  return vabsq_f16(a); -} - -// CHECK-LABEL: test_vceqz_f16 -// CHECK:  [[TMP1:%.*]] = fcmp oeq <4 x half> %a, zeroinitializer -// CHECK:  [[TMP2:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i16> -// CHECK:  ret <4 x i16> [[TMP2]] -uint16x4_t test_vceqz_f16(float16x4_t a) { -  return vceqz_f16(a); -} - -// CHECK-LABEL: test_vceqzq_f16 -// CHECK:  [[TMP1:%.*]] = fcmp oeq <8 x half> %a, zeroinitializer -// CHECK:  [[TMP2:%.*]] = sext <8 x i1> [[TMP1:%.*]] to <8 x i16> -// CHECK:  ret <8 x i16> [[TMP2]] -uint16x8_t test_vceqzq_f16(float16x8_t a) { -  return vceqzq_f16(a); -} - -// CHECK-LABEL: test_vcgez_f16 -// CHECK:  [[TMP1:%.*]] = fcmp oge <4 x half> %a, zeroinitializer -// CHECK:  [[TMP2:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i16> -// CHECK:  ret <4 x i16> [[TMP2]] -uint16x4_t test_vcgez_f16(float16x4_t a) { -  return vcgez_f16(a); -} - -// CHECK-LABEL: test_vcgezq_f16 -// CHECK:  [[TMP1:%.*]] = fcmp oge <8 x half> %a, zeroinitializer -// CHECK:  [[TMP2:%.*]] = sext <8 x i1> [[TMP1:%.*]] to <8 x i16> -// CHECK:  ret <8 x i16> [[TMP2]] -uint16x8_t test_vcgezq_f16(float16x8_t a) { -  return vcgezq_f16(a); -} - -// CHECK-LABEL: test_vcgtz_f16 -// CHECK:  [[TMP1:%.*]] = fcmp ogt <4 x half> %a, zeroinitializer -// CHECK:  [[TMP2:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i16> -// CHECK:  ret <4 x i16> [[TMP2]] -uint16x4_t test_vcgtz_f16(float16x4_t a) { -  return vcgtz_f16(a); -} - -// CHECK-LABEL: test_vcgtzq_f16 -// CHECK:  [[TMP1:%.*]] = fcmp ogt <8 x half> %a, zeroinitializer -// CHECK:  [[TMP2:%.*]] = sext <8 x i1> [[TMP1:%.*]] to <8 x i16> -// CHECK:  ret <8 x i16> [[TMP2]] -uint16x8_t test_vcgtzq_f16(float16x8_t a) { -  return vcgtzq_f16(a); -} - -// CHECK-LABEL: test_vclez_f16 -// CHECK:  [[TMP1:%.*]] = fcmp ole <4 x half> %a, zeroinitializer -// CHECK:  [[TMP2:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i16> -// CHECK:  ret <4 x i16> [[TMP2]] -uint16x4_t test_vclez_f16(float16x4_t a) { -  return vclez_f16(a); -} - -// CHECK-LABEL: test_vclezq_f16 -// CHECK:  [[TMP1:%.*]] = fcmp ole <8 x half> %a, zeroinitializer -// CHECK:  [[TMP2:%.*]] = sext <8 x i1> [[TMP1:%.*]] to <8 x i16> -// CHECK:  ret <8 x i16> [[TMP2]] -uint16x8_t test_vclezq_f16(float16x8_t a) { -  return vclezq_f16(a); -} - -// CHECK-LABEL: test_vcltz_f16 -// CHECK:  [[TMP1:%.*]] = fcmp olt <4 x half> %a, zeroinitializer -// CHECK:  [[TMP2:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i16> -// CHECK:  ret <4 x i16> [[TMP2]] -uint16x4_t test_vcltz_f16(float16x4_t a) { -  return vcltz_f16(a); -} - -// CHECK-LABEL: test_vcltzq_f16 -// CHECK:  [[TMP1:%.*]] = fcmp olt <8 x half> %a, zeroinitializer -// CHECK:  [[TMP2:%.*]] = sext <8 x i1> [[TMP1:%.*]] to <8 x i16> -// CHECK:  ret <8 x i16> [[TMP2]] -uint16x8_t test_vcltzq_f16(float16x8_t a) { -  return vcltzq_f16(a); -} - -// CHECK-LABEL: test_vcvt_f16_s16 -// CHECK:  [[VCVT:%.*]] = sitofp <4 x i16> %a to <4 x half> -// CHECK:  ret <4 x half> [[VCVT]] -float16x4_t test_vcvt_f16_s16 (int16x4_t a) { -  return vcvt_f16_s16(a); -} - -// CHECK-LABEL: test_vcvtq_f16_s16 -// CHECK:  [[VCVT:%.*]] = sitofp <8 x i16> %a to <8 x half> -// CHECK:  ret <8 x half> [[VCVT]] -float16x8_t test_vcvtq_f16_s16 (int16x8_t a) { -  return vcvtq_f16_s16(a); -} - -// CHECK-LABEL: test_vcvt_f16_u16 -// CHECK:  [[VCVT:%.*]] = uitofp <4 x i16> %a to <4 x half> -// CHECK:  ret <4 x half> [[VCVT]] -float16x4_t test_vcvt_f16_u16 (uint16x4_t a) { -  return vcvt_f16_u16(a); -} - -// CHECK-LABEL: test_vcvtq_f16_u16 -// CHECK:  [[VCVT:%.*]] = uitofp <8 x i16> %a to <8 x half> -// CHECK:  ret <8 x half> [[VCVT]] -float16x8_t test_vcvtq_f16_u16 (uint16x8_t a) { -  return vcvtq_f16_u16(a); -} - -// CHECK-LABEL: test_vcvt_s16_f16 -// CHECK:  [[VCVT:%.*]] = fptosi <4 x half> %a to <4 x i16> -// CHECK:  ret <4 x i16> [[VCVT]] -int16x4_t test_vcvt_s16_f16 (float16x4_t a) { -  return vcvt_s16_f16(a); -} - -// CHECK-LABEL: test_vcvtq_s16_f16 -// CHECK:  [[VCVT:%.*]] = fptosi <8 x half> %a to <8 x i16> -// CHECK:  ret <8 x i16> [[VCVT]] -int16x8_t test_vcvtq_s16_f16 (float16x8_t a) { -  return vcvtq_s16_f16(a); -} - -// CHECK-LABEL: test_vcvt_u16_f16 -// CHECK:  [[VCVT:%.*]] = fptoui <4 x half> %a to <4 x i16> -// CHECK:  ret <4 x i16> [[VCVT]] -int16x4_t test_vcvt_u16_f16 (float16x4_t a) { -  return vcvt_u16_f16(a); -} - -// CHECK-LABEL: test_vcvtq_u16_f16 -// CHECK:  [[VCVT:%.*]] = fptoui <8 x half> %a to <8 x i16> -// CHECK:  ret <8 x i16> [[VCVT]] -int16x8_t test_vcvtq_u16_f16 (float16x8_t a) { -  return vcvtq_u16_f16(a); -} - -// CHECK-LABEL: test_vcvta_s16_f16 -// CHECK:  [[VCVT:%.*]] = call <4 x i16> @llvm.aarch64.neon.fcvtas.v4i16.v4f16(<4 x half> %a) -// CHECK:  ret <4 x i16> [[VCVT]] -int16x4_t test_vcvta_s16_f16 (float16x4_t a) { -  return vcvta_s16_f16(a); -} - -// CHECK-LABEL: test_vcvtaq_s16_f16 -// CHECK:  [[VCVT:%.*]] = call <8 x i16> @llvm.aarch64.neon.fcvtas.v8i16.v8f16(<8 x half> %a) -// CHECK:  ret <8 x i16> [[VCVT]] -int16x8_t test_vcvtaq_s16_f16 (float16x8_t a) { -  return vcvtaq_s16_f16(a); -} - -// CHECK-LABEL: test_vcvtm_s16_f16 -// CHECK:  [[VCVT:%.*]] = call <4 x i16> @llvm.aarch64.neon.fcvtms.v4i16.v4f16(<4 x half> %a) -// CHECK:  ret <4 x i16> [[VCVT]] -int16x4_t test_vcvtm_s16_f16 (float16x4_t a) { -  return vcvtm_s16_f16(a); -} - -// CHECK-LABEL: test_vcvtmq_s16_f16 -// CHECK:  [[VCVT:%.*]] = call <8 x i16> @llvm.aarch64.neon.fcvtms.v8i16.v8f16(<8 x half> %a) -// CHECK:  ret <8 x i16> [[VCVT]] -int16x8_t test_vcvtmq_s16_f16 (float16x8_t a) { -  return vcvtmq_s16_f16(a); -} - -// CHECK-LABEL: test_vcvtm_u16_f16 -// CHECK:  [[VCVT:%.*]] = call <4 x i16> @llvm.aarch64.neon.fcvtmu.v4i16.v4f16(<4 x half> %a) -// CHECK:  ret <4 x i16> [[VCVT]] -uint16x4_t test_vcvtm_u16_f16 (float16x4_t a) { -  return vcvtm_u16_f16(a); -} - -// CHECK-LABEL: test_vcvtmq_u16_f16 -// CHECK:  [[VCVT:%.*]] = call <8 x i16> @llvm.aarch64.neon.fcvtmu.v8i16.v8f16(<8 x half> %a) -// CHECK:  ret <8 x i16> [[VCVT]] -uint16x8_t test_vcvtmq_u16_f16 (float16x8_t a) { -  return vcvtmq_u16_f16(a); -} - -// CHECK-LABEL: test_vcvtn_s16_f16 -// CHECK:  [[VCVT:%.*]] = call <4 x i16> @llvm.aarch64.neon.fcvtns.v4i16.v4f16(<4 x half> %a) -// CHECK:  ret <4 x i16> [[VCVT]] -int16x4_t test_vcvtn_s16_f16 (float16x4_t a) { -  return vcvtn_s16_f16(a); -} - -// CHECK-LABEL: test_vcvtnq_s16_f16 -// CHECK:  [[VCVT:%.*]] = call <8 x i16> @llvm.aarch64.neon.fcvtns.v8i16.v8f16(<8 x half> %a) -// CHECK:  ret <8 x i16> [[VCVT]] -int16x8_t test_vcvtnq_s16_f16 (float16x8_t a) { -  return vcvtnq_s16_f16(a); -} - -// CHECK-LABEL: test_vcvtn_u16_f16 -// CHECK:  [[VCVT:%.*]] = call <4 x i16> @llvm.aarch64.neon.fcvtnu.v4i16.v4f16(<4 x half> %a) -// CHECK:  ret <4 x i16> [[VCVT]] -uint16x4_t test_vcvtn_u16_f16 (float16x4_t a) { -  return vcvtn_u16_f16(a); -} - -// CHECK-LABEL: test_vcvtnq_u16_f16 -// CHECK:  [[VCVT:%.*]] = call <8 x i16> @llvm.aarch64.neon.fcvtnu.v8i16.v8f16(<8 x half> %a) -// CHECK:  ret <8 x i16> [[VCVT]] -uint16x8_t test_vcvtnq_u16_f16 (float16x8_t a) { -  return vcvtnq_u16_f16(a); -} - -// CHECK-LABEL: test_vcvtp_s16_f16 -// CHECK:  [[VCVT:%.*]] = call <4 x i16> @llvm.aarch64.neon.fcvtps.v4i16.v4f16(<4 x half> %a) -// CHECK:  ret <4 x i16> [[VCVT]] -int16x4_t test_vcvtp_s16_f16 (float16x4_t a) { -  return vcvtp_s16_f16(a); -} - -// CHECK-LABEL: test_vcvtpq_s16_f16 -// CHECK:  [[VCVT:%.*]] = call <8 x i16> @llvm.aarch64.neon.fcvtps.v8i16.v8f16(<8 x half> %a) -// CHECK:  ret <8 x i16> [[VCVT]] -int16x8_t test_vcvtpq_s16_f16 (float16x8_t a) { -  return vcvtpq_s16_f16(a); -} - -// CHECK-LABEL: test_vcvtp_u16_f16 -// CHECK:  [[VCVT:%.*]] = call <4 x i16> @llvm.aarch64.neon.fcvtpu.v4i16.v4f16(<4 x half> %a) -// CHECK:  ret <4 x i16> [[VCVT]] -uint16x4_t test_vcvtp_u16_f16 (float16x4_t a) { -  return vcvtp_u16_f16(a); -} - -// CHECK-LABEL: test_vcvtpq_u16_f16 -// CHECK:  [[VCVT:%.*]] = call <8 x i16> @llvm.aarch64.neon.fcvtpu.v8i16.v8f16(<8 x half> %a) -// CHECK:  ret <8 x i16> [[VCVT]] -uint16x8_t test_vcvtpq_u16_f16 (float16x8_t a) { -  return vcvtpq_u16_f16(a); -} - -// FIXME: Fix the zero constant when fp16 non-storage-only type becomes available. -// CHECK-LABEL: test_vneg_f16 -// CHECK:  [[NEG:%.*]] = fsub <4 x half> <half 0xH8000, half 0xH8000, half 0xH8000, half 0xH8000>, %a -// CHECK:  ret <4 x half> [[NEG]] -float16x4_t test_vneg_f16(float16x4_t a) { -  return vneg_f16(a); -} - -// CHECK-LABEL: test_vnegq_f16 -// CHECK:  [[NEG:%.*]] = fsub <8 x half> <half 0xH8000, half 0xH8000, half 0xH8000, half 0xH8000, half 0xH8000, half 0xH8000, half 0xH8000, half 0xH8000>, %a -// CHECK:  ret <8 x half> [[NEG]] -float16x8_t test_vnegq_f16(float16x8_t a) { -  return vnegq_f16(a); -} - -// CHECK-LABEL: test_vrecpe_f16 -// CHECK:  [[RCP:%.*]] = call <4 x half> @llvm.aarch64.neon.frecpe.v4f16(<4 x half> %a) -// CHECK:  ret <4 x half> [[RCP]] -float16x4_t test_vrecpe_f16(float16x4_t a) { -  return vrecpe_f16(a); -} - -// CHECK-LABEL: test_vrecpeq_f16 -// CHECK:  [[RCP:%.*]] = call <8 x half> @llvm.aarch64.neon.frecpe.v8f16(<8 x half> %a) -// CHECK:  ret <8 x half> [[RCP]] -float16x8_t test_vrecpeq_f16(float16x8_t a) { -  return vrecpeq_f16(a); -} - -// CHECK-LABEL: test_vrnd_f16 -// CHECK:  [[RND:%.*]] =  call <4 x half> @llvm.trunc.v4f16(<4 x half> %a) -// CHECK:  ret <4 x half> [[RND]] -float16x4_t test_vrnd_f16(float16x4_t a) { -  return vrnd_f16(a); -} - -// CHECK-LABEL: test_vrndq_f16 -// CHECK:  [[RND:%.*]] =  call <8 x half> @llvm.trunc.v8f16(<8 x half> %a) -// CHECK:  ret <8 x half> [[RND]] -float16x8_t test_vrndq_f16(float16x8_t a) { -  return vrndq_f16(a); -} - -// CHECK-LABEL: test_vrnda_f16 -// CHECK:  [[RND:%.*]] =  call <4 x half> @llvm.round.v4f16(<4 x half> %a) -// CHECK:  ret <4 x half> [[RND]] -float16x4_t test_vrnda_f16(float16x4_t a) { -  return vrnda_f16(a); -} - -// CHECK-LABEL: test_vrndaq_f16 -// CHECK:  [[RND:%.*]] =  call <8 x half> @llvm.round.v8f16(<8 x half> %a) -// CHECK:  ret <8 x half> [[RND]] -float16x8_t test_vrndaq_f16(float16x8_t a) { -  return vrndaq_f16(a); -} - -// CHECK-LABEL: test_vrndi_f16 -// CHECK:  [[RND:%.*]] =  call <4 x half> @llvm.nearbyint.v4f16(<4 x half> %a) -// CHECK:  ret <4 x half> [[RND]] -float16x4_t test_vrndi_f16(float16x4_t a) { -  return vrndi_f16(a); -} - -// CHECK-LABEL: test_vrndiq_f16 -// CHECK:  [[RND:%.*]] =  call <8 x half> @llvm.nearbyint.v8f16(<8 x half> %a) -// CHECK:  ret <8 x half> [[RND]] -float16x8_t test_vrndiq_f16(float16x8_t a) { -  return vrndiq_f16(a); -} - -// CHECK-LABEL: test_vrndm_f16 -// CHECK:  [[RND:%.*]] =  call <4 x half> @llvm.floor.v4f16(<4 x half> %a) -// CHECK:  ret <4 x half> [[RND]] -float16x4_t test_vrndm_f16(float16x4_t a) { -  return vrndm_f16(a); -} - -// CHECK-LABEL: test_vrndmq_f16 -// CHECK:  [[RND:%.*]] =  call <8 x half> @llvm.floor.v8f16(<8 x half> %a) -// CHECK:  ret <8 x half> [[RND]] -float16x8_t test_vrndmq_f16(float16x8_t a) { -  return vrndmq_f16(a); -} - -// CHECK-LABEL: test_vrndn_f16 -// CHECK:  [[RND:%.*]] =  call <4 x half> @llvm.aarch64.neon.frintn.v4f16(<4 x half> %a) -// CHECK:  ret <4 x half> [[RND]] -float16x4_t test_vrndn_f16(float16x4_t a) { -  return vrndn_f16(a); -} - -// CHECK-LABEL: test_vrndnq_f16 -// CHECK:  [[RND:%.*]] =  call <8 x half> @llvm.aarch64.neon.frintn.v8f16(<8 x half> %a) -// CHECK:  ret <8 x half> [[RND]] -float16x8_t test_vrndnq_f16(float16x8_t a) { -  return vrndnq_f16(a); -} - -// CHECK-LABEL: test_vrndp_f16 -// CHECK:  [[RND:%.*]] =  call <4 x half> @llvm.ceil.v4f16(<4 x half> %a) -// CHECK:  ret <4 x half> [[RND]] -float16x4_t test_vrndp_f16(float16x4_t a) { -  return vrndp_f16(a); -} - -// CHECK-LABEL: test_vrndpq_f16 -// CHECK:  [[RND:%.*]] =  call <8 x half> @llvm.ceil.v8f16(<8 x half> %a) -// CHECK:  ret <8 x half> [[RND]] -float16x8_t test_vrndpq_f16(float16x8_t a) { -  return vrndpq_f16(a); -} - -// CHECK-LABEL: test_vrndx_f16 -// CHECK:  [[RND:%.*]] =  call <4 x half> @llvm.rint.v4f16(<4 x half> %a) -// CHECK:  ret <4 x half> [[RND]] -float16x4_t test_vrndx_f16(float16x4_t a) { -  return vrndx_f16(a); -} - -// CHECK-LABEL: test_vrndxq_f16 -// CHECK:  [[RND:%.*]] =  call <8 x half> @llvm.rint.v8f16(<8 x half> %a) -// CHECK:  ret <8 x half> [[RND]] -float16x8_t test_vrndxq_f16(float16x8_t a) { -  return vrndxq_f16(a); -} - -// CHECK-LABEL: test_vrsqrte_f16 -// CHECK:  [[RND:%.*]] = call <4 x half> @llvm.aarch64.neon.frsqrte.v4f16(<4 x half> %a) -// CHECK:  ret <4 x half> [[RND]] -float16x4_t test_vrsqrte_f16(float16x4_t a) { -  return vrsqrte_f16(a); -} - -// CHECK-LABEL: test_vrsqrteq_f16 -// CHECK:  [[RND:%.*]] = call <8 x half> @llvm.aarch64.neon.frsqrte.v8f16(<8 x half> %a) -// CHECK:  ret <8 x half> [[RND]] -float16x8_t test_vrsqrteq_f16(float16x8_t a) { -  return vrsqrteq_f16(a); -} - -// CHECK-LABEL: test_vsqrt_f16 -// CHECK:  [[SQR:%.*]] = call <4 x half> @llvm.sqrt.v4f16(<4 x half> %a) -// CHECK:  ret <4 x half> [[SQR]] -float16x4_t test_vsqrt_f16(float16x4_t a) { -  return vsqrt_f16(a); -} - -// CHECK-LABEL: test_vsqrtq_f16 -// CHECK:  [[SQR:%.*]] = call <8 x half> @llvm.sqrt.v8f16(<8 x half> %a) -// CHECK:  ret <8 x half> [[SQR]] -float16x8_t test_vsqrtq_f16(float16x8_t a) { -  return vsqrtq_f16(a); -} - -// CHECK-LABEL: test_vadd_f16 -// CHECK:  [[ADD:%.*]] = fadd <4 x half> %a, %b -// CHECK:  ret <4 x half> [[ADD]] -float16x4_t test_vadd_f16(float16x4_t a, float16x4_t b) { -  return vadd_f16(a, b); -} - -// CHECK-LABEL: test_vaddq_f16 -// CHECK:  [[ADD:%.*]] = fadd <8 x half> %a, %b -// CHECK:  ret <8 x half> [[ADD]] -float16x8_t test_vaddq_f16(float16x8_t a, float16x8_t b) { -  return vaddq_f16(a, b); -} - -// CHECK-LABEL: test_vabd_f16 -// CHECK:  [[ABD:%.*]] = call <4 x half> @llvm.aarch64.neon.fabd.v4f16(<4 x half> %a, <4 x half> %b) -// CHECK:  ret <4 x half> [[ABD]] -float16x4_t test_vabd_f16(float16x4_t a, float16x4_t b) { -  return vabd_f16(a, b); -} - -// CHECK-LABEL: test_vabdq_f16 -// CHECK:  [[ABD:%.*]] = call <8 x half> @llvm.aarch64.neon.fabd.v8f16(<8 x half> %a, <8 x half> %b) -// CHECK:  ret <8 x half> [[ABD]] -float16x8_t test_vabdq_f16(float16x8_t a, float16x8_t b) { -  return vabdq_f16(a, b); -} - -// CHECK-LABEL: test_vcage_f16 -// CHECK:  [[ABS:%.*]] = call <4 x i16> @llvm.aarch64.neon.facge.v4i16.v4f16(<4 x half> %a, <4 x half> %b) -// CHECK:  ret <4 x i16> [[ABS]] -uint16x4_t test_vcage_f16(float16x4_t a, float16x4_t b) { -  return vcage_f16(a, b); -} - -// CHECK-LABEL: test_vcageq_f16 -// CHECK:  [[ABS:%.*]] = call <8 x i16> @llvm.aarch64.neon.facge.v8i16.v8f16(<8 x half> %a, <8 x half> %b) -// CHECK:  ret <8 x i16> [[ABS]] -uint16x8_t test_vcageq_f16(float16x8_t a, float16x8_t b) { -  return vcageq_f16(a, b); -} - -// CHECK-LABEL: test_vcagt_f16 -// CHECK:  [[ABS:%.*]] = call <4 x i16> @llvm.aarch64.neon.facgt.v4i16.v4f16(<4 x half> %a, <4 x half> %b) -// CHECK:  ret <4 x i16> [[ABS]] -uint16x4_t test_vcagt_f16(float16x4_t a, float16x4_t b) { -  return vcagt_f16(a, b); -} - -// CHECK-LABEL: test_vcagtq_f16 -// CHECK:  [[ABS:%.*]] = call <8 x i16> @llvm.aarch64.neon.facgt.v8i16.v8f16(<8 x half> %a, <8 x half> %b) -// CHECK:  ret <8 x i16> [[ABS]] -uint16x8_t test_vcagtq_f16(float16x8_t a, float16x8_t b) { -  return vcagtq_f16(a, b); -} - -// CHECK-LABEL: test_vcale_f16 -// CHECK:  [[ABS:%.*]] = call <4 x i16> @llvm.aarch64.neon.facge.v4i16.v4f16(<4 x half> %b, <4 x half> %a) -// CHECK:  ret <4 x i16> [[ABS]] -uint16x4_t test_vcale_f16(float16x4_t a, float16x4_t b) { -  return vcale_f16(a, b); -} - -// CHECK-LABEL: test_vcaleq_f16 -// CHECK:  [[ABS:%.*]] = call <8 x i16> @llvm.aarch64.neon.facge.v8i16.v8f16(<8 x half> %b, <8 x half> %a) -// CHECK:  ret <8 x i16> [[ABS]] -uint16x8_t test_vcaleq_f16(float16x8_t a, float16x8_t b) { -  return vcaleq_f16(a, b); -} - -// CHECK-LABEL: test_vcalt_f16 -// CHECK:  [[ABS:%.*]] = call <4 x i16> @llvm.aarch64.neon.facgt.v4i16.v4f16(<4 x half> %b, <4 x half> %a) -// CHECK:  ret <4 x i16> [[ABS]] -uint16x4_t test_vcalt_f16(float16x4_t a, float16x4_t b) { -  return vcalt_f16(a, b); -} - -// CHECK-LABEL: test_vcaltq_f16 -// CHECK:  [[ABS:%.*]] = call <8 x i16> @llvm.aarch64.neon.facgt.v8i16.v8f16(<8 x half> %b, <8 x half> %a) -// CHECK:  ret <8 x i16> [[ABS]] -uint16x8_t test_vcaltq_f16(float16x8_t a, float16x8_t b) { -  return vcaltq_f16(a, b); -} - -// CHECK-LABEL: test_vceq_f16 -// CHECK:  [[TMP1:%.*]] = fcmp oeq <4 x half> %a, %b -// CHECK:  [[TMP2:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i16> -// CHECK:  ret <4 x i16> [[TMP2]] -uint16x4_t test_vceq_f16(float16x4_t a, float16x4_t b) { -  return vceq_f16(a, b); -} - -// CHECK-LABEL: test_vceqq_f16 -// CHECK:  [[TMP1:%.*]] = fcmp oeq <8 x half> %a, %b -// CHECK:  [[TMP2:%.*]] = sext <8 x i1> [[TMP1:%.*]] to <8 x i16> -// CHECK:  ret <8 x i16> [[TMP2]] -uint16x8_t test_vceqq_f16(float16x8_t a, float16x8_t b) { -  return vceqq_f16(a, b); -} - -// CHECK-LABEL: test_vcge_f16 -// CHECK:  [[TMP1:%.*]] = fcmp oge <4 x half> %a, %b -// CHECK:  [[TMP2:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i16> -// CHECK:  ret <4 x i16> [[TMP2]] -uint16x4_t test_vcge_f16(float16x4_t a, float16x4_t b) { -  return vcge_f16(a, b); -} - -// CHECK-LABEL: test_vcgeq_f16 -// CHECK:  [[TMP1:%.*]] = fcmp oge <8 x half> %a, %b -// CHECK:  [[TMP2:%.*]] = sext <8 x i1> [[TMP1:%.*]] to <8 x i16> -// CHECK:  ret <8 x i16> [[TMP2]] -uint16x8_t test_vcgeq_f16(float16x8_t a, float16x8_t b) { -  return vcgeq_f16(a, b); -} - -// CHECK-LABEL: test_vcgt_f16 -// CHECK:  [[TMP1:%.*]] = fcmp ogt <4 x half> %a, %b -// CHECK:  [[TMP2:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i16> -// CHECK:  ret <4 x i16> [[TMP2]] -uint16x4_t test_vcgt_f16(float16x4_t a, float16x4_t b) { -  return vcgt_f16(a, b); -} - -// CHECK-LABEL: test_vcgtq_f16 -// CHECK:  [[TMP1:%.*]] = fcmp ogt <8 x half> %a, %b -// CHECK:  [[TMP2:%.*]] = sext <8 x i1> [[TMP1:%.*]] to <8 x i16> -// CHECK:  ret <8 x i16> [[TMP2]] -uint16x8_t test_vcgtq_f16(float16x8_t a, float16x8_t b) { -  return vcgtq_f16(a, b); -} - -// CHECK-LABEL: test_vcle_f16 -// CHECK:  [[TMP1:%.*]] = fcmp ole <4 x half> %a, %b -// CHECK:  [[TMP2:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i16> -// CHECK:  ret <4 x i16> [[TMP2]] -uint16x4_t test_vcle_f16(float16x4_t a, float16x4_t b) { -  return vcle_f16(a, b); -} - -// CHECK-LABEL: test_vcleq_f16 -// CHECK:  [[TMP1:%.*]] = fcmp ole <8 x half> %a, %b -// CHECK:  [[TMP2:%.*]] = sext <8 x i1> [[TMP1:%.*]] to <8 x i16> -// CHECK:  ret <8 x i16> [[TMP2]] -uint16x8_t test_vcleq_f16(float16x8_t a, float16x8_t b) { -  return vcleq_f16(a, b); -} - -// CHECK-LABEL: test_vclt_f16 -// CHECK:  [[TMP1:%.*]] = fcmp olt <4 x half> %a, %b -// CHECK:  [[TMP2:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i16> -// CHECK:  ret <4 x i16> [[TMP2]] -uint16x4_t test_vclt_f16(float16x4_t a, float16x4_t b) { -  return vclt_f16(a, b); -} - -// CHECK-LABEL: test_vcltq_f16 -// CHECK:  [[TMP1:%.*]] = fcmp olt <8 x half> %a, %b -// CHECK:  [[TMP2:%.*]] = sext <8 x i1> [[TMP1:%.*]] to <8 x i16> -// CHECK:  ret <8 x i16> [[TMP2]] -uint16x8_t test_vcltq_f16(float16x8_t a, float16x8_t b) { -  return vcltq_f16(a, b); -} - -// CHECK-LABEL: test_vcvt_n_f16_s16 -// CHECK:  [[CVT:%.*]] = call <4 x half> @llvm.aarch64.neon.vcvtfxs2fp.v4f16.v4i16(<4 x i16> %vcvt_n, i32 2) -// CHECK:  ret <4 x half> [[CVT]] -float16x4_t test_vcvt_n_f16_s16(int16x4_t a) { -  return vcvt_n_f16_s16(a, 2); -} - -// CHECK-LABEL: test_vcvtq_n_f16_s16 -// CHECK:  [[CVT:%.*]] = call <8 x half> @llvm.aarch64.neon.vcvtfxs2fp.v8f16.v8i16(<8 x i16> %vcvt_n, i32 2) -// CHECK:  ret <8 x half> [[CVT]] -float16x8_t test_vcvtq_n_f16_s16(int16x8_t a) { -  return vcvtq_n_f16_s16(a, 2); -} - -// CHECK-LABEL: test_vcvt_n_f16_u16 -// CHECK:  [[CVT:%.*]] = call <4 x half> @llvm.aarch64.neon.vcvtfxu2fp.v4f16.v4i16(<4 x i16> %vcvt_n, i32 2) -// CHECK:  ret <4 x half> [[CVT]] -float16x4_t test_vcvt_n_f16_u16(uint16x4_t a) { -  return vcvt_n_f16_u16(a, 2); -} - -// CHECK-LABEL: test_vcvtq_n_f16_u16 -// CHECK:  [[CVT:%.*]] = call <8 x half> @llvm.aarch64.neon.vcvtfxu2fp.v8f16.v8i16(<8 x i16> %vcvt_n, i32 2) -// CHECK:  ret <8 x half> [[CVT]] -float16x8_t test_vcvtq_n_f16_u16(uint16x8_t a) { -  return vcvtq_n_f16_u16(a, 2); -} - -// CHECK-LABEL: test_vcvt_n_s16_f16 -// CHECK:  [[CVT:%.*]] = call <4 x i16> @llvm.aarch64.neon.vcvtfp2fxs.v4i16.v4f16(<4 x half> %vcvt_n, i32 2) -// CHECK:  ret <4 x i16> [[CVT]] -int16x4_t test_vcvt_n_s16_f16(float16x4_t a) { -  return vcvt_n_s16_f16(a, 2); -} - -// CHECK-LABEL: test_vcvtq_n_s16_f16 -// CHECK:  [[CVT:%.*]] = call <8 x i16> @llvm.aarch64.neon.vcvtfp2fxs.v8i16.v8f16(<8 x half> %vcvt_n, i32 2) -// CHECK:  ret <8 x i16> [[CVT]] -int16x8_t test_vcvtq_n_s16_f16(float16x8_t a) { -  return vcvtq_n_s16_f16(a, 2); -} - -// CHECK-LABEL: test_vcvt_n_u16_f16 -// CHECK:  [[CVT:%.*]] = call <4 x i16> @llvm.aarch64.neon.vcvtfp2fxu.v4i16.v4f16(<4 x half> %vcvt_n, i32 2) -// CHECK:  ret <4 x i16> [[CVT]] -uint16x4_t test_vcvt_n_u16_f16(float16x4_t a) { -  return vcvt_n_u16_f16(a, 2); -} - -// CHECK-LABEL: test_vcvtq_n_u16_f16 -// CHECK:  [[CVT:%.*]] = call <8 x i16> @llvm.aarch64.neon.vcvtfp2fxu.v8i16.v8f16(<8 x half> %vcvt_n, i32 2) -// CHECK:  ret <8 x i16> [[CVT]] -uint16x8_t test_vcvtq_n_u16_f16(float16x8_t a) { -  return vcvtq_n_u16_f16(a, 2); -} - -// CHECK-LABEL: test_vdiv_f16 -// CHECK:  [[DIV:%.*]] = fdiv <4 x half> %a, %b -// CHECK:  ret <4 x half> [[DIV]] -float16x4_t test_vdiv_f16(float16x4_t a, float16x4_t b) { -  return vdiv_f16(a, b); -} - -// CHECK-LABEL: test_vdivq_f16 -// CHECK:  [[DIV:%.*]] = fdiv <8 x half> %a, %b -// CHECK:  ret <8 x half> [[DIV]] -float16x8_t test_vdivq_f16(float16x8_t a, float16x8_t b) { -  return vdivq_f16(a, b); -} - -// CHECK-LABEL: test_vmax_f16 -// CHECK:  [[MAX:%.*]] = call <4 x half> @llvm.aarch64.neon.fmax.v4f16(<4 x half> %a, <4 x half> %b) -// CHECK:  ret <4 x half> [[MAX]] -float16x4_t test_vmax_f16(float16x4_t a, float16x4_t b) { -  return vmax_f16(a, b); -} - -// CHECK-LABEL: test_vmaxq_f16 -// CHECK:  [[MAX:%.*]] = call <8 x half> @llvm.aarch64.neon.fmax.v8f16(<8 x half> %a, <8 x half> %b) -// CHECK:  ret <8 x half> [[MAX]] -float16x8_t test_vmaxq_f16(float16x8_t a, float16x8_t b) { -  return vmaxq_f16(a, b); -} - -// CHECK-LABEL: test_vmaxnm_f16 -// CHECK:  [[MAX:%.*]] = call <4 x half> @llvm.aarch64.neon.fmaxnm.v4f16(<4 x half> %a, <4 x half> %b) -// CHECK:  ret <4 x half> [[MAX]] -float16x4_t test_vmaxnm_f16(float16x4_t a, float16x4_t b) { -  return vmaxnm_f16(a, b); -} - -// CHECK-LABEL: test_vmaxnmq_f16 -// CHECK:  [[MAX:%.*]] = call <8 x half> @llvm.aarch64.neon.fmaxnm.v8f16(<8 x half> %a, <8 x half> %b) -// CHECK:  ret <8 x half> [[MAX]] -float16x8_t test_vmaxnmq_f16(float16x8_t a, float16x8_t b) { -  return vmaxnmq_f16(a, b); -} - -// CHECK-LABEL: test_vmin_f16 -// CHECK:  [[MIN:%.*]] = call <4 x half> @llvm.aarch64.neon.fmin.v4f16(<4 x half> %a, <4 x half> %b) -// CHECK:  ret <4 x half> [[MIN]] -float16x4_t test_vmin_f16(float16x4_t a, float16x4_t b) { -  return vmin_f16(a, b); -} - -// CHECK-LABEL: test_vminq_f16 -// CHECK:  [[MIN:%.*]] = call <8 x half> @llvm.aarch64.neon.fmin.v8f16(<8 x half> %a, <8 x half> %b) -// CHECK:  ret <8 x half> [[MIN]] -float16x8_t test_vminq_f16(float16x8_t a, float16x8_t b) { -  return vminq_f16(a, b); -} - -// CHECK-LABEL: test_vminnm_f16 -// CHECK:  [[MIN:%.*]] = call <4 x half> @llvm.aarch64.neon.fminnm.v4f16(<4 x half> %a, <4 x half> %b) -// CHECK:  ret <4 x half> [[MIN]] -float16x4_t test_vminnm_f16(float16x4_t a, float16x4_t b) { -  return vminnm_f16(a, b); -} - -// CHECK-LABEL: test_vminnmq_f16 -// CHECK:  [[MIN:%.*]] = call <8 x half> @llvm.aarch64.neon.fminnm.v8f16(<8 x half> %a, <8 x half> %b) -// CHECK:  ret <8 x half> [[MIN]] -float16x8_t test_vminnmq_f16(float16x8_t a, float16x8_t b) { -  return vminnmq_f16(a, b); -} - -// CHECK-LABEL: test_vmul_f16 -// CHECK:  [[MUL:%.*]] = fmul <4 x half> %a, %b -// CHECK:  ret <4 x half> [[MUL]] -float16x4_t test_vmul_f16(float16x4_t a, float16x4_t b) { -  return vmul_f16(a, b); -} - -// CHECK-LABEL: test_vmulq_f16 -// CHECK:  [[MUL:%.*]] = fmul <8 x half> %a, %b -// CHECK:  ret <8 x half> [[MUL]] -float16x8_t test_vmulq_f16(float16x8_t a, float16x8_t b) { -  return vmulq_f16(a, b); -} - -// CHECK-LABEL: test_vmulx_f16 -// CHECK:  [[MUL:%.*]] = call <4 x half> @llvm.aarch64.neon.fmulx.v4f16(<4 x half> %a, <4 x half> %b) -// CHECK:  ret <4 x half> [[MUL]] -float16x4_t test_vmulx_f16(float16x4_t a, float16x4_t b) { -  return vmulx_f16(a, b); -} - -// CHECK-LABEL: test_vmulxq_f16 -// CHECK:  [[MUL:%.*]] = call <8 x half> @llvm.aarch64.neon.fmulx.v8f16(<8 x half> %a, <8 x half> %b) -// CHECK:  ret <8 x half> [[MUL]] -float16x8_t test_vmulxq_f16(float16x8_t a, float16x8_t b) { -  return vmulxq_f16(a, b); -} - -// CHECK-LABEL: test_vpadd_f16 -// CHECK:  [[ADD:%.*]] = call <4 x half> @llvm.aarch64.neon.addp.v4f16(<4 x half> %a, <4 x half> %b) -// CHECK:  ret <4 x half> [[ADD]] -float16x4_t test_vpadd_f16(float16x4_t a, float16x4_t b) { -  return vpadd_f16(a, b); -} - -// CHECK-LABEL: test_vpaddq_f16 -// CHECK:  [[ADD:%.*]] = call <8 x half> @llvm.aarch64.neon.addp.v8f16(<8 x half> %a, <8 x half> %b) -// CHECK:  ret <8 x half> [[ADD]] -float16x8_t test_vpaddq_f16(float16x8_t a, float16x8_t b) { -  return vpaddq_f16(a, b); -} - -// CHECK-LABEL: test_vpmax_f16 -// CHECK:  [[MAX:%.*]] = call <4 x half> @llvm.aarch64.neon.fmaxp.v4f16(<4 x half> %a, <4 x half> %b) -// CHECK:  ret <4 x half> [[MAX]] -float16x4_t test_vpmax_f16(float16x4_t a, float16x4_t b) { -  return vpmax_f16(a, b); -} - -// CHECK-LABEL: test_vpmaxq_f16 -// CHECK:  [[MAX:%.*]] = call <8 x half> @llvm.aarch64.neon.fmaxp.v8f16(<8 x half> %a, <8 x half> %b) -// CHECK:  ret <8 x half> [[MAX]] -float16x8_t test_vpmaxq_f16(float16x8_t a, float16x8_t b) { -  return vpmaxq_f16(a, b); -} - -// CHECK-LABEL: test_vpmaxnm_f16 -// CHECK:  [[MAX:%.*]] = call <4 x half> @llvm.aarch64.neon.fmaxnmp.v4f16(<4 x half> %a, <4 x half> %b) -// CHECK:  ret <4 x half> [[MAX]] -float16x4_t test_vpmaxnm_f16(float16x4_t a, float16x4_t b) { -  return vpmaxnm_f16(a, b); -} - -// CHECK-LABEL: test_vpmaxnmq_f16 -// CHECK:  [[MAX:%.*]] = call <8 x half> @llvm.aarch64.neon.fmaxnmp.v8f16(<8 x half> %a, <8 x half> %b) -// CHECK:  ret <8 x half> [[MAX]] -float16x8_t test_vpmaxnmq_f16(float16x8_t a, float16x8_t b) { -  return vpmaxnmq_f16(a, b); -} - -// CHECK-LABEL: test_vpmin_f16 -// CHECK:  [[MIN:%.*]] = call <4 x half> @llvm.aarch64.neon.fminp.v4f16(<4 x half> %a, <4 x half> %b) -// CHECK:  ret <4 x half> [[MIN]] -float16x4_t test_vpmin_f16(float16x4_t a, float16x4_t b) { -  return vpmin_f16(a, b); -} - -// CHECK-LABEL: test_vpminq_f16 -// CHECK:  [[MIN:%.*]] = call <8 x half> @llvm.aarch64.neon.fminp.v8f16(<8 x half> %a, <8 x half> %b) -// CHECK:  ret <8 x half> [[MIN]] -float16x8_t test_vpminq_f16(float16x8_t a, float16x8_t b) { -  return vpminq_f16(a, b); -} - -// CHECK-LABEL: test_vpminnm_f16 -// CHECK:  [[MIN:%.*]] = call <4 x half> @llvm.aarch64.neon.fminnmp.v4f16(<4 x half> %a, <4 x half> %b) -// CHECK:  ret <4 x half> [[MIN]] -float16x4_t test_vpminnm_f16(float16x4_t a, float16x4_t b) { -  return vpminnm_f16(a, b); -} - -// CHECK-LABEL: test_vpminnmq_f16 -// CHECK:  [[MIN:%.*]] = call <8 x half> @llvm.aarch64.neon.fminnmp.v8f16(<8 x half> %a, <8 x half> %b) -// CHECK:  ret <8 x half> [[MIN]] -float16x8_t test_vpminnmq_f16(float16x8_t a, float16x8_t b) { -  return vpminnmq_f16(a, b); -} - -// CHECK-LABEL: test_vrecps_f16 -// CHECK:  [[MIN:%.*]] = call <4 x half> @llvm.aarch64.neon.frecps.v4f16(<4 x half> %a, <4 x half> %b) -// CHECK:  ret <4 x half> [[MIN]] -float16x4_t test_vrecps_f16(float16x4_t a, float16x4_t b) { -  return vrecps_f16(a, b); -} - -// CHECK-LABEL: test_vrecpsq_f16 -// CHECK:  [[MIN:%.*]] =  call <8 x half> @llvm.aarch64.neon.frecps.v8f16(<8 x half> %a, <8 x half> %b) -// CHECK:  ret <8 x half> [[MIN]] -float16x8_t test_vrecpsq_f16(float16x8_t a, float16x8_t b) { -  return vrecpsq_f16(a, b); -} - -// CHECK-LABEL: test_vrsqrts_f16 -// CHECK:  [[MIN:%.*]] = call <4 x half> @llvm.aarch64.neon.frsqrts.v4f16(<4 x half> %a, <4 x half> %b) -// CHECK:  ret <4 x half> [[MIN]] -float16x4_t test_vrsqrts_f16(float16x4_t a, float16x4_t b) { -  return vrsqrts_f16(a, b); -} - -// CHECK-LABEL: test_vrsqrtsq_f16 -// CHECK:  [[MIN:%.*]] =  call <8 x half> @llvm.aarch64.neon.frsqrts.v8f16(<8 x half> %a, <8 x half> %b) -// CHECK:  ret <8 x half> [[MIN]] -float16x8_t test_vrsqrtsq_f16(float16x8_t a, float16x8_t b) { -  return vrsqrtsq_f16(a, b); -} - -// CHECK-LABEL: test_vsub_f16 -// CHECK:  [[ADD:%.*]] = fsub <4 x half> %a, %b  -// CHECK:  ret <4 x half> [[ADD]] -float16x4_t test_vsub_f16(float16x4_t a, float16x4_t b) { -  return vsub_f16(a, b); -} - -// CHECK-LABEL: test_vsubq_f16 -// CHECK:  [[ADD:%.*]] = fsub <8 x half> %a, %b -// CHECK:  ret <8 x half> [[ADD]] -float16x8_t test_vsubq_f16(float16x8_t a, float16x8_t b) { -  return vsubq_f16(a, b); -} - -// CHECK-LABEL: test_vfma_f16 -// CHECK:  [[ADD:%.*]] = call <4 x half> @llvm.fma.v4f16(<4 x half> %b, <4 x half> %c, <4 x half> %a) -// CHECK:  ret <4 x half> [[ADD]] -float16x4_t test_vfma_f16(float16x4_t a, float16x4_t b, float16x4_t c) { -  return vfma_f16(a, b, c); -} - -// CHECK-LABEL: test_vfmaq_f16 -// CHECK:  [[ADD:%.*]] = call <8 x half> @llvm.fma.v8f16(<8 x half> %b, <8 x half> %c, <8 x half> %a) -// CHECK:  ret <8 x half> [[ADD]] -float16x8_t test_vfmaq_f16(float16x8_t a, float16x8_t b, float16x8_t c) { -  return vfmaq_f16(a, b, c); -} - -// CHECK-LABEL: test_vfms_f16 -// CHECK:  [[SUB:%.*]] = fsub <4 x half> <half 0xH8000, half 0xH8000, half 0xH8000, half 0xH8000>, %b -// CHECK:  [[ADD:%.*]] = call <4 x half> @llvm.fma.v4f16(<4 x half> [[SUB]], <4 x half> %c, <4 x half> %a) -// CHECK:  ret <4 x half> [[ADD]] -float16x4_t test_vfms_f16(float16x4_t a, float16x4_t b, float16x4_t c) { -  return vfms_f16(a, b, c); -} - -// CHECK-LABEL: test_vfmsq_f16 -// CHECK:  [[SUB:%.*]] = fsub <8 x half> <half 0xH8000, half 0xH8000, half 0xH8000, half 0xH8000, half 0xH8000, half 0xH8000, half 0xH8000, half 0xH8000>, %b -// CHECK:  [[ADD:%.*]] = call <8 x half> @llvm.fma.v8f16(<8 x half> [[SUB]], <8 x half> %c, <8 x half> %a) -// CHECK:  ret <8 x half> [[ADD]] -float16x8_t test_vfmsq_f16(float16x8_t a, float16x8_t b, float16x8_t c) { -  return vfmsq_f16(a, b, c); -} - -// CHECK-LABEL: test_vfma_lane_f16 -// CHECK: [[TMP0:%.*]] = bitcast <4 x half> %a to <8 x i8> -// CHECK: [[TMP1:%.*]] = bitcast <4 x half> %b to <8 x i8> -// CHECK: [[TMP2:%.*]] = bitcast <4 x half> %c to <8 x i8> -// CHECK: [[TMP3:%.*]] = bitcast <8 x i8> [[TMP2]] to <4 x half> -// CHECK: [[LANE:%.*]] = shufflevector <4 x half> [[TMP3]], <4 x half> [[TMP3]], <4 x i32> <i32 3, i32 3, i32 3, i32 3> -// CHECK: [[TMP4:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x half> -// CHECK: [[TMP5:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x half> -// CHECK: [[FMLA:%.*]] = call <4 x half> @llvm.fma.v4f16(<4 x half> [[TMP4]], <4 x half> [[LANE]], <4 x half> [[TMP5]]) -// CHECK: ret <4 x half> [[FMLA]] -float16x4_t test_vfma_lane_f16(float16x4_t a, float16x4_t b, float16x4_t c) { -  return vfma_lane_f16(a, b, c, 3); -} - -// CHECK-LABEL: test_vfmaq_lane_f16 -// CHECK: [[TMP0:%.*]] = bitcast <8 x half> %a to <16 x i8> -// CHECK: [[TMP1:%.*]] = bitcast <8 x half> %b to <16 x i8> -// CHECK: [[TMP2:%.*]] = bitcast <4 x half> %c to <8 x i8> -// CHECK: [[TMP3:%.*]] = bitcast <8 x i8> [[TMP2]] to <4 x half> -// CHECK: [[LANE:%.*]] = shufflevector <4 x half> [[TMP3]], <4 x half> [[TMP3]], <8 x i32> <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3> -// CHECK: [[TMP4:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x half> -// CHECK: [[TMP5:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x half> -// CHECK: [[FMLA:%.*]] = call <8 x half> @llvm.fma.v8f16(<8 x half> [[TMP4]], <8 x half> [[LANE]], <8 x half> [[TMP5]]) -// CHECK: ret <8 x half> [[FMLA]] -float16x8_t test_vfmaq_lane_f16(float16x8_t a, float16x8_t b, float16x4_t c) { -  return vfmaq_lane_f16(a, b, c, 3); -} - -// CHECK-LABEL: test_vfma_laneq_f16 -// CHECK: [[TMP0:%.*]] = bitcast <4 x half> %a to <8 x i8> -// CHECK: [[TMP1:%.*]] = bitcast <4 x half> %b to <8 x i8> -// CHECK: [[TMP2:%.*]] = bitcast <8 x half> %c to <16 x i8> -// CHECK: [[TMP3:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x half> -// CHECK: [[TMP4:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x half> -// CHECK: [[TMP5:%.*]] = bitcast <16 x i8> [[TMP2]] to <8 x half> -// CHECK: [[LANE:%.*]] = shufflevector <8 x half> [[TMP5]], <8 x half> [[TMP5]], <4 x i32> <i32 7, i32 7, i32 7, i32 7> -// CHECK: [[FMLA:%.*]] = call <4 x half> @llvm.fma.v4f16(<4 x half> [[LANE]], <4 x half> [[TMP4]], <4 x half> [[TMP3]]) -// CHECK: ret <4 x half> [[FMLA]] -float16x4_t test_vfma_laneq_f16(float16x4_t a, float16x4_t b, float16x8_t c) { -  return vfma_laneq_f16(a, b, c, 7); -} - -// CHECK-LABEL: test_vfmaq_laneq_f16 -// CHECK: [[TMP0:%.*]] = bitcast <8 x half> %a to <16 x i8> -// CHECK: [[TMP1:%.*]] = bitcast <8 x half> %b to <16 x i8> -// CHECK: [[TMP2:%.*]] = bitcast <8 x half> %c to <16 x i8> -// CHECK: [[TMP3:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x half> -// CHECK: [[TMP4:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x half> -// CHECK: [[TMP5:%.*]] = bitcast <16 x i8> [[TMP2]] to <8 x half> -// CHECK: [[LANE:%.*]] = shufflevector <8 x half> [[TMP5]], <8 x half> [[TMP5]], <8 x i32> <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7> -// CHECK: [[FMLA:%.*]] = call <8 x half> @llvm.fma.v8f16(<8 x half> [[LANE]], <8 x half> [[TMP4]], <8 x half> [[TMP3]]) -// CHECK: ret <8 x half> [[FMLA]] -float16x8_t test_vfmaq_laneq_f16(float16x8_t a, float16x8_t b, float16x8_t c) { -  return vfmaq_laneq_f16(a, b, c, 7); -} - -// CHECK-LABEL: test_vfma_n_f16 -// CHECK: [[TMP0:%.*]] = insertelement <4 x half> undef, half %c, i32 0 -// CHECK: [[TMP1:%.*]] = insertelement <4 x half> [[TMP0]], half %c, i32 1 -// CHECK: [[TMP2:%.*]] = insertelement <4 x half> [[TMP1]], half %c, i32 2 -// CHECK: [[TMP3:%.*]] = insertelement <4 x half> [[TMP2]], half %c, i32 3 -// CHECK: [[FMA:%.*]]  = call <4 x half> @llvm.fma.v4f16(<4 x half> %b, <4 x half> [[TMP3]], <4 x half> %a) -// CHECK: ret <4 x half> [[FMA]] -float16x4_t test_vfma_n_f16(float16x4_t a, float16x4_t b, float16_t c) { -  return vfma_n_f16(a, b, c); -} - -// CHECK-LABEL: test_vfmaq_n_f16 -// CHECK: [[TMP0:%.*]] = insertelement <8 x half> undef, half %c, i32 0 -// CHECK: [[TMP1:%.*]] = insertelement <8 x half> [[TMP0]], half %c, i32 1 -// CHECK: [[TMP2:%.*]] = insertelement <8 x half> [[TMP1]], half %c, i32 2 -// CHECK: [[TMP3:%.*]] = insertelement <8 x half> [[TMP2]], half %c, i32 3 -// CHECK: [[TMP4:%.*]] = insertelement <8 x half> [[TMP3]], half %c, i32 4 -// CHECK: [[TMP5:%.*]] = insertelement <8 x half> [[TMP4]], half %c, i32 5 -// CHECK: [[TMP6:%.*]] = insertelement <8 x half> [[TMP5]], half %c, i32 6 -// CHECK: [[TMP7:%.*]] = insertelement <8 x half> [[TMP6]], half %c, i32 7 -// CHECK: [[FMA:%.*]]  = call <8 x half> @llvm.fma.v8f16(<8 x half> %b, <8 x half> [[TMP7]], <8 x half> %a) -// CHECK: ret <8 x half> [[FMA]] -float16x8_t test_vfmaq_n_f16(float16x8_t a, float16x8_t b, float16_t c) { -  return vfmaq_n_f16(a, b, c); -} - -// CHECK-LABEL: test_vfmah_lane_f16 -// CHECK: [[TMP0:%.*]] = bitcast <4 x half> %c to <8 x i8> -// CHECK: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x half> -// CHECK: [[EXTR:%.*]] = extractelement <4 x half> [[TMP1]], i32 3 -// CHECK: [[FMA:%.*]]  = call half @llvm.fma.f16(half %b, half [[EXTR]], half %a) -// CHECK: ret half [[FMA]] -float16_t test_vfmah_lane_f16(float16_t a, float16_t b, float16x4_t c) { -  return vfmah_lane_f16(a, b, c, 3); -} - -// CHECK-LABEL: test_vfmah_laneq_f16 -// CHECK: [[TMP0:%.*]] = bitcast <8 x half> %c to <16 x i8> -// CHECK: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x half> -// CHECK: [[EXTR:%.*]] = extractelement <8 x half> [[TMP1]], i32 7 -// CHECK: [[FMA:%.*]]  = call half @llvm.fma.f16(half %b, half [[EXTR]], half %a) -// CHECK: ret half [[FMA]] -float16_t test_vfmah_laneq_f16(float16_t a, float16_t b, float16x8_t c) { -  return vfmah_laneq_f16(a, b, c, 7); -} - -// CHECK-LABEL: test_vfms_lane_f16 -// CHECK: [[SUB:%.*]]  = fsub <4 x half> <half 0xH8000, half 0xH8000, half 0xH8000, half 0xH8000>, %b -// CHECK: [[TMP0:%.*]] = bitcast <4 x half> %a to <8 x i8> -// CHECK: [[TMP1:%.*]] = bitcast <4 x half> [[SUB]] to <8 x i8> -// CHECK: [[TMP2:%.*]] = bitcast <4 x half> %c to <8 x i8> -// CHECK: [[TMP3:%.*]] = bitcast <8 x i8> [[TMP2]] to <4 x half> -// CHECK: [[LANE:%.*]] = shufflevector <4 x half> [[TMP3]], <4 x half> [[TMP3]], <4 x i32> <i32 3, i32 3, i32 3, i32 3> -// CHECK: [[TMP4:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x half> -// CHECK: [[TMP5:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x half> -// CHECK: [[FMA:%.*]] = call <4 x half> @llvm.fma.v4f16(<4 x half> [[TMP4]], <4 x half> [[LANE]], <4 x half> [[TMP5]]) -// CHECK: ret <4 x half> [[FMA]] -float16x4_t test_vfms_lane_f16(float16x4_t a, float16x4_t b, float16x4_t c) { -  return vfms_lane_f16(a, b, c, 3); -} - -// CHECK-LABEL: test_vfmsq_lane_f16 -// CHECK: [[SUB:%.*]]  = fsub <8 x half> <half 0xH8000, half 0xH8000, half 0xH8000, half 0xH8000, half 0xH8000, half 0xH8000, half 0xH8000, half 0xH8000>, %b -// CHECK: [[TMP0:%.*]] = bitcast <8 x half> %a to <16 x i8> -// CHECK: [[TMP1:%.*]] = bitcast <8 x half> [[SUB]] to <16 x i8> -// CHECK: [[TMP2:%.*]] = bitcast <4 x half> %c to <8 x i8> -// CHECK: [[TMP3:%.*]] = bitcast <8 x i8> [[TMP2]] to <4 x half> -// CHECK: [[LANE:%.*]] = shufflevector <4 x half> [[TMP3]], <4 x half> [[TMP3]], <8 x i32> <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3> -// CHECK: [[TMP4:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x half> -// CHECK: [[TMP5:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x half> -// CHECK: [[FMLA:%.*]] = call <8 x half> @llvm.fma.v8f16(<8 x half> [[TMP4]], <8 x half> [[LANE]], <8 x half> [[TMP5]]) -// CHECK: ret <8 x half> [[FMLA]] -float16x8_t test_vfmsq_lane_f16(float16x8_t a, float16x8_t b, float16x4_t c) { -  return vfmsq_lane_f16(a, b, c, 3); -} - -// CHECK-LABEL: test_vfms_laneq_f16 -// CHECK: [[SUB:%.*]]  = fsub <4 x half> <half 0xH8000, half 0xH8000, half 0xH8000, half 0xH8000>, %b -// CHECK: [[TMP0:%.*]] = bitcast <4 x half> %a to <8 x i8> -// CHECK: [[TMP1:%.*]] = bitcast <4 x half> [[SUB]] to <8 x i8> -// CHECK: [[TMP2:%.*]] = bitcast <8 x half> %c to <16 x i8> -// CHECK: [[TMP3:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x half> -// CHECK: [[TMP4:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x half> -// CHECK: [[TMP5:%.*]] = bitcast <16 x i8> [[TMP2]] to <8 x half> -// CHECK: [[LANE:%.*]] = shufflevector <8 x half> [[TMP5]], <8 x half> [[TMP5]], <4 x i32> <i32 7, i32 7, i32 7, i32 7> -// CHECK: [[FMLA:%.*]] = call <4 x half> @llvm.fma.v4f16(<4 x half> [[LANE]], <4 x half> [[TMP4]], <4 x half> [[TMP3]]) -// CHECK: ret <4 x half> [[FMLA]] -float16x4_t test_vfms_laneq_f16(float16x4_t a, float16x4_t b, float16x8_t c) { -  return vfms_laneq_f16(a, b, c, 7); -} - -// CHECK-LABEL: test_vfmsq_laneq_f16 -// CHECK: [[SUB:%.*]]  = fsub <8 x half> <half 0xH8000, half 0xH8000, half 0xH8000, half 0xH8000, half 0xH8000, half 0xH8000, half 0xH8000, half 0xH8000>, %b -// CHECK: [[TMP0:%.*]] = bitcast <8 x half> %a to <16 x i8> -// CHECK: [[TMP1:%.*]] = bitcast <8 x half> [[SUB]] to <16 x i8> -// CHECK: [[TMP2:%.*]] = bitcast <8 x half> %c to <16 x i8> -// CHECK: [[TMP3:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x half> -// CHECK: [[TMP4:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x half> -// CHECK: [[TMP5:%.*]] = bitcast <16 x i8> [[TMP2]] to <8 x half> -// CHECK: [[LANE:%.*]] = shufflevector <8 x half> [[TMP5]], <8 x half> [[TMP5]], <8 x i32> <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7> -// CHECK: [[FMLA:%.*]] = call <8 x half> @llvm.fma.v8f16(<8 x half> [[LANE]], <8 x half> [[TMP4]], <8 x half> [[TMP3]]) -// CHECK: ret <8 x half> [[FMLA]] -float16x8_t test_vfmsq_laneq_f16(float16x8_t a, float16x8_t b, float16x8_t c) { -  return vfmsq_laneq_f16(a, b, c, 7); -} - -// CHECK-LABEL: test_vfms_n_f16 -// CHECK: [[SUB:%.*]]  = fsub <4 x half> <half 0xH8000, half 0xH8000, half 0xH8000, half 0xH8000>, %b -// CHECK: [[TMP0:%.*]] = insertelement <4 x half> undef, half %c, i32 0 -// CHECK: [[TMP1:%.*]] = insertelement <4 x half> [[TMP0]], half %c, i32 1 -// CHECK: [[TMP2:%.*]] = insertelement <4 x half> [[TMP1]], half %c, i32 2 -// CHECK: [[TMP3:%.*]] = insertelement <4 x half> [[TMP2]], half %c, i32 3 -// CHECK: [[FMA:%.*]]  = call <4 x half> @llvm.fma.v4f16(<4 x half> [[SUB]], <4 x half> [[TMP3]], <4 x half> %a) -// CHECK: ret <4 x half> [[FMA]] -float16x4_t test_vfms_n_f16(float16x4_t a, float16x4_t b, float16_t c) { -  return vfms_n_f16(a, b, c); -} - -// CHECK-LABEL: test_vfmsq_n_f16 -// CHECK: [[SUB:%.*]]  = fsub <8 x half> <half 0xH8000, half 0xH8000, half 0xH8000, half 0xH8000, half 0xH8000, half 0xH8000, half 0xH8000, half 0xH8000>, %b -// CHECK: [[TMP0:%.*]] = insertelement <8 x half> undef, half %c, i32 0 -// CHECK: [[TMP1:%.*]] = insertelement <8 x half> [[TMP0]], half %c, i32 1 -// CHECK: [[TMP2:%.*]] = insertelement <8 x half> [[TMP1]], half %c, i32 2 -// CHECK: [[TMP3:%.*]] = insertelement <8 x half> [[TMP2]], half %c, i32 3 -// CHECK: [[TMP4:%.*]] = insertelement <8 x half> [[TMP3]], half %c, i32 4 -// CHECK: [[TMP5:%.*]] = insertelement <8 x half> [[TMP4]], half %c, i32 5 -// CHECK: [[TMP6:%.*]] = insertelement <8 x half> [[TMP5]], half %c, i32 6 -// CHECK: [[TMP7:%.*]] = insertelement <8 x half> [[TMP6]], half %c, i32 7 -// CHECK: [[FMA:%.*]]  = call <8 x half> @llvm.fma.v8f16(<8 x half> [[SUB]], <8 x half> [[TMP7]], <8 x half> %a) -// CHECK: ret <8 x half> [[FMA]] -float16x8_t test_vfmsq_n_f16(float16x8_t a, float16x8_t b, float16_t c) { -  return vfmsq_n_f16(a, b, c); -} - -// CHECK-LABEL: test_vfmsh_lane_f16 -// CHECK: [[TMP0:%.*]] = fpext half %b to float -// CHECK: [[TMP1:%.*]] = fsub float -0.000000e+00, [[TMP0]] -// CHECK: [[SUB:%.*]]  = fptrunc float [[TMP1]] to half -// CHECK: [[TMP2:%.*]] = bitcast <4 x half> %c to <8 x i8> -// CHECK: [[TMP3:%.*]] = bitcast <8 x i8> [[TMP2]] to <4 x half> -// CHECK: [[EXTR:%.*]] = extractelement <4 x half> [[TMP3]], i32 3 -// CHECK: [[FMA:%.*]]  = call half @llvm.fma.f16(half [[SUB]], half [[EXTR]], half %a) -// CHECK: ret half [[FMA]] -float16_t test_vfmsh_lane_f16(float16_t a, float16_t b, float16x4_t c) { -  return vfmsh_lane_f16(a, b, c, 3); -} - -// CHECK-LABEL: test_vfmsh_laneq_f16 -// CHECK: [[TMP0:%.*]] = fpext half %b to float -// CHECK: [[TMP1:%.*]] = fsub float -0.000000e+00, [[TMP0]] -// CHECK: [[SUB:%.*]]  = fptrunc float [[TMP1]] to half -// CHECK: [[TMP2:%.*]] = bitcast <8 x half> %c to <16 x i8> -// CHECK: [[TMP3:%.*]] = bitcast <16 x i8> [[TMP2]] to <8 x half> -// CHECK: [[EXTR:%.*]] = extractelement <8 x half> [[TMP3]], i32 7 -// CHECK: [[FMA:%.*]]  = call half @llvm.fma.f16(half [[SUB]], half [[EXTR]], half %a) -// CHECK: ret half [[FMA]] -float16_t test_vfmsh_laneq_f16(float16_t a, float16_t b, float16x8_t c) { -  return vfmsh_laneq_f16(a, b, c, 7); -} - -// CHECK-LABEL: test_vmul_lane_f16 -// CHECK: [[TMP0:%.*]] = shufflevector <4 x half> %b, <4 x half> %b, <4 x i32> <i32 3, i32 3, i32 3, i32 3> -// CHECK: [[MUL:%.*]]  = fmul <4 x half> %a, [[TMP0]] -// CHECK: ret <4 x half> [[MUL]] -float16x4_t test_vmul_lane_f16(float16x4_t a, float16x4_t b) { -  return vmul_lane_f16(a, b, 3); -} - -// CHECK-LABEL: test_vmulq_lane_f16 -// CHECK: [[TMP0:%.*]] = shufflevector <4 x half> %b, <4 x half> %b, <8 x i32> <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7> -// CHECK: [[MUL:%.*]]  = fmul <8 x half> %a, [[TMP0]] -// CHECK: ret <8 x half> [[MUL]] -float16x8_t test_vmulq_lane_f16(float16x8_t a, float16x4_t b) { -  return vmulq_lane_f16(a, b, 7); -} - -// CHECK-LABEL: test_vmul_laneq_f16 -// CHECK: [[TMP0:%.*]] = shufflevector <8 x half> %b, <8 x half> %b, <4 x i32> <i32 7, i32 7, i32 7, i32 7> -// CHECK: [[MUL:%.*]]  = fmul <4 x half> %a, [[TMP0]] -// CHECK: ret <4 x half> [[MUL]] -float16x4_t test_vmul_laneq_f16(float16x4_t a, float16x8_t b) { -  return vmul_laneq_f16(a, b, 7); -} - -// CHECK-LABEL: test_vmulq_laneq_f16 -// CHECK: [[TMP0:%.*]] = shufflevector <8 x half> %b, <8 x half> %b, <8 x i32> <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7> -// CHECK: [[MUL:%.*]]  = fmul <8 x half> %a, [[TMP0]] -// CHECK: ret <8 x half> [[MUL]] -float16x8_t test_vmulq_laneq_f16(float16x8_t a, float16x8_t b) { -  return vmulq_laneq_f16(a, b, 7); -} - -// CHECK-LABEL: test_vmul_n_f16 -// CHECK: [[TMP0:%.*]] = insertelement <4 x half> undef, half %b, i32 0 -// CHECK: [[TMP1:%.*]] = insertelement <4 x half> [[TMP0]], half %b, i32 1 -// CHECK: [[TMP2:%.*]] = insertelement <4 x half> [[TMP1]], half %b, i32 2 -// CHECK: [[TMP3:%.*]] = insertelement <4 x half> [[TMP2]], half %b, i32 3 -// CHECK: [[MUL:%.*]]  = fmul <4 x half> %a, [[TMP3]] -// CHECK: ret <4 x half> [[MUL]] -float16x4_t test_vmul_n_f16(float16x4_t a, float16_t b) { -  return vmul_n_f16(a, b); -} - -// CHECK-LABEL: test_vmulq_n_f16 -// CHECK: [[TMP0:%.*]] = insertelement <8 x half> undef, half %b, i32 0 -// CHECK: [[TMP1:%.*]] = insertelement <8 x half> [[TMP0]], half %b, i32 1 -// CHECK: [[TMP2:%.*]] = insertelement <8 x half> [[TMP1]], half %b, i32 2 -// CHECK: [[TMP3:%.*]] = insertelement <8 x half> [[TMP2]], half %b, i32 3 -// CHECK: [[TMP4:%.*]] = insertelement <8 x half> [[TMP3]], half %b, i32 4 -// CHECK: [[TMP5:%.*]] = insertelement <8 x half> [[TMP4]], half %b, i32 5 -// CHECK: [[TMP6:%.*]] = insertelement <8 x half> [[TMP5]], half %b, i32 6 -// CHECK: [[TMP7:%.*]] = insertelement <8 x half> [[TMP6]], half %b, i32 7 -// CHECK: [[MUL:%.*]]  = fmul <8 x half> %a, [[TMP7]] -// CHECK: ret <8 x half> [[MUL]] -float16x8_t test_vmulq_n_f16(float16x8_t a, float16_t b) { -  return vmulq_n_f16(a, b); -} - -// FIXME: Fix it when fp16 non-storage-only type becomes available. -// CHECK-LABEL: test_vmulh_lane_f16 -// CHECK: [[CONV0:%.*]] = fpext half %a to float -// CHECK: [[CONV1:%.*]] = fpext half %{{.*}} to float -// CHECK: [[MUL:%.*]]   = fmul float [[CONV0:%.*]], [[CONV0:%.*]] -// CHECK: [[CONV3:%.*]] = fptrunc float %mul to half -// CHECK: ret half [[CONV3:%.*]] -float16_t test_vmulh_lane_f16(float16_t a, float16x4_t b) { -  return vmulh_lane_f16(a, b, 3); -} - -// CHECK-LABEL: test_vmulh_laneq_f16 -// CHECK: [[CONV0:%.*]] = fpext half %a to float -// CHECK: [[CONV1:%.*]] = fpext half %{{.*}} to float -// CHECK: [[MUL:%.*]]   = fmul float [[CONV0:%.*]], [[CONV0:%.*]] -// CHECK: [[CONV3:%.*]] = fptrunc float %mul to half -// CHECK: ret half [[CONV3:%.*]] -float16_t test_vmulh_laneq_f16(float16_t a, float16x8_t b) { -  return vmulh_laneq_f16(a, b, 7); -} - -// CHECK-LABEL: test_vmulx_lane_f16 -// CHECK: [[TMP0:%.*]] = shufflevector <4 x half> %b, <4 x half> %b, <4 x i32> <i32 3, i32 3, i32 3, i32 3> -// CHECK: [[MUL:%.*]] = call <4 x half> @llvm.aarch64.neon.fmulx.v4f16(<4 x half> %a, <4 x half> [[TMP0]]) -// CHECK: ret <4 x half> [[MUL]] -float16x4_t test_vmulx_lane_f16(float16x4_t a, float16x4_t b) { -  return vmulx_lane_f16(a, b, 3); -} - -// CHECK-LABEL: test_vmulxq_lane_f16 -// CHECK: [[TMP0:%.*]] = shufflevector <4 x half> %b, <4 x half> %b, <8 x i32> <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7> -// CHECK: [[MUL:%.*]] = call <8 x half> @llvm.aarch64.neon.fmulx.v8f16(<8 x half> %a, <8 x half> [[TMP0]]) -// CHECK: ret <8 x half> [[MUL]] -float16x8_t test_vmulxq_lane_f16(float16x8_t a, float16x4_t b) { -  return vmulxq_lane_f16(a, b, 7); -} - -// CHECK-LABEL: test_vmulx_laneq_f16 -// CHECK: [[TMP0:%.*]] = shufflevector <8 x half> %b, <8 x half> %b, <4 x i32> <i32 7, i32 7, i32 7, i32 7> -// CHECK: [[MUL:%.*]]  = call <4 x half> @llvm.aarch64.neon.fmulx.v4f16(<4 x half> %a, <4 x half> [[TMP0]]) -// CHECK: ret <4 x half> [[MUL]] -float16x4_t test_vmulx_laneq_f16(float16x4_t a, float16x8_t b) { -  return vmulx_laneq_f16(a, b, 7); -} - -// CHECK-LABEL: test_vmulxq_laneq_f16 -// CHECK: [[TMP0:%.*]] = shufflevector <8 x half> %b, <8 x half> %b, <8 x i32> <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7> -// CHECK: [[MUL:%.*]]  = call <8 x half> @llvm.aarch64.neon.fmulx.v8f16(<8 x half> %a, <8 x half> [[TMP0]]) -// CHECK: ret <8 x half> [[MUL]] -float16x8_t test_vmulxq_laneq_f16(float16x8_t a, float16x8_t b) { -  return vmulxq_laneq_f16(a, b, 7); -} - -// CHECK-LABEL: test_vmulx_n_f16 -// CHECK: [[TMP0:%.*]] = insertelement <4 x half> undef, half %b, i32 0 -// CHECK: [[TMP1:%.*]] = insertelement <4 x half> [[TMP0]], half %b, i32 1 -// CHECK: [[TMP2:%.*]] = insertelement <4 x half> [[TMP1]], half %b, i32 2 -// CHECK: [[TMP3:%.*]] = insertelement <4 x half> [[TMP2]], half %b, i32 3 -// CHECK: [[MUL:%.*]]  = call <4 x half> @llvm.aarch64.neon.fmulx.v4f16(<4 x half> %a, <4 x half> [[TMP3]]) -// CHECK: ret <4 x half> [[MUL]] -float16x4_t test_vmulx_n_f16(float16x4_t a, float16_t b) { -  return vmulx_n_f16(a, b); -} - -// CHECK-LABEL: test_vmulxq_n_f16 -// CHECK: [[TMP0:%.*]] = insertelement <8 x half> undef, half %b, i32 0 -// CHECK: [[TMP1:%.*]] = insertelement <8 x half> [[TMP0]], half %b, i32 1 -// CHECK: [[TMP2:%.*]] = insertelement <8 x half> [[TMP1]], half %b, i32 2 -// CHECK: [[TMP3:%.*]] = insertelement <8 x half> [[TMP2]], half %b, i32 3 -// CHECK: [[TMP4:%.*]] = insertelement <8 x half> [[TMP3]], half %b, i32 4 -// CHECK: [[TMP5:%.*]] = insertelement <8 x half> [[TMP4]], half %b, i32 5 -// CHECK: [[TMP6:%.*]] = insertelement <8 x half> [[TMP5]], half %b, i32 6 -// CHECK: [[TMP7:%.*]] = insertelement <8 x half> [[TMP6]], half %b, i32 7 -// CHECK: [[MUL:%.*]]  = call <8 x half> @llvm.aarch64.neon.fmulx.v8f16(<8 x half> %a, <8 x half> [[TMP7]]) -// CHECK: ret <8 x half> [[MUL]] -float16x8_t test_vmulxq_n_f16(float16x8_t a, float16_t b) { -  return vmulxq_n_f16(a, b); -} - -/* TODO: Not implemented yet (needs scalar intrinsic from arm_fp16.h) -// CCHECK-LABEL: test_vmulxh_lane_f16 -// CCHECK: [[CONV0:%.*]] = fpext half %a to float -// CCHECK: [[CONV1:%.*]] = fpext half %{{.*}} to float -// CCHECK: [[MUL:%.*]]   = fmul float [[CONV0:%.*]], [[CONV0:%.*]] -// CCHECK: [[CONV3:%.*]] = fptrunc float %mul to half -// CCHECK: ret half [[CONV3:%.*]] -float16_t test_vmulxh_lane_f16(float16_t a, float16x4_t b) { -  return vmulxh_lane_f16(a, b, 3); -} - -// CCHECK-LABEL: test_vmulxh_laneq_f16 -// CCHECK: [[CONV0:%.*]] = fpext half %a to float -// CCHECK: [[CONV1:%.*]] = fpext half %{{.*}} to float -// CCHECK: [[MUL:%.*]]   = fmul float [[CONV0:%.*]], [[CONV0:%.*]] -// CCHECK: [[CONV3:%.*]] = fptrunc float %mul to half -// CCHECK: ret half [[CONV3:%.*]] -float16_t test_vmulxh_laneq_f16(float16_t a, float16x8_t b) { -  return vmulxh_laneq_f16(a, b, 7); -} -*/ - -// CHECK-LABEL: test_vmaxv_f16 -// CHECK: [[TMP0:%.*]] = bitcast <4 x half> %a to <8 x i8> -// CHECK: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x half> -// CHECK: [[MAX:%.*]]  = call half @llvm.aarch64.neon.fmaxv.f16.v4f16(<4 x half> [[TMP1]]) -// CHECK: ret half [[MAX]] -float16_t test_vmaxv_f16(float16x4_t a) { -  return vmaxv_f16(a); -} - -// CHECK-LABEL: test_vmaxvq_f16 -// CHECK: [[TMP0:%.*]] = bitcast <8 x half> %a to <16 x i8> -// CHECK: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x half> -// CHECK: [[MAX:%.*]]  = call half @llvm.aarch64.neon.fmaxv.f16.v8f16(<8 x half> [[TMP1]]) -// CHECK: ret half [[MAX]] -float16_t test_vmaxvq_f16(float16x8_t a) { -  return vmaxvq_f16(a); -} - -// CHECK-LABEL: test_vminv_f16 -// CHECK: [[TMP0:%.*]] = bitcast <4 x half> %a to <8 x i8> -// CHECK: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x half> -// CHECK: [[MAX:%.*]]  = call half @llvm.aarch64.neon.fminv.f16.v4f16(<4 x half> [[TMP1]]) -// CHECK: ret half [[MAX]] -float16_t test_vminv_f16(float16x4_t a) { -  return vminv_f16(a); -} - -// CHECK-LABEL: test_vminvq_f16 -// CHECK: [[TMP0:%.*]] = bitcast <8 x half> %a to <16 x i8> -// CHECK: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x half> -// CHECK: [[MAX:%.*]]  = call half @llvm.aarch64.neon.fminv.f16.v8f16(<8 x half> [[TMP1]]) -// CHECK: ret half [[MAX]] -float16_t test_vminvq_f16(float16x8_t a) { -  return vminvq_f16(a); -} - -// CHECK-LABEL: test_vmaxnmv_f16 -// CHECK: [[TMP0:%.*]] = bitcast <4 x half> %a to <8 x i8> -// CHECK: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x half> -// CHECK: [[MAX:%.*]]  = call half @llvm.aarch64.neon.fmaxnmv.f16.v4f16(<4 x half> [[TMP1]]) -// CHECK: ret half [[MAX]] -float16_t test_vmaxnmv_f16(float16x4_t a) { -  return vmaxnmv_f16(a); -} - -// CHECK-LABEL: test_vmaxnmvq_f16 -// CHECK: [[TMP0:%.*]] = bitcast <8 x half> %a to <16 x i8> -// CHECK: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x half> -// CHECK: [[MAX:%.*]]  = call half @llvm.aarch64.neon.fmaxnmv.f16.v8f16(<8 x half> [[TMP1]]) -// CHECK: ret half [[MAX]] -float16_t test_vmaxnmvq_f16(float16x8_t a) { -  return vmaxnmvq_f16(a); -} - -// CHECK-LABEL: test_vminnmv_f16 -// CHECK: [[TMP0:%.*]] = bitcast <4 x half> %a to <8 x i8> -// CHECK: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x half> -// CHECK: [[MAX:%.*]]  = call half @llvm.aarch64.neon.fminnmv.f16.v4f16(<4 x half> [[TMP1]]) -// CHECK: ret half [[MAX]] -float16_t test_vminnmv_f16(float16x4_t a) { -  return vminnmv_f16(a); -} - -// CHECK-LABEL: test_vminnmvq_f16 -// CHECK: [[TMP0:%.*]] = bitcast <8 x half> %a to <16 x i8> -// CHECK: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x half> -// CHECK: [[MAX:%.*]]  = call half @llvm.aarch64.neon.fminnmv.f16.v8f16(<8 x half> [[TMP1]]) -// CHECK: ret half [[MAX]] -float16_t test_vminnmvq_f16(float16x8_t a) { -  return vminnmvq_f16(a); -} - -// CHECK-LABEL: test_vbsl_f16 -// CHECK:  [[TMP0:%.*]] = bitcast <4 x half> %b to <8 x i8> -// CHECK:  [[TMP1:%.*]] = bitcast <4 x half> %c to <8 x i8> -// CHECK:  [[TMP2:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16> -// CHECK:  [[TMP3:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x i16> -// CHECK:  [[TMP4:%.*]] = and <4 x i16> %a, [[TMP2]] -// CHECK:  [[TMP5:%.*]] = xor <4 x i16> %a, <i16 -1, i16 -1, i16 -1, i16 -1> -// CHECK:  [[TMP6:%.*]] = and <4 x i16> [[TMP5]], [[TMP3]] -// CHECK:  [[TMP7:%.*]] = or <4 x i16> [[TMP4]], [[TMP6]] -// CHECK:  [[TMP8:%.*]] = bitcast <4 x i16> [[TMP7]] to <4 x half> -// CHECK:  ret <4 x half> [[TMP8]] -float16x4_t test_vbsl_f16(uint16x4_t a, float16x4_t b, float16x4_t c) { -  return vbsl_f16(a, b, c); -} - -// CHECK-LABEL: test_vbslq_f16 -// CHECK:  [[TMP0:%.*]] = bitcast <8 x half> %b to <16 x i8> -// CHECK:  [[TMP1:%.*]] = bitcast <8 x half> %c to <16 x i8> -// CHECK:  [[TMP2:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x i16> -// CHECK:  [[TMP3:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x i16> -// CHECK:  [[TMP4:%.*]] = and <8 x i16> %a, [[TMP2]] -// CHECK:  [[TMP5:%.*]] = xor <8 x i16> %a, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1> -// CHECK:  [[TMP6:%.*]] = and <8 x i16> [[TMP5]], [[TMP3]] -// CHECK:  [[TMP7:%.*]] = or <8 x i16> [[TMP4]], [[TMP6]] -// CHECK:  [[TMP8:%.*]] = bitcast <8 x i16> [[TMP7]] to <8 x half> -// CHECK:  ret <8 x half> [[TMP8]] -float16x8_t test_vbslq_f16(uint16x8_t a, float16x8_t b, float16x8_t c) { -  return vbslq_f16(a, b, c); -} - -// CHECK-LABEL: test_vzip_f16 -// CHECK:   [[RETVAL:%.*]]  = alloca %struct.float16x4x2_t, align 8 -// CHECK:   [[__RET_I:%.*]] = alloca %struct.float16x4x2_t, align 8 -// CHECK:   [[TMP0:%.*]]  = bitcast %struct.float16x4x2_t* [[__RET_I]] to i8* -// CHECK:   [[TMP1:%.*]]  = bitcast i8* [[TMP0]] to <4 x half>* -// CHECK:   [[VZIP0_I:%.*]] = shufflevector <4 x half> %a, <4 x half> %b, <4 x i32> <i32 0, i32 4, i32 1, i32 5> -// CHECK:   store <4 x half> [[VZIP0_I]], <4 x half>* [[TMP1]] -// CHECK:   [[TMP2:%.*]] = getelementptr inbounds <4 x half>, <4 x half>* [[TMP1]], i32 1 -// CHECK:   [[VZIP1_I:%.*]] = shufflevector <4 x half> %a, <4 x half> %b, <4 x i32> <i32 2, i32 6, i32 3, i32 7> -// CHECK:   store <4 x half> [[VZIP1_I]], <4 x half>* [[TMP2]] -// CHECK:   [[TMP5:%.*]] = bitcast %struct.float16x4x2_t* [[RETVAL]] to i8* -// CHECK:   [[TMP6:%.*]] = bitcast %struct.float16x4x2_t* [[__RET_I]] to i8* -// CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[TMP5]], i8* [[TMP6]], i64 16, i32 8, i1 false) -float16x4x2_t test_vzip_f16(float16x4_t a, float16x4_t b) { -  return vzip_f16(a, b); -} - -// CHECK-LABEL: test_vzipq_f16 -// CHECK:   [[RETVAL:%.*]]  = alloca %struct.float16x8x2_t, align 16 -// CHECK:   [[__RET_I:%.*]] = alloca %struct.float16x8x2_t, align 16 -// CHECK:   [[TMP0:%.*]]  = bitcast %struct.float16x8x2_t* [[__RET_I]] to i8* -// CHECK:   [[TMP1:%.*]]  = bitcast i8* [[TMP0]] to <8 x half>* -// CHECK:   [[VZIP0_I:%.*]] = shufflevector <8 x half> %a, <8 x half> %b, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11> -// CHECK:   store <8 x half> [[VZIP0_I]], <8 x half>* [[TMP1]] -// CHECK:   [[TMP2:%.*]] = getelementptr inbounds <8 x half>, <8 x half>* [[TMP1]], i32 1 -// CHECK:   [[VZIP1_I:%.*]] = shufflevector <8 x half> %a, <8 x half> %b, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15> -// CHECK:   store <8 x half> [[VZIP1_I]], <8 x half>* [[TMP2]] -// CHECK:   [[TMP5:%.*]] = bitcast %struct.float16x8x2_t* [[RETVAL]] to i8* -// CHECK:   [[TMP6:%.*]] = bitcast %struct.float16x8x2_t* [[__RET_I]] to i8* -// CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[TMP5]], i8* [[TMP6]], i64 32, i32 16, i1 false) -float16x8x2_t test_vzipq_f16(float16x8_t a, float16x8_t b) { -  return vzipq_f16(a, b); -} - -// CHECK-LABEL: test_vuzp_f16 -// CHECK:   [[RETVAL:%.*]]  = alloca %struct.float16x4x2_t, align 8 -// CHECK:   [[__RET_I:%.*]] = alloca %struct.float16x4x2_t, align 8 -// CHECK:   [[TMP0:%.*]]  = bitcast %struct.float16x4x2_t* [[__RET_I]] to i8* -// CHECK:   [[TMP1:%.*]]  = bitcast i8* [[TMP0]] to <4 x half>* -// CHECK:   [[VZIP0_I:%.*]] = shufflevector <4 x half> %a, <4 x half> %b, <4 x i32> <i32 0, i32 2, i32 4, i32 6> -// CHECK:   store <4 x half> [[VZIP0_I]], <4 x half>* [[TMP1]] -// CHECK:   [[TMP2:%.*]] = getelementptr inbounds <4 x half>, <4 x half>* [[TMP1]], i32 1 -// CHECK:   [[VZIP1_I:%.*]] = shufflevector <4 x half> %a, <4 x half> %b, <4 x i32> <i32 1, i32 3, i32 5, i32 7> -// CHECK:   store <4 x half> [[VZIP1_I]], <4 x half>* [[TMP2]] -// CHECK:   [[TMP5:%.*]] = bitcast %struct.float16x4x2_t* [[RETVAL]] to i8* -// CHECK:   [[TMP6:%.*]] = bitcast %struct.float16x4x2_t* [[__RET_I]] to i8* -// CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[TMP5]], i8* [[TMP6]], i64 16, i32 8, i1 false) -float16x4x2_t test_vuzp_f16(float16x4_t a, float16x4_t b) { -  return vuzp_f16(a, b); -} - -// CHECK-LABEL: test_vuzpq_f16 -// CHECK:   [[RETVAL:%.*]]  = alloca %struct.float16x8x2_t, align 16 -// CHECK:   [[__RET_I:%.*]] = alloca %struct.float16x8x2_t, align 16 -// CHECK:   [[TMP0:%.*]]  = bitcast %struct.float16x8x2_t* [[__RET_I]] to i8* -// CHECK:   [[TMP1:%.*]]  = bitcast i8* [[TMP0]] to <8 x half>* -// CHECK:   [[VZIP0_I:%.*]] = shufflevector <8 x half> %a, <8 x half> %b, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14> -// CHECK:   store <8 x half> [[VZIP0_I]], <8 x half>* [[TMP1]] -// CHECK:   [[TMP2:%.*]] = getelementptr inbounds <8 x half>, <8 x half>* [[TMP1]], i32 1 -// CHECK:   [[VZIP1_I:%.*]] = shufflevector <8 x half> %a, <8 x half> %b, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15> -// CHECK:   store <8 x half> [[VZIP1_I]], <8 x half>* [[TMP2]] -// CHECK:   [[TMP5:%.*]] = bitcast %struct.float16x8x2_t* [[RETVAL]] to i8* -// CHECK:   [[TMP6:%.*]] = bitcast %struct.float16x8x2_t* [[__RET_I]] to i8* -// CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[TMP5]], i8* [[TMP6]], i64 32, i32 16, i1 false) -float16x8x2_t test_vuzpq_f16(float16x8_t a, float16x8_t b) { -  return vuzpq_f16(a, b); -} - -// CHECK-LABEL: test_vtrn_f16 -// CHECK:   [[RETVAL:%.*]]  = alloca %struct.float16x4x2_t, align 8 -// CHECK:   [[__RET_I:%.*]] = alloca %struct.float16x4x2_t, align 8 -// CHECK:   [[TMP0:%.*]]  = bitcast %struct.float16x4x2_t* [[__RET_I]] to i8* -// CHECK:   [[TMP1:%.*]]  = bitcast i8* [[TMP0]] to <4 x half>* -// CHECK:   [[VZIP0_I:%.*]] = shufflevector <4 x half> %a, <4 x half> %b, <4 x i32> <i32 0, i32 4, i32 2, i32 6> -// CHECK:   store <4 x half> [[VZIP0_I]], <4 x half>* [[TMP1]] -// CHECK:   [[TMP2:%.*]] = getelementptr inbounds <4 x half>, <4 x half>* [[TMP1]], i32 1 -// CHECK:   [[VZIP1_I:%.*]] = shufflevector <4 x half> %a, <4 x half> %b, <4 x i32> <i32 1, i32 5, i32 3, i32 7> -// CHECK:   store <4 x half> [[VZIP1_I]], <4 x half>* [[TMP2]] -// CHECK:   [[TMP5:%.*]] = bitcast %struct.float16x4x2_t* [[RETVAL]] to i8* -// CHECK:   [[TMP6:%.*]] = bitcast %struct.float16x4x2_t* [[__RET_I]] to i8* -// CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[TMP5]], i8* [[TMP6]], i64 16, i32 8, i1 false) -float16x4x2_t test_vtrn_f16(float16x4_t a, float16x4_t b) { -  return vtrn_f16(a, b); -} - -// CHECK-LABEL: test_vtrnq_f16 -// CHECK:   [[RETVAL:%.*]]  = alloca %struct.float16x8x2_t, align 16 -// CHECK:   [[__RET_I:%.*]] = alloca %struct.float16x8x2_t, align 16 -// CHECK:   [[TMP0:%.*]]  = bitcast %struct.float16x8x2_t* [[__RET_I]] to i8* -// CHECK:   [[TMP1:%.*]]  = bitcast i8* [[TMP0]] to <8 x half>* -// CHECK:   [[VZIP0_I:%.*]] = shufflevector <8 x half> %a, <8 x half> %b, <8 x i32> <i32 0, i32 8, i32 2, i32 10, i32 4, i32 12, i32 6, i32 14> -// CHECK:   store <8 x half> [[VZIP0_I]], <8 x half>* [[TMP1]]  -// CHECK:   [[TMP2:%.*]] = getelementptr inbounds <8 x half>, <8 x half>* [[TMP1]], i32 1 -// CHECK:   [[VZIP1_I:%.*]] = shufflevector <8 x half> %a, <8 x half> %b, <8 x i32>  <i32 1, i32 9, i32 3, i32 11, i32 5, i32 13, i32 7, i32 15> -// CHECK:   store <8 x half> [[VZIP1_I]], <8 x half>* [[TMP2]] -// CHECK:   [[TMP5:%.*]] = bitcast %struct.float16x8x2_t* [[RETVAL]] to i8* -// CHECK:   [[TMP6:%.*]] = bitcast %struct.float16x8x2_t* [[__RET_I]] to i8* -// CHECK:   call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[TMP5]], i8* [[TMP6]], i64 32, i32 16, i1 false) -float16x8x2_t test_vtrnq_f16(float16x8_t a, float16x8_t b) { -  return vtrnq_f16(a, b); -} - -// CHECK-LABEL: test_vmov_n_f16 -// CHECK:   [[TMP0:%.*]] = insertelement <4 x half> undef, half %a, i32 0 -// CHECK:   [[TMP1:%.*]] = insertelement <4 x half> [[TMP0]], half %a, i32 1 -// CHECK:   [[TMP2:%.*]] = insertelement <4 x half> [[TMP1]], half %a, i32 2 -// CHECK:   [[TMP3:%.*]] = insertelement <4 x half> [[TMP2]], half %a, i32 3 -// CHECK:   ret <4 x half> [[TMP3]] -float16x4_t test_vmov_n_f16(float16_t a) { -  return vmov_n_f16(a); -} - -// CHECK-LABEL: test_vmovq_n_f16 -// CHECK:   [[TMP0:%.*]] = insertelement <8 x half> undef, half %a, i32 0 -// CHECK:   [[TMP1:%.*]] = insertelement <8 x half> [[TMP0]], half %a, i32 1 -// CHECK:   [[TMP2:%.*]] = insertelement <8 x half> [[TMP1]], half %a, i32 2 -// CHECK:   [[TMP3:%.*]] = insertelement <8 x half> [[TMP2]], half %a, i32 3 -// CHECK:   [[TMP4:%.*]] = insertelement <8 x half> [[TMP3]], half %a, i32 4 -// CHECK:   [[TMP5:%.*]] = insertelement <8 x half> [[TMP4]], half %a, i32 5 -// CHECK:   [[TMP6:%.*]] = insertelement <8 x half> [[TMP5]], half %a, i32 6 -// CHECK:   [[TMP7:%.*]] = insertelement <8 x half> [[TMP6]], half %a, i32 7 -// CHECK:   ret <8 x half> [[TMP7]] -float16x8_t test_vmovq_n_f16(float16_t a) { -  return vmovq_n_f16(a); -} - -// CHECK-LABEL: test_vdup_n_f16 -// CHECK:   [[TMP0:%.*]] = insertelement <4 x half> undef, half %a, i32 0 -// CHECK:   [[TMP1:%.*]] = insertelement <4 x half> [[TMP0]], half %a, i32 1 -// CHECK:   [[TMP2:%.*]] = insertelement <4 x half> [[TMP1]], half %a, i32 2 -// CHECK:   [[TMP3:%.*]] = insertelement <4 x half> [[TMP2]], half %a, i32 3 -// CHECK:   ret <4 x half> [[TMP3]] -float16x4_t test_vdup_n_f16(float16_t a) { -  return vdup_n_f16(a); -} - -// CHECK-LABEL: test_vdupq_n_f16 -// CHECK:   [[TMP0:%.*]] = insertelement <8 x half> undef, half %a, i32 0 -// CHECK:   [[TMP1:%.*]] = insertelement <8 x half> [[TMP0]], half %a, i32 1 -// CHECK:   [[TMP2:%.*]] = insertelement <8 x half> [[TMP1]], half %a, i32 2 -// CHECK:   [[TMP3:%.*]] = insertelement <8 x half> [[TMP2]], half %a, i32 3 -// CHECK:   [[TMP4:%.*]] = insertelement <8 x half> [[TMP3]], half %a, i32 4 -// CHECK:   [[TMP5:%.*]] = insertelement <8 x half> [[TMP4]], half %a, i32 5 -// CHECK:   [[TMP6:%.*]] = insertelement <8 x half> [[TMP5]], half %a, i32 6 -// CHECK:   [[TMP7:%.*]] = insertelement <8 x half> [[TMP6]], half %a, i32 7 -// CHECK:   ret <8 x half> [[TMP7]] -float16x8_t test_vdupq_n_f16(float16_t a) { -  return vdupq_n_f16(a); -} - -// CHECK-LABEL: test_vdup_lane_f16 -// CHECK:   [[SHFL:%.*]] = shufflevector <4 x half> %a, <4 x half> %a, <4 x i32> <i32 3, i32 3, i32 3, i32 3> -// CHECK:   ret <4 x half> [[SHFL]] -float16x4_t test_vdup_lane_f16(float16x4_t a) { -  return vdup_lane_f16(a, 3); -} - -// CHECK-LABEL: test_vdupq_lane_f16 -// CHECK:   [[SHFL:%.*]] = shufflevector <4 x half> %a, <4 x half> %a, <8 x i32> <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7> -// CHECK:   ret <8 x half> [[SHFL]] -float16x8_t test_vdupq_lane_f16(float16x4_t a) { -  return vdupq_lane_f16(a, 7); -} - -// CHECK-LABEL: @test_vext_f16( -// CHECK:   [[TMP0:%.*]] = bitcast <4 x half> %a to <8 x i8> -// CHECK:   [[TMP1:%.*]] = bitcast <4 x half> %b to <8 x i8> -// CHECK:   [[TMP2:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x half> -// CHECK:   [[TMP3:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x half> -// CHECK:   [[VEXT:%.*]] = shufflevector <4 x half> [[TMP2]], <4 x half> [[TMP3]], <4 x i32> <i32 2, i32 3, i32 4, i32 5> -// CHECK:   ret <4 x half> [[VEXT]] -float16x4_t test_vext_f16(float16x4_t a, float16x4_t b) { -  return vext_f16(a, b, 2); -} - -// CHECK-LABEL: @test_vextq_f16( -// CHECK:   [[TMP0:%.*]] = bitcast <8 x half> %a to <16 x i8> -// CHECK:   [[TMP1:%.*]] = bitcast <8 x half> %b to <16 x i8> -// CHECK:   [[TMP2:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x half> -// CHECK:   [[TMP3:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x half> -// CHECK:   [[VEXT:%.*]] = shufflevector <8 x half> [[TMP2]], <8 x half> [[TMP3]], <8 x i32> <i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12> -// CHECK:   ret <8 x half> [[VEXT]] -float16x8_t test_vextq_f16(float16x8_t a, float16x8_t b) { -  return vextq_f16(a, b, 5); -} - -// CHECK-LABEL: @test_vrev64_f16( -// CHECK:   [[SHFL:%.*]] = shufflevector <4 x half> %a, <4 x half> %a, <4 x i32> <i32 3, i32 2, i32 1, i32 0> -// CHECK:   ret <4 x half> [[SHFL]] -float16x4_t test_vrev64_f16(float16x4_t a) { -  return vrev64_f16(a); -} - -// CHECK-LABEL: @test_vrev64q_f16( -// CHECK:   [[SHFL:%.*]] = shufflevector <8 x half> %a, <8 x half> %a, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4> -// CHECK:   ret <8 x half> [[SHFL]] -float16x8_t test_vrev64q_f16(float16x8_t a) { -  return vrev64q_f16(a); -} - -// CHECK-LABEL: @test_vzip1_f16( -// CHECK:   [[SHFL:%.*]] = shufflevector <4 x half> %a, <4 x half> %b, <4 x i32> <i32 0, i32 4, i32 1, i32 5> -// CHECK:   ret <4 x half> [[SHFL]] -float16x4_t test_vzip1_f16(float16x4_t a, float16x4_t b) { -  return vzip1_f16(a, b); -} - -// CHECK-LABEL: @test_vzip1q_f16( -// CHECK:   [[SHFL:%.*]] = shufflevector <8 x half> %a, <8 x half> %b, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11> -// CHECK:   ret <8 x half> [[SHFL]] -float16x8_t test_vzip1q_f16(float16x8_t a, float16x8_t b) { -  return vzip1q_f16(a, b); -} - -// CHECK-LABEL: @test_vzip2_f16( -// CHECK:   [[SHFL:%.*]] = shufflevector <4 x half> %a, <4 x half> %b, <4 x i32> <i32 2, i32 6, i32 3, i32 7> -// CHECK:   ret <4 x half> [[SHFL]] -float16x4_t test_vzip2_f16(float16x4_t a, float16x4_t b) { -  return vzip2_f16(a, b); -} - -// CHECK-LABEL: @test_vzip2q_f16( -// CHECK:   [[SHFL:%.*]] = shufflevector <8 x half> %a, <8 x half> %b, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15> -// CHECK:   ret <8 x half> [[SHFL]] -float16x8_t test_vzip2q_f16(float16x8_t a, float16x8_t b) { -  return vzip2q_f16(a, b); -} - -// CHECK-LABEL: @test_vuzp1_f16( -// CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <4 x half> %a, <4 x half> %b, <4 x i32> <i32 0, i32 2, i32 4, i32 6> -// CHECK:   ret <4 x half> [[SHUFFLE_I]] -float16x4_t test_vuzp1_f16(float16x4_t a, float16x4_t b) { -  return vuzp1_f16(a, b); -} - -// CHECK-LABEL: @test_vuzp1q_f16( -// CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <8 x half> %a, <8 x half> %b, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14> -// CHECK:   ret <8 x half> [[SHUFFLE_I]] -float16x8_t test_vuzp1q_f16(float16x8_t a, float16x8_t b) { -  return vuzp1q_f16(a, b); -} - -// CHECK-LABEL: @test_vuzp2_f16( -// CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <4 x half> %a, <4 x half> %b, <4 x i32> <i32 1, i32 3, i32 5, i32 7> -// CHECK:   ret <4 x half> [[SHUFFLE_I]] -float16x4_t test_vuzp2_f16(float16x4_t a, float16x4_t b) { -  return vuzp2_f16(a, b); -} - -// CHECK-LABEL: @test_vuzp2q_f16( -// CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <8 x half> %a, <8 x half> %b, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15> -// CHECK:   ret <8 x half> [[SHUFFLE_I]] -float16x8_t test_vuzp2q_f16(float16x8_t a, float16x8_t b) { -  return vuzp2q_f16(a, b); -} - -// CHECK-LABEL: @test_vtrn1_f16( -// CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <4 x half> %a, <4 x half> %b, <4 x i32> <i32 0, i32 4, i32 2, i32 6> -// CHECK:   ret <4 x half> [[SHUFFLE_I]] -float16x4_t test_vtrn1_f16(float16x4_t a, float16x4_t b) { -  return vtrn1_f16(a, b); -} - -// CHECK-LABEL: @test_vtrn1q_f16( -// CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <8 x half> %a, <8 x half> %b, <8 x i32>  <i32 0, i32 8, i32 2, i32 10, i32 4, i32 12, i32 6, i32 14> -// CHECK:   ret <8 x half> [[SHUFFLE_I]] -float16x8_t test_vtrn1q_f16(float16x8_t a, float16x8_t b) { -  return vtrn1q_f16(a, b); -} - -// CHECK-LABEL: @test_vtrn2_f16( -// CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <4 x half> %a, <4 x half> %b, <4 x i32> <i32 1, i32 5, i32 3, i32 7> -// CHECK:   ret <4 x half> [[SHUFFLE_I]] -float16x4_t test_vtrn2_f16(float16x4_t a, float16x4_t b) { -  return vtrn2_f16(a, b); -} - -// CHECK-LABEL: @test_vtrn2q_f16( -// CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <8 x half> %a, <8 x half> %b, <8 x i32> <i32 1, i32 9, i32 3, i32 11, i32 5, i32 13, i32 7, i32 15> -// CHECK:   ret <8 x half> [[SHUFFLE_I]] -float16x8_t test_vtrn2q_f16(float16x8_t a, float16x8_t b) { -  return vtrn2q_f16(a, b); -} - diff --git a/test/CodeGen/address-space.c b/test/CodeGen/address-space.c index 54e059385772..28b3954ab7d2 100644 --- a/test/CodeGen/address-space.c +++ b/test/CodeGen/address-space.c @@ -24,11 +24,13 @@ int test2(int i) { return ban[i]; }  __attribute__((address_space(2))) int *A, *B;  // CHECK-LABEL: define void @test3() -// GIZ: load i32 addrspace(2)*, i32 addrspace(2)** @B -// PIZ: load i32 addrspace(2)*, i32 addrspace(2)* addrspace(4)* @B +// X86: load i32 addrspace(2)*, i32 addrspace(2)** @B +// AMDGIZ: load i32 addrspace(2)*, i32 addrspace(2)** addrspacecast (i32 addrspace(2)* addrspace(1)* @B to i32 addrspace(2)**) +// PIZ: load i32 addrspace(2)*, i32 addrspace(2)* addrspace(4)* addrspacecast (i32 addrspace(2)* addrspace(1)* @B to i32 addrspace(2)* addrspace(4)*)  // CHECK: load i32, i32 addrspace(2)* -// GIZ: load i32 addrspace(2)*, i32 addrspace(2)** @A -// PIZ: load i32 addrspace(2)*, i32 addrspace(2)* addrspace(4)* @A +// X86: load i32 addrspace(2)*, i32 addrspace(2)** @A +// AMDGIZ: load i32 addrspace(2)*, i32 addrspace(2)** addrspacecast (i32 addrspace(2)* addrspace(1)* @A to i32 addrspace(2)**) +// PIZ: load i32 addrspace(2)*, i32 addrspace(2)* addrspace(4)* addrspacecast (i32 addrspace(2)* addrspace(1)* @A to i32 addrspace(2)* addrspace(4)*)  // CHECK: store i32 {{.*}}, i32 addrspace(2)*  void test3() {    *A = *B; diff --git a/test/CodeGen/arm_neon_intrinsics.c b/test/CodeGen/arm_neon_intrinsics.c index b01c90c03a96..62888dd73339 100644 --- a/test/CodeGen/arm_neon_intrinsics.c +++ b/test/CodeGen/arm_neon_intrinsics.c @@ -3896,8 +3896,9 @@ int64x2_t test_vld1q_s64(int64_t const * a) {  // CHECK-LABEL: @test_vld1q_f16(  // CHECK:   [[TMP0:%.*]] = bitcast half* %a to i8* -// CHECK:   [[VLD1:%.*]] = call <8 x half> @llvm.arm.neon.vld1.v8f16.p0i8(i8* [[TMP0]], i32 2) -// CHECK:   ret <8 x half> [[VLD1]] +// CHECK:   [[VLD1:%.*]] = call <8 x i16> @llvm.arm.neon.vld1.v8i16.p0i8(i8* [[TMP0]], i32 2) +// CHECK:   [[TMP1:%.*]] = bitcast <8 x i16> [[VLD1]] to <8 x half> +// CHECK:   ret <8 x half> [[TMP1]]  float16x8_t test_vld1q_f16(float16_t const * a) {    return vld1q_f16(a);  } @@ -3989,8 +3990,9 @@ int64x1_t test_vld1_s64(int64_t const * a) {  // CHECK-LABEL: @test_vld1_f16(  // CHECK:   [[TMP0:%.*]] = bitcast half* %a to i8* -// CHECK:   [[VLD1:%.*]] = call <4 x half> @llvm.arm.neon.vld1.v4f16.p0i8(i8* [[TMP0]], i32 2) -// CHECK:   ret <4 x half> [[VLD1]] +// CHECK:   [[VLD1:%.*]] = call <4 x i16> @llvm.arm.neon.vld1.v4i16.p0i8(i8* [[TMP0]], i32 2) +// CHECK:   [[TMP1:%.*]] = bitcast <4 x i16> [[VLD1]] to <4 x half> +// CHECK:   ret <4 x half> [[TMP1]]  float16x4_t test_vld1_f16(float16_t const * a) {    return vld1_f16(a);  } @@ -4104,11 +4106,12 @@ int64x2_t test_vld1q_dup_s64(int64_t const * a) {  // CHECK-LABEL: @test_vld1q_dup_f16(  // CHECK:   [[TMP0:%.*]] = bitcast half* %a to i8* -// CHECK:   [[TMP1:%.*]] = bitcast i8* [[TMP0]] to half* -// CHECK:   [[TMP2:%.*]] = load half, half* [[TMP1]], align 2 -// CHECK:   [[TMP3:%.*]] = insertelement <8 x half> undef, half [[TMP2]], i32 0 -// CHECK:   [[LANE:%.*]] = shufflevector <8 x half> [[TMP3]], <8 x half> [[TMP3]], <8 x i32> zeroinitializer -// CHECK:   ret <8 x half> [[LANE]] +// CHECK:   [[TMP1:%.*]] = bitcast i8* [[TMP0]] to i16* +// CHECK:   [[TMP2:%.*]] = load i16, i16* [[TMP1]], align 2 +// CHECK:   [[TMP3:%.*]] = insertelement <8 x i16> undef, i16 [[TMP2]], i32 0 +// CHECK:   [[LANE:%.*]] = shufflevector <8 x i16> [[TMP3]], <8 x i16> [[TMP3]], <8 x i32> zeroinitializer +// CHECK:   [[TMP4:%.*]] = bitcast <8 x i16> [[LANE]] to <8 x half> +// CHECK:   ret <8 x half> [[TMP4]]  float16x8_t test_vld1q_dup_f16(float16_t const * a) {    return vld1q_dup_f16(a);  } @@ -4230,11 +4233,12 @@ int64x1_t test_vld1_dup_s64(int64_t const * a) {  // CHECK-LABEL: @test_vld1_dup_f16(  // CHECK:   [[TMP0:%.*]] = bitcast half* %a to i8* -// CHECK:   [[TMP1:%.*]] = bitcast i8* [[TMP0]] to half* -// CHECK:   [[TMP2:%.*]] = load half, half* [[TMP1]], align 2 -// CHECK:   [[TMP3:%.*]] = insertelement <4 x half> undef, half [[TMP2]], i32 0 -// CHECK:   [[LANE:%.*]] = shufflevector <4 x half> [[TMP3]], <4 x half> [[TMP3]], <4 x i32> zeroinitializer -// CHECK:   ret <4 x half> [[LANE]] +// CHECK:   [[TMP1:%.*]] = bitcast i8* [[TMP0]] to i16* +// CHECK:   [[TMP2:%.*]] = load i16, i16* [[TMP1]], align 2 +// CHECK:   [[TMP3:%.*]] = insertelement <4 x i16> undef, i16 [[TMP2]], i32 0 +// CHECK:   [[LANE:%.*]] = shufflevector <4 x i16> [[TMP3]], <4 x i16> [[TMP3]], <4 x i32> zeroinitializer +// CHECK:   [[TMP4:%.*]] = bitcast <4 x i16> [[LANE]] to <4 x half> +// CHECK:   ret <4 x half> [[TMP4]]  float16x4_t test_vld1_dup_f16(float16_t const * a) {    return vld1_dup_f16(a);  } @@ -4361,11 +4365,12 @@ int64x2_t test_vld1q_lane_s64(int64_t const * a, int64x2_t b) {  // CHECK-LABEL: @test_vld1q_lane_f16(  // CHECK:   [[TMP0:%.*]] = bitcast half* %a to i8*  // CHECK:   [[TMP1:%.*]] = bitcast <8 x half> %b to <16 x i8> -// CHECK:   [[TMP2:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x half> -// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to half* -// CHECK:   [[TMP4:%.*]] = load half, half* [[TMP3]], align 2 -// CHECK:   [[VLD1_LANE:%.*]] = insertelement <8 x half> [[TMP2]], half [[TMP4]], i32 7 -// CHECK:   ret <8 x half> [[VLD1_LANE]] +// CHECK:   [[TMP2:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x i16> +// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to i16* +// CHECK:   [[TMP4:%.*]] = load i16, i16* [[TMP3]], align 2 +// CHECK:   [[VLD1_LANE:%.*]] = insertelement <8 x i16> [[TMP2]], i16 [[TMP4]], i32 7 +// CHECK:   [[TMP5:%.*]] = bitcast <8 x i16> [[VLD1_LANE]] to <8 x half> +// CHECK:   ret <8 x half> [[TMP5]]  float16x8_t test_vld1q_lane_f16(float16_t const * a, float16x8_t b) {    return vld1q_lane_f16(a, b, 7);  } @@ -4493,11 +4498,12 @@ int64x1_t test_vld1_lane_s64(int64_t const * a, int64x1_t b) {  // CHECK-LABEL: @test_vld1_lane_f16(  // CHECK:   [[TMP0:%.*]] = bitcast half* %a to i8*  // CHECK:   [[TMP1:%.*]] = bitcast <4 x half> %b to <8 x i8> -// CHECK:   [[TMP2:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x half> -// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to half* -// CHECK:   [[TMP4:%.*]] = load half, half* [[TMP3]], align 2 -// CHECK:   [[VLD1_LANE:%.*]] = insertelement <4 x half> [[TMP2]], half [[TMP4]], i32 3 -// CHECK:   ret <4 x half> [[VLD1_LANE]] +// CHECK:   [[TMP2:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x i16> +// CHECK:   [[TMP3:%.*]] = bitcast i8* [[TMP0]] to i16* +// CHECK:   [[TMP4:%.*]] = load i16, i16* [[TMP3]], align 2 +// CHECK:   [[VLD1_LANE:%.*]] = insertelement <4 x i16> [[TMP2]], i16 [[TMP4]], i32 3 +// CHECK:   [[TMP5:%.*]] = bitcast <4 x i16> [[VLD1_LANE]] to <4 x half> +// CHECK:   ret <4 x half> [[TMP5]]  float16x4_t test_vld1_lane_f16(float16_t const * a, float16x4_t b) {    return vld1_lane_f16(a, b, 3);  } @@ -4590,7 +4596,7 @@ int32x4x2_t test_vld2q_s32(int32_t const * a) {  // CHECK:   [[__RET:%.*]] = alloca %struct.float16x8x2_t, align 16  // CHECK:   [[TMP0:%.*]] = bitcast %struct.float16x8x2_t* [[__RET]] to i8*  // CHECK:   [[TMP1:%.*]] = bitcast half* %a to i8* -// CHECK:   [[VLD2Q_V:%.*]] = call { <8 x half>, <8 x half> +// CHECK:   [[VLD2Q_V:%.*]] = call { <8 x i16>, <8 x i16>  float16x8x2_t test_vld2q_f16(float16_t const * a) {    return vld2q_f16(a);  } @@ -4695,7 +4701,7 @@ int64x1x2_t test_vld2_s64(int64_t const * a) {  // CHECK:   [[__RET:%.*]] = alloca %struct.float16x4x2_t, align 8  // CHECK:   [[TMP0:%.*]] = bitcast %struct.float16x4x2_t* [[__RET]] to i8*  // CHECK:   [[TMP1:%.*]] = bitcast half* %a to i8* -// CHECK:   [[VLD2_V:%.*]] = call { <4 x half>, <4 x half> +// CHECK:   [[VLD2_V:%.*]] = call { <4 x i16>, <4 x i16>  float16x4x2_t test_vld2_f16(float16_t const * a) {    return vld2_f16(a);  } @@ -4800,7 +4806,7 @@ int64x1x2_t test_vld2_dup_s64(int64_t const * a) {  // CHECK:   [[__RET:%.*]] = alloca %struct.float16x4x2_t, align 8  // CHECK:   [[TMP0:%.*]] = bitcast %struct.float16x4x2_t* [[__RET]] to i8*  // CHECK:   [[TMP1:%.*]] = bitcast half* %a to i8* -// CHECK:   [[VLD_DUP:%.*]] = call { <4 x half>, <4 x half> +// CHECK:   [[VLD_DUP:%.*]] = call { <4 x i16>, <4 x i16>  float16x4x2_t test_vld2_dup_f16(float16_t const * a) {    return vld2_dup_f16(a);  } @@ -4959,9 +4965,9 @@ int32x4x2_t test_vld2q_lane_s32(int32_t const * a, int32x4x2_t b) {  // CHECK:   [[ARRAYIDX2:%.*]] = getelementptr inbounds [2 x <8 x half>], [2 x <8 x half>]* [[VAL1]], i32 0, i32 1  // CHECK:   [[TMP7:%.*]] = load <8 x half>, <8 x half>* [[ARRAYIDX2]], align 16  // CHECK:   [[TMP8:%.*]] = bitcast <8 x half> [[TMP7]] to <16 x i8> -// CHECK:   [[TMP9:%.*]] = bitcast <16 x i8> [[TMP6]] to <8 x half> -// CHECK:   [[TMP10:%.*]] = bitcast <16 x i8> [[TMP8]] to <8 x half> -// CHECK:   [[VLD2Q_LANE_V:%.*]] = call { <8 x half>, <8 x half> +// CHECK:   [[TMP9:%.*]] = bitcast <16 x i8> [[TMP6]] to <8 x i16> +// CHECK:   [[TMP10:%.*]] = bitcast <16 x i8> [[TMP8]] to <8 x i16> +// CHECK:   [[VLD2Q_LANE_V:%.*]] = call { <8 x i16>, <8 x i16>  float16x8x2_t test_vld2q_lane_f16(float16_t const * a, float16x8x2_t b) {    return vld2q_lane_f16(a, b, 7);  } @@ -5192,9 +5198,9 @@ int32x2x2_t test_vld2_lane_s32(int32_t const * a, int32x2x2_t b) {  // CHECK:   [[ARRAYIDX2:%.*]] = getelementptr inbounds [2 x <4 x half>], [2 x <4 x half>]* [[VAL1]], i32 0, i32 1  // CHECK:   [[TMP7:%.*]] = load <4 x half>, <4 x half>* [[ARRAYIDX2]], align 8  // CHECK:   [[TMP8:%.*]] = bitcast <4 x half> [[TMP7]] to <8 x i8> -// CHECK:   [[TMP9:%.*]] = bitcast <8 x i8> [[TMP6]] to <4 x half> -// CHECK:   [[TMP10:%.*]] = bitcast <8 x i8> [[TMP8]] to <4 x half> -// CHECK:   [[VLD2_LANE_V:%.*]] = call { <4 x half>, <4 x half> +// CHECK:   [[TMP9:%.*]] = bitcast <8 x i8> [[TMP6]] to <4 x i16> +// CHECK:   [[TMP10:%.*]] = bitcast <8 x i8> [[TMP8]] to <4 x i16> +// CHECK:   [[VLD2_LANE_V:%.*]] = call { <4 x i16>, <4 x i16>  float16x4x2_t test_vld2_lane_f16(float16_t const * a, float16x4x2_t b) {    return vld2_lane_f16(a, b, 3);  } @@ -5331,7 +5337,7 @@ int32x4x3_t test_vld3q_s32(int32_t const * a) {  // CHECK:   [[__RET:%.*]] = alloca %struct.float16x8x3_t, align 16  // CHECK:   [[TMP0:%.*]] = bitcast %struct.float16x8x3_t* [[__RET]] to i8*  // CHECK:   [[TMP1:%.*]] = bitcast half* %a to i8* -// CHECK:   [[VLD3Q_V:%.*]] = call { <8 x half>, <8 x half>, <8 x half> +// CHECK:   [[VLD3Q_V:%.*]] = call { <8 x i16>, <8 x i16>, <8 x i16>  float16x8x3_t test_vld3q_f16(float16_t const * a) {    return vld3q_f16(a);  } @@ -5436,7 +5442,7 @@ int64x1x3_t test_vld3_s64(int64_t const * a) {  // CHECK:   [[__RET:%.*]] = alloca %struct.float16x4x3_t, align 8  // CHECK:   [[TMP0:%.*]] = bitcast %struct.float16x4x3_t* [[__RET]] to i8*  // CHECK:   [[TMP1:%.*]] = bitcast half* %a to i8* -// CHECK:   [[VLD3_V:%.*]] = call { <4 x half>, <4 x half>, <4 x half> +// CHECK:   [[VLD3_V:%.*]] = call { <4 x i16>, <4 x i16>, <4 x i16>  float16x4x3_t test_vld3_f16(float16_t const * a) {    return vld3_f16(a);  } @@ -5541,7 +5547,7 @@ int64x1x3_t test_vld3_dup_s64(int64_t const * a) {  // CHECK:   [[__RET:%.*]] = alloca %struct.float16x4x3_t, align 8  // CHECK:   [[TMP0:%.*]] = bitcast %struct.float16x4x3_t* [[__RET]] to i8*  // CHECK:   [[TMP1:%.*]] = bitcast half* %a to i8* -// CHECK:   [[VLD_DUP:%.*]] = call { <4 x half>, <4 x half>, <4 x half> +// CHECK:   [[VLD_DUP:%.*]] = call { <4 x i16>, <4 x i16>, <4 x i16>  float16x4x3_t test_vld3_dup_f16(float16_t const * a) {    return vld3_dup_f16(a);  } @@ -5724,10 +5730,10 @@ int32x4x3_t test_vld3q_lane_s32(int32_t const * a, int32x4x3_t b) {  // CHECK:   [[ARRAYIDX4:%.*]] = getelementptr inbounds [3 x <8 x half>], [3 x <8 x half>]* [[VAL3]], i32 0, i32 2  // CHECK:   [[TMP9:%.*]] = load <8 x half>, <8 x half>* [[ARRAYIDX4]], align 16  // CHECK:   [[TMP10:%.*]] = bitcast <8 x half> [[TMP9]] to <16 x i8> -// CHECK:   [[TMP11:%.*]] = bitcast <16 x i8> [[TMP6]] to <8 x half> -// CHECK:   [[TMP12:%.*]] = bitcast <16 x i8> [[TMP8]] to <8 x half> -// CHECK:   [[TMP13:%.*]] = bitcast <16 x i8> [[TMP10]] to <8 x half> -// CHECK:   [[VLD3Q_LANE_V:%.*]] = call { <8 x half>, <8 x half>, <8 x half> +// CHECK:   [[TMP11:%.*]] = bitcast <16 x i8> [[TMP6]] to <8 x i16> +// CHECK:   [[TMP12:%.*]] = bitcast <16 x i8> [[TMP8]] to <8 x i16> +// CHECK:   [[TMP13:%.*]] = bitcast <16 x i8> [[TMP10]] to <8 x i16> +// CHECK:   [[VLD3Q_LANE_V:%.*]] = call { <8 x i16>, <8 x i16>, <8 x i16>  float16x8x3_t test_vld3q_lane_f16(float16_t const * a, float16x8x3_t b) {    return vld3q_lane_f16(a, b, 7);  } @@ -5998,10 +6004,10 @@ int32x2x3_t test_vld3_lane_s32(int32_t const * a, int32x2x3_t b) {  // CHECK:   [[ARRAYIDX4:%.*]] = getelementptr inbounds [3 x <4 x half>], [3 x <4 x half>]* [[VAL3]], i32 0, i32 2  // CHECK:   [[TMP9:%.*]] = load <4 x half>, <4 x half>* [[ARRAYIDX4]], align 8  // CHECK:   [[TMP10:%.*]] = bitcast <4 x half> [[TMP9]] to <8 x i8> -// CHECK:   [[TMP11:%.*]] = bitcast <8 x i8> [[TMP6]] to <4 x half> -// CHECK:   [[TMP12:%.*]] = bitcast <8 x i8> [[TMP8]] to <4 x half> -// CHECK:   [[TMP13:%.*]] = bitcast <8 x i8> [[TMP10]] to <4 x half> -// CHECK:   [[VLD3_LANE_V:%.*]] = call { <4 x half>, <4 x half>, <4 x half> +// CHECK:   [[TMP11:%.*]] = bitcast <8 x i8> [[TMP6]] to <4 x i16> +// CHECK:   [[TMP12:%.*]] = bitcast <8 x i8> [[TMP8]] to <4 x i16> +// CHECK:   [[TMP13:%.*]] = bitcast <8 x i8> [[TMP10]] to <4 x i16> +// CHECK:   [[VLD3_LANE_V:%.*]] = call { <4 x i16>, <4 x i16>, <4 x i16>  float16x4x3_t test_vld3_lane_f16(float16_t const * a, float16x4x3_t b) {    return vld3_lane_f16(a, b, 3);  } @@ -6151,7 +6157,7 @@ int32x4x4_t test_vld4q_s32(int32_t const * a) {  // CHECK:   [[__RET:%.*]] = alloca %struct.float16x8x4_t, align 16  // CHECK:   [[TMP0:%.*]] = bitcast %struct.float16x8x4_t* [[__RET]] to i8*  // CHECK:   [[TMP1:%.*]] = bitcast half* %a to i8* -// CHECK:   [[VLD4Q_V:%.*]] = call { <8 x half>, <8 x half>, <8 x half>, <8 x half> +// CHECK:   [[VLD4Q_V:%.*]] = call { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>  float16x8x4_t test_vld4q_f16(float16_t const * a) {    return vld4q_f16(a);  } @@ -6256,7 +6262,7 @@ int64x1x4_t test_vld4_s64(int64_t const * a) {  // CHECK:   [[__RET:%.*]] = alloca %struct.float16x4x4_t, align 8  // CHECK:   [[TMP0:%.*]] = bitcast %struct.float16x4x4_t* [[__RET]] to i8*  // CHECK:   [[TMP1:%.*]] = bitcast half* %a to i8* -// CHECK:   [[VLD4_V:%.*]] = call { <4 x half>, <4 x half>, <4 x half>, <4 x half> +// CHECK:   [[VLD4_V:%.*]] = call { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>  float16x4x4_t test_vld4_f16(float16_t const * a) {    return vld4_f16(a);  } @@ -6361,7 +6367,7 @@ int64x1x4_t test_vld4_dup_s64(int64_t const * a) {  // CHECK:   [[__RET:%.*]] = alloca %struct.float16x4x4_t, align 8  // CHECK:   [[TMP0:%.*]] = bitcast %struct.float16x4x4_t* [[__RET]] to i8*  // CHECK:   [[TMP1:%.*]] = bitcast half* %a to i8* -// CHECK:   [[VLD_DUP:%.*]] = call { <4 x half>, <4 x half>, <4 x half>, <4 x half> +// CHECK:   [[VLD_DUP:%.*]] = call { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>  float16x4x4_t test_vld4_dup_f16(float16_t const * a) {    return vld4_dup_f16(a);  } @@ -6568,11 +6574,11 @@ int32x4x4_t test_vld4q_lane_s32(int32_t const * a, int32x4x4_t b) {  // CHECK:   [[ARRAYIDX6:%.*]] = getelementptr inbounds [4 x <8 x half>], [4 x <8 x half>]* [[VAL5]], i32 0, i32 3  // CHECK:   [[TMP11:%.*]] = load <8 x half>, <8 x half>* [[ARRAYIDX6]], align 16  // CHECK:   [[TMP12:%.*]] = bitcast <8 x half> [[TMP11]] to <16 x i8> -// CHECK:   [[TMP13:%.*]] = bitcast <16 x i8> [[TMP6]] to <8 x half> -// CHECK:   [[TMP14:%.*]] = bitcast <16 x i8> [[TMP8]] to <8 x half> -// CHECK:   [[TMP15:%.*]] = bitcast <16 x i8> [[TMP10]] to <8 x half> -// CHECK:   [[TMP16:%.*]] = bitcast <16 x i8> [[TMP12]] to <8 x half> -// CHECK:   [[VLD4Q_LANE_V:%.*]] = call { <8 x half>, <8 x half>, <8 x half>, <8 x half> +// CHECK:   [[TMP13:%.*]] = bitcast <16 x i8> [[TMP6]] to <8 x i16> +// CHECK:   [[TMP14:%.*]] = bitcast <16 x i8> [[TMP8]] to <8 x i16> +// CHECK:   [[TMP15:%.*]] = bitcast <16 x i8> [[TMP10]] to <8 x i16> +// CHECK:   [[TMP16:%.*]] = bitcast <16 x i8> [[TMP12]] to <8 x i16> +// CHECK:   [[VLD4Q_LANE_V:%.*]] = call { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>  float16x8x4_t test_vld4q_lane_f16(float16_t const * a, float16x8x4_t b) {    return vld4q_lane_f16(a, b, 7);  } @@ -6883,11 +6889,11 @@ int32x2x4_t test_vld4_lane_s32(int32_t const * a, int32x2x4_t b) {  // CHECK:   [[ARRAYIDX6:%.*]] = getelementptr inbounds [4 x <4 x half>], [4 x <4 x half>]* [[VAL5]], i32 0, i32 3  // CHECK:   [[TMP11:%.*]] = load <4 x half>, <4 x half>* [[ARRAYIDX6]], align 8  // CHECK:   [[TMP12:%.*]] = bitcast <4 x half> [[TMP11]] to <8 x i8> -// CHECK:   [[TMP13:%.*]] = bitcast <8 x i8> [[TMP6]] to <4 x half> -// CHECK:   [[TMP14:%.*]] = bitcast <8 x i8> [[TMP8]] to <4 x half> -// CHECK:   [[TMP15:%.*]] = bitcast <8 x i8> [[TMP10]] to <4 x half> -// CHECK:   [[TMP16:%.*]] = bitcast <8 x i8> [[TMP12]] to <4 x half> -// CHECK:   [[VLD4_LANE_V:%.*]] = call { <4 x half>, <4 x half>, <4 x half>, <4 x half> +// CHECK:   [[TMP13:%.*]] = bitcast <8 x i8> [[TMP6]] to <4 x i16> +// CHECK:   [[TMP14:%.*]] = bitcast <8 x i8> [[TMP8]] to <4 x i16> +// CHECK:   [[TMP15:%.*]] = bitcast <8 x i8> [[TMP10]] to <4 x i16> +// CHECK:   [[TMP16:%.*]] = bitcast <8 x i8> [[TMP12]] to <4 x i16> +// CHECK:   [[VLD4_LANE_V:%.*]] = call { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>  float16x4x4_t test_vld4_lane_f16(float16_t const * a, float16x4x4_t b) {    return vld4_lane_f16(a, b, 3);  } @@ -15778,8 +15784,8 @@ void test_vst1q_s64(int64_t * a, int64x2_t b) {  // CHECK-LABEL: @test_vst1q_f16(  // CHECK:   [[TMP0:%.*]] = bitcast half* %a to i8*  // CHECK:   [[TMP1:%.*]] = bitcast <8 x half> %b to <16 x i8> -// CHECK:   [[TMP2:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x half> -// CHECK:   call void @llvm.arm.neon.vst1.p0i8.v8f16(i8* [[TMP0]], <8 x half> [[TMP2]], i32 2) +// CHECK:   [[TMP2:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x i16> +// CHECK:   call void @llvm.arm.neon.vst1.p0i8.v8i16(i8* [[TMP0]], <8 x i16> [[TMP2]], i32 2)  // CHECK:   ret void  void test_vst1q_f16(float16_t * a, float16x8_t b) {    vst1q_f16(a, b); @@ -15889,8 +15895,8 @@ void test_vst1_s64(int64_t * a, int64x1_t b) {  // CHECK-LABEL: @test_vst1_f16(  // CHECK:   [[TMP0:%.*]] = bitcast half* %a to i8*  // CHECK:   [[TMP1:%.*]] = bitcast <4 x half> %b to <8 x i8> -// CHECK:   [[TMP2:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x half> -// CHECK:   call void @llvm.arm.neon.vst1.p0i8.v4f16(i8* [[TMP0]], <4 x half> [[TMP2]], i32 2) +// CHECK:   [[TMP2:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x i16> +// CHECK:   call void @llvm.arm.neon.vst1.p0i8.v4i16(i8* [[TMP0]], <4 x i16> [[TMP2]], i32 2)  // CHECK:   ret void  void test_vst1_f16(float16_t * a, float16x4_t b) {    vst1_f16(a, b); @@ -16012,10 +16018,10 @@ void test_vst1q_lane_s64(int64_t * a, int64x2_t b) {  // CHECK-LABEL: @test_vst1q_lane_f16(  // CHECK:   [[TMP0:%.*]] = bitcast half* %a to i8*  // CHECK:   [[TMP1:%.*]] = bitcast <8 x half> %b to <16 x i8> -// CHECK:   [[TMP2:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x half> -// CHECK:   [[TMP3:%.*]] = extractelement <8 x half> [[TMP2]], i32 7 -// CHECK:   [[TMP4:%.*]] = bitcast i8* [[TMP0]] to half* -// CHECK:   store half [[TMP3]], half* [[TMP4]], align 2 +// CHECK:   [[TMP2:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x i16> +// CHECK:   [[TMP3:%.*]] = extractelement <8 x i16> [[TMP2]], i32 7 +// CHECK:   [[TMP4:%.*]] = bitcast i8* [[TMP0]] to i16* +// CHECK:   store i16 [[TMP3]], i16* [[TMP4]], align 2  // CHECK:   ret void  void test_vst1q_lane_f16(float16_t * a, float16x8_t b) {    vst1q_lane_f16(a, b, 7); @@ -16144,10 +16150,10 @@ void test_vst1_lane_s64(int64_t * a, int64x1_t b) {  // CHECK-LABEL: @test_vst1_lane_f16(  // CHECK:   [[TMP0:%.*]] = bitcast half* %a to i8*  // CHECK:   [[TMP1:%.*]] = bitcast <4 x half> %b to <8 x i8> -// CHECK:   [[TMP2:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x half> -// CHECK:   [[TMP3:%.*]] = extractelement <4 x half> [[TMP2]], i32 3 -// CHECK:   [[TMP4:%.*]] = bitcast i8* [[TMP0]] to half* -// CHECK:   store half [[TMP3]], half* [[TMP4]], align 2 +// CHECK:   [[TMP2:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x i16> +// CHECK:   [[TMP3:%.*]] = extractelement <4 x i16> [[TMP2]], i32 3 +// CHECK:   [[TMP4:%.*]] = bitcast i8* [[TMP0]] to i16* +// CHECK:   store i16 [[TMP3]], i16* [[TMP4]], align 2  // CHECK:   ret void  void test_vst1_lane_f16(float16_t * a, float16x4_t b) {    vst1_lane_f16(a, b, 3); @@ -16349,9 +16355,9 @@ void test_vst2q_s32(int32_t * a, int32x4x2_t b) {  // CHECK:   [[ARRAYIDX2:%.*]] = getelementptr inbounds [2 x <8 x half>], [2 x <8 x half>]* [[VAL1]], i32 0, i32 1  // CHECK:   [[TMP6:%.*]] = load <8 x half>, <8 x half>* [[ARRAYIDX2]], align 16  // CHECK:   [[TMP7:%.*]] = bitcast <8 x half> [[TMP6]] to <16 x i8> -// CHECK:   [[TMP8:%.*]] = bitcast <16 x i8> [[TMP5]] to <8 x half> -// CHECK:   [[TMP9:%.*]] = bitcast <16 x i8> [[TMP7]] to <8 x half> -// CHECK:   call void @llvm.arm.neon.vst2.p0i8.v8f16(i8* [[TMP3]], <8 x half> [[TMP8]], <8 x half> [[TMP9]], i32 2) +// CHECK:   [[TMP8:%.*]] = bitcast <16 x i8> [[TMP5]] to <8 x i16> +// CHECK:   [[TMP9:%.*]] = bitcast <16 x i8> [[TMP7]] to <8 x i16> +// CHECK:   call void @llvm.arm.neon.vst2.p0i8.v8i16(i8* [[TMP3]], <8 x i16> [[TMP8]], <8 x i16> [[TMP9]], i32 2)  // CHECK:   ret void  void test_vst2q_f16(float16_t * a, float16x8x2_t b) {    vst2q_f16(a, b); @@ -16646,9 +16652,9 @@ void test_vst2_s64(int64_t * a, int64x1x2_t b) {  // CHECK:   [[ARRAYIDX2:%.*]] = getelementptr inbounds [2 x <4 x half>], [2 x <4 x half>]* [[VAL1]], i32 0, i32 1  // CHECK:   [[TMP6:%.*]] = load <4 x half>, <4 x half>* [[ARRAYIDX2]], align 8  // CHECK:   [[TMP7:%.*]] = bitcast <4 x half> [[TMP6]] to <8 x i8> -// CHECK:   [[TMP8:%.*]] = bitcast <8 x i8> [[TMP5]] to <4 x half> -// CHECK:   [[TMP9:%.*]] = bitcast <8 x i8> [[TMP7]] to <4 x half> -// CHECK:   call void @llvm.arm.neon.vst2.p0i8.v4f16(i8* [[TMP3]], <4 x half> [[TMP8]], <4 x half> [[TMP9]], i32 2) +// CHECK:   [[TMP8:%.*]] = bitcast <8 x i8> [[TMP5]] to <4 x i16> +// CHECK:   [[TMP9:%.*]] = bitcast <8 x i8> [[TMP7]] to <4 x i16> +// CHECK:   call void @llvm.arm.neon.vst2.p0i8.v4i16(i8* [[TMP3]], <4 x i16> [[TMP8]], <4 x i16> [[TMP9]], i32 2)  // CHECK:   ret void  void test_vst2_f16(float16_t * a, float16x4x2_t b) {    vst2_f16(a, b); @@ -16849,9 +16855,9 @@ void test_vst2q_lane_s32(int32_t * a, int32x4x2_t b) {  // CHECK:   [[ARRAYIDX2:%.*]] = getelementptr inbounds [2 x <8 x half>], [2 x <8 x half>]* [[VAL1]], i32 0, i32 1  // CHECK:   [[TMP6:%.*]] = load <8 x half>, <8 x half>* [[ARRAYIDX2]], align 16  // CHECK:   [[TMP7:%.*]] = bitcast <8 x half> [[TMP6]] to <16 x i8> -// CHECK:   [[TMP8:%.*]] = bitcast <16 x i8> [[TMP5]] to <8 x half> -// CHECK:   [[TMP9:%.*]] = bitcast <16 x i8> [[TMP7]] to <8 x half> -// CHECK:   call void @llvm.arm.neon.vst2lane.p0i8.v8f16(i8* [[TMP3]], <8 x half> [[TMP8]], <8 x half> [[TMP9]], i32 7, i32 2) +// CHECK:   [[TMP8:%.*]] = bitcast <16 x i8> [[TMP5]] to <8 x i16> +// CHECK:   [[TMP9:%.*]] = bitcast <16 x i8> [[TMP7]] to <8 x i16> +// CHECK:   call void @llvm.arm.neon.vst2lane.p0i8.v8i16(i8* [[TMP3]], <8 x i16> [[TMP8]], <8 x i16> [[TMP9]], i32 7, i32 2)  // CHECK:   ret void  void test_vst2q_lane_f16(float16_t * a, float16x8x2_t b) {    vst2q_lane_f16(a, b, 7); @@ -17073,9 +17079,9 @@ void test_vst2_lane_s32(int32_t * a, int32x2x2_t b) {  // CHECK:   [[ARRAYIDX2:%.*]] = getelementptr inbounds [2 x <4 x half>], [2 x <4 x half>]* [[VAL1]], i32 0, i32 1  // CHECK:   [[TMP6:%.*]] = load <4 x half>, <4 x half>* [[ARRAYIDX2]], align 8  // CHECK:   [[TMP7:%.*]] = bitcast <4 x half> [[TMP6]] to <8 x i8> -// CHECK:   [[TMP8:%.*]] = bitcast <8 x i8> [[TMP5]] to <4 x half> -// CHECK:   [[TMP9:%.*]] = bitcast <8 x i8> [[TMP7]] to <4 x half> -// CHECK:   call void @llvm.arm.neon.vst2lane.p0i8.v4f16(i8* [[TMP3]], <4 x half> [[TMP8]], <4 x half> [[TMP9]], i32 3, i32 2) +// CHECK:   [[TMP8:%.*]] = bitcast <8 x i8> [[TMP5]] to <4 x i16> +// CHECK:   [[TMP9:%.*]] = bitcast <8 x i8> [[TMP7]] to <4 x i16> +// CHECK:   call void @llvm.arm.neon.vst2lane.p0i8.v4i16(i8* [[TMP3]], <4 x i16> [[TMP8]], <4 x i16> [[TMP9]], i32 3, i32 2)  // CHECK:   ret void  void test_vst2_lane_f16(float16_t * a, float16x4x2_t b) {    vst2_lane_f16(a, b, 3); @@ -17348,10 +17354,10 @@ void test_vst3q_s32(int32_t * a, int32x4x3_t b) {  // CHECK:   [[ARRAYIDX4:%.*]] = getelementptr inbounds [3 x <8 x half>], [3 x <8 x half>]* [[VAL3]], i32 0, i32 2  // CHECK:   [[TMP8:%.*]] = load <8 x half>, <8 x half>* [[ARRAYIDX4]], align 16  // CHECK:   [[TMP9:%.*]] = bitcast <8 x half> [[TMP8]] to <16 x i8> -// CHECK:   [[TMP10:%.*]] = bitcast <16 x i8> [[TMP5]] to <8 x half> -// CHECK:   [[TMP11:%.*]] = bitcast <16 x i8> [[TMP7]] to <8 x half> -// CHECK:   [[TMP12:%.*]] = bitcast <16 x i8> [[TMP9]] to <8 x half> -// CHECK:   call void @llvm.arm.neon.vst3.p0i8.v8f16(i8* [[TMP3]], <8 x half> [[TMP10]], <8 x half> [[TMP11]], <8 x half> [[TMP12]], i32 2) +// CHECK:   [[TMP10:%.*]] = bitcast <16 x i8> [[TMP5]] to <8 x i16> +// CHECK:   [[TMP11:%.*]] = bitcast <16 x i8> [[TMP7]] to <8 x i16> +// CHECK:   [[TMP12:%.*]] = bitcast <16 x i8> [[TMP9]] to <8 x i16> +// CHECK:   call void @llvm.arm.neon.vst3.p0i8.v8i16(i8* [[TMP3]], <8 x i16> [[TMP10]], <8 x i16> [[TMP11]], <8 x i16> [[TMP12]], i32 2)  // CHECK:   ret void  void test_vst3q_f16(float16_t * a, float16x8x3_t b) {    vst3q_f16(a, b); @@ -17699,10 +17705,10 @@ void test_vst3_s64(int64_t * a, int64x1x3_t b) {  // CHECK:   [[ARRAYIDX4:%.*]] = getelementptr inbounds [3 x <4 x half>], [3 x <4 x half>]* [[VAL3]], i32 0, i32 2  // CHECK:   [[TMP8:%.*]] = load <4 x half>, <4 x half>* [[ARRAYIDX4]], align 8  // CHECK:   [[TMP9:%.*]] = bitcast <4 x half> [[TMP8]] to <8 x i8> -// CHECK:   [[TMP10:%.*]] = bitcast <8 x i8> [[TMP5]] to <4 x half> -// CHECK:   [[TMP11:%.*]] = bitcast <8 x i8> [[TMP7]] to <4 x half> -// CHECK:   [[TMP12:%.*]] = bitcast <8 x i8> [[TMP9]] to <4 x half> -// CHECK:   call void @llvm.arm.neon.vst3.p0i8.v4f16(i8* [[TMP3]], <4 x half> [[TMP10]], <4 x half> [[TMP11]], <4 x half> [[TMP12]], i32 2) +// CHECK:   [[TMP10:%.*]] = bitcast <8 x i8> [[TMP5]] to <4 x i16> +// CHECK:   [[TMP11:%.*]] = bitcast <8 x i8> [[TMP7]] to <4 x i16> +// CHECK:   [[TMP12:%.*]] = bitcast <8 x i8> [[TMP9]] to <4 x i16> +// CHECK:   call void @llvm.arm.neon.vst3.p0i8.v4i16(i8* [[TMP3]], <4 x i16> [[TMP10]], <4 x i16> [[TMP11]], <4 x i16> [[TMP12]], i32 2)  // CHECK:   ret void  void test_vst3_f16(float16_t * a, float16x4x3_t b) {    vst3_f16(a, b); @@ -17940,10 +17946,10 @@ void test_vst3q_lane_s32(int32_t * a, int32x4x3_t b) {  // CHECK:   [[ARRAYIDX4:%.*]] = getelementptr inbounds [3 x <8 x half>], [3 x <8 x half>]* [[VAL3]], i32 0, i32 2  // CHECK:   [[TMP8:%.*]] = load <8 x half>, <8 x half>* [[ARRAYIDX4]], align 16  // CHECK:   [[TMP9:%.*]] = bitcast <8 x half> [[TMP8]] to <16 x i8> -// CHECK:   [[TMP10:%.*]] = bitcast <16 x i8> [[TMP5]] to <8 x half> -// CHECK:   [[TMP11:%.*]] = bitcast <16 x i8> [[TMP7]] to <8 x half> -// CHECK:   [[TMP12:%.*]] = bitcast <16 x i8> [[TMP9]] to <8 x half> -// CHECK:   call void @llvm.arm.neon.vst3lane.p0i8.v8f16(i8* [[TMP3]], <8 x half> [[TMP10]], <8 x half> [[TMP11]], <8 x half> [[TMP12]], i32 7, i32 2) +// CHECK:   [[TMP10:%.*]] = bitcast <16 x i8> [[TMP5]] to <8 x i16> +// CHECK:   [[TMP11:%.*]] = bitcast <16 x i8> [[TMP7]] to <8 x i16> +// CHECK:   [[TMP12:%.*]] = bitcast <16 x i8> [[TMP9]] to <8 x i16> +// CHECK:   call void @llvm.arm.neon.vst3lane.p0i8.v8i16(i8* [[TMP3]], <8 x i16> [[TMP10]], <8 x i16> [[TMP11]], <8 x i16> [[TMP12]], i32 7, i32 2)  // CHECK:   ret void  void test_vst3q_lane_f16(float16_t * a, float16x8x3_t b) {    vst3q_lane_f16(a, b, 7); @@ -18205,10 +18211,10 @@ void test_vst3_lane_s32(int32_t * a, int32x2x3_t b) {  // CHECK:   [[ARRAYIDX4:%.*]] = getelementptr inbounds [3 x <4 x half>], [3 x <4 x half>]* [[VAL3]], i32 0, i32 2  // CHECK:   [[TMP8:%.*]] = load <4 x half>, <4 x half>* [[ARRAYIDX4]], align 8  // CHECK:   [[TMP9:%.*]] = bitcast <4 x half> [[TMP8]] to <8 x i8> -// CHECK:   [[TMP10:%.*]] = bitcast <8 x i8> [[TMP5]] to <4 x half> -// CHECK:   [[TMP11:%.*]] = bitcast <8 x i8> [[TMP7]] to <4 x half> -// CHECK:   [[TMP12:%.*]] = bitcast <8 x i8> [[TMP9]] to <4 x half> -// CHECK:   call void @llvm.arm.neon.vst3lane.p0i8.v4f16(i8* [[TMP3]], <4 x half> [[TMP10]], <4 x half> [[TMP11]], <4 x half> [[TMP12]], i32 3, i32 2) +// CHECK:   [[TMP10:%.*]] = bitcast <8 x i8> [[TMP5]] to <4 x i16> +// CHECK:   [[TMP11:%.*]] = bitcast <8 x i8> [[TMP7]] to <4 x i16> +// CHECK:   [[TMP12:%.*]] = bitcast <8 x i8> [[TMP9]] to <4 x i16> +// CHECK:   call void @llvm.arm.neon.vst3lane.p0i8.v4i16(i8* [[TMP3]], <4 x i16> [[TMP10]], <4 x i16> [[TMP11]], <4 x i16> [[TMP12]], i32 3, i32 2)  // CHECK:   ret void  void test_vst3_lane_f16(float16_t * a, float16x4x3_t b) {    vst3_lane_f16(a, b, 3); @@ -18524,11 +18530,11 @@ void test_vst4q_s32(int32_t * a, int32x4x4_t b) {  // CHECK:   [[ARRAYIDX6:%.*]] = getelementptr inbounds [4 x <8 x half>], [4 x <8 x half>]* [[VAL5]], i32 0, i32 3  // CHECK:   [[TMP10:%.*]] = load <8 x half>, <8 x half>* [[ARRAYIDX6]], align 16  // CHECK:   [[TMP11:%.*]] = bitcast <8 x half> [[TMP10]] to <16 x i8> -// CHECK:   [[TMP12:%.*]] = bitcast <16 x i8> [[TMP5]] to <8 x half> -// CHECK:   [[TMP13:%.*]] = bitcast <16 x i8> [[TMP7]] to <8 x half> -// CHECK:   [[TMP14:%.*]] = bitcast <16 x i8> [[TMP9]] to <8 x half> -// CHECK:   [[TMP15:%.*]] = bitcast <16 x i8> [[TMP11]] to <8 x half> -// CHECK:   call void @llvm.arm.neon.vst4.p0i8.v8f16(i8* [[TMP3]], <8 x half> [[TMP12]], <8 x half> [[TMP13]], <8 x half> [[TMP14]], <8 x half> [[TMP15]], i32 2) +// CHECK:   [[TMP12:%.*]] = bitcast <16 x i8> [[TMP5]] to <8 x i16> +// CHECK:   [[TMP13:%.*]] = bitcast <16 x i8> [[TMP7]] to <8 x i16> +// CHECK:   [[TMP14:%.*]] = bitcast <16 x i8> [[TMP9]] to <8 x i16> +// CHECK:   [[TMP15:%.*]] = bitcast <16 x i8> [[TMP11]] to <8 x i16> +// CHECK:   call void @llvm.arm.neon.vst4.p0i8.v8i16(i8* [[TMP3]], <8 x i16> [[TMP12]], <8 x i16> [[TMP13]], <8 x i16> [[TMP14]], <8 x i16> [[TMP15]], i32 2)  // CHECK:   ret void  void test_vst4q_f16(float16_t * a, float16x8x4_t b) {    vst4q_f16(a, b); @@ -18929,11 +18935,11 @@ void test_vst4_s64(int64_t * a, int64x1x4_t b) {  // CHECK:   [[ARRAYIDX6:%.*]] = getelementptr inbounds [4 x <4 x half>], [4 x <4 x half>]* [[VAL5]], i32 0, i32 3  // CHECK:   [[TMP10:%.*]] = load <4 x half>, <4 x half>* [[ARRAYIDX6]], align 8  // CHECK:   [[TMP11:%.*]] = bitcast <4 x half> [[TMP10]] to <8 x i8> -// CHECK:   [[TMP12:%.*]] = bitcast <8 x i8> [[TMP5]] to <4 x half> -// CHECK:   [[TMP13:%.*]] = bitcast <8 x i8> [[TMP7]] to <4 x half> -// CHECK:   [[TMP14:%.*]] = bitcast <8 x i8> [[TMP9]] to <4 x half> -// CHECK:   [[TMP15:%.*]] = bitcast <8 x i8> [[TMP11]] to <4 x half> -// CHECK:   call void @llvm.arm.neon.vst4.p0i8.v4f16(i8* [[TMP3]], <4 x half> [[TMP12]], <4 x half> [[TMP13]], <4 x half> [[TMP14]], <4 x half> [[TMP15]], i32 2) +// CHECK:   [[TMP12:%.*]] = bitcast <8 x i8> [[TMP5]] to <4 x i16> +// CHECK:   [[TMP13:%.*]] = bitcast <8 x i8> [[TMP7]] to <4 x i16> +// CHECK:   [[TMP14:%.*]] = bitcast <8 x i8> [[TMP9]] to <4 x i16> +// CHECK:   [[TMP15:%.*]] = bitcast <8 x i8> [[TMP11]] to <4 x i16> +// CHECK:   call void @llvm.arm.neon.vst4.p0i8.v4i16(i8* [[TMP3]], <4 x i16> [[TMP12]], <4 x i16> [[TMP13]], <4 x i16> [[TMP14]], <4 x i16> [[TMP15]], i32 2)  // CHECK:   ret void  void test_vst4_f16(float16_t * a, float16x4x4_t b) {    vst4_f16(a, b); @@ -19208,11 +19214,11 @@ void test_vst4q_lane_s32(int32_t * a, int32x4x4_t b) {  // CHECK:   [[ARRAYIDX6:%.*]] = getelementptr inbounds [4 x <8 x half>], [4 x <8 x half>]* [[VAL5]], i32 0, i32 3  // CHECK:   [[TMP10:%.*]] = load <8 x half>, <8 x half>* [[ARRAYIDX6]], align 16  // CHECK:   [[TMP11:%.*]] = bitcast <8 x half> [[TMP10]] to <16 x i8> -// CHECK:   [[TMP12:%.*]] = bitcast <16 x i8> [[TMP5]] to <8 x half> -// CHECK:   [[TMP13:%.*]] = bitcast <16 x i8> [[TMP7]] to <8 x half> -// CHECK:   [[TMP14:%.*]] = bitcast <16 x i8> [[TMP9]] to <8 x half> -// CHECK:   [[TMP15:%.*]] = bitcast <16 x i8> [[TMP11]] to <8 x half> -// CHECK:   call void @llvm.arm.neon.vst4lane.p0i8.v8f16(i8* [[TMP3]], <8 x half> [[TMP12]], <8 x half> [[TMP13]], <8 x half> [[TMP14]], <8 x half> [[TMP15]], i32 7, i32 2) +// CHECK:   [[TMP12:%.*]] = bitcast <16 x i8> [[TMP5]] to <8 x i16> +// CHECK:   [[TMP13:%.*]] = bitcast <16 x i8> [[TMP7]] to <8 x i16> +// CHECK:   [[TMP14:%.*]] = bitcast <16 x i8> [[TMP9]] to <8 x i16> +// CHECK:   [[TMP15:%.*]] = bitcast <16 x i8> [[TMP11]] to <8 x i16> +// CHECK:   call void @llvm.arm.neon.vst4lane.p0i8.v8i16(i8* [[TMP3]], <8 x i16> [[TMP12]], <8 x i16> [[TMP13]], <8 x i16> [[TMP14]], <8 x i16> [[TMP15]], i32 7, i32 2)  // CHECK:   ret void  void test_vst4q_lane_f16(float16_t * a, float16x8x4_t b) {    vst4q_lane_f16(a, b, 7); @@ -19514,11 +19520,11 @@ void test_vst4_lane_s32(int32_t * a, int32x2x4_t b) {  // CHECK:   [[ARRAYIDX6:%.*]] = getelementptr inbounds [4 x <4 x half>], [4 x <4 x half>]* [[VAL5]], i32 0, i32 3  // CHECK:   [[TMP10:%.*]] = load <4 x half>, <4 x half>* [[ARRAYIDX6]], align 8  // CHECK:   [[TMP11:%.*]] = bitcast <4 x half> [[TMP10]] to <8 x i8> -// CHECK:   [[TMP12:%.*]] = bitcast <8 x i8> [[TMP5]] to <4 x half> -// CHECK:   [[TMP13:%.*]] = bitcast <8 x i8> [[TMP7]] to <4 x half> -// CHECK:   [[TMP14:%.*]] = bitcast <8 x i8> [[TMP9]] to <4 x half> -// CHECK:   [[TMP15:%.*]] = bitcast <8 x i8> [[TMP11]] to <4 x half> -// CHECK:   call void @llvm.arm.neon.vst4lane.p0i8.v4f16(i8* [[TMP3]], <4 x half> [[TMP12]], <4 x half> [[TMP13]], <4 x half> [[TMP14]], <4 x half> [[TMP15]], i32 3, i32 2) +// CHECK:   [[TMP12:%.*]] = bitcast <8 x i8> [[TMP5]] to <4 x i16> +// CHECK:   [[TMP13:%.*]] = bitcast <8 x i8> [[TMP7]] to <4 x i16> +// CHECK:   [[TMP14:%.*]] = bitcast <8 x i8> [[TMP9]] to <4 x i16> +// CHECK:   [[TMP15:%.*]] = bitcast <8 x i8> [[TMP11]] to <4 x i16> +// CHECK:   call void @llvm.arm.neon.vst4lane.p0i8.v4i16(i8* [[TMP3]], <4 x i16> [[TMP12]], <4 x i16> [[TMP13]], <4 x i16> [[TMP14]], <4 x i16> [[TMP15]], i32 3, i32 2)  // CHECK:   ret void  void test_vst4_lane_f16(float16_t * a, float16x4x4_t b) {    vst4_lane_f16(a, b, 3); diff --git a/test/CodeGen/bitscan-builtins.c b/test/CodeGen/bitscan-builtins.c index 71e49845f896..5fd3f13fbc73 100644 --- a/test/CodeGen/bitscan-builtins.c +++ b/test/CodeGen/bitscan-builtins.c @@ -1,5 +1,8 @@  // RUN: %clang_cc1 -ffreestanding -triple x86_64-unknown-unknown -emit-llvm -o - %s | FileCheck %s +// PR33722 +// RUN: %clang_cc1 -ffreestanding -triple x86_64-unknown-unknown -D_MSC_VER -emit-llvm -o - %s | FileCheck %s +  #include <immintrin.h>  int test_bit_scan_forward(int a) { diff --git a/test/CodeGen/default-address-space.c b/test/CodeGen/default-address-space.c index fc5f55ffd6f4..b7f40585b267 100644 --- a/test/CodeGen/default-address-space.c +++ b/test/CodeGen/default-address-space.c @@ -1,24 +1,24 @@  // RUN: %clang_cc1 -triple amdgcn -emit-llvm < %s | FileCheck -check-prefixes=PIZ,COM %s  // RUN: %clang_cc1 -triple amdgcn---amdgiz -emit-llvm < %s | FileCheck -check-prefixes=CHECK,COM %s -// PIZ-DAG: @foo = common addrspace(4) global i32 0 -// CHECK-DAG: @foo = common global i32 0 +// PIZ-DAG: @foo = common addrspace(1) global i32 0 +// CHECK-DAG: @foo = common addrspace(1) global i32 0  int foo; -// PIZ-DAG: @ban = common addrspace(4) global [10 x i32] zeroinitializer -// CHECK-DAG: @ban = common global [10 x i32] zeroinitializer +// PIZ-DAG: @ban = common addrspace(1) global [10 x i32] zeroinitializer +// CHECK-DAG: @ban = common addrspace(1) global [10 x i32] zeroinitializer  int ban[10]; -// PIZ-DAG: @A = common addrspace(4) global i32 addrspace(4)* null -// PIZ-DAG: @B = common addrspace(4) global i32 addrspace(4)* null -// CHECK-DAG: @A = common global i32* null -// CHECK-DAG: @B = common global i32* null +// PIZ-DAG: @A = common addrspace(1) global i32 addrspace(4)* null +// PIZ-DAG: @B = common addrspace(1) global i32 addrspace(4)* null +// CHECK-DAG: @A = common addrspace(1) global i32* null +// CHECK-DAG: @B = common addrspace(1) global i32* null  int *A;  int *B;  // COM-LABEL: define i32 @test1() -// PIZ: load i32, i32 addrspace(4)* @foo -// CHECK: load i32, i32* @foo +// PIZ: load i32, i32 addrspace(4)* addrspacecast{{[^@]+}} @foo +// CHECK: load i32, i32* addrspacecast{{[^@]+}} @foo  int test1() { return foo; }  // COM-LABEL: define i32 @test2(i32 %i) @@ -30,13 +30,13 @@ int test1() { return foo; }  int test2(int i) { return ban[i]; }  // COM-LABEL: define void @test3() -// PIZ: load i32 addrspace(4)*, i32 addrspace(4)* addrspace(4)* @B +// PIZ: load i32 addrspace(4)*, i32 addrspace(4)* addrspace(4)* addrspacecast{{[^@]+}} @B  // PIZ: load i32, i32 addrspace(4)* -// PIZ: load i32 addrspace(4)*, i32 addrspace(4)* addrspace(4)* @A +// PIZ: load i32 addrspace(4)*, i32 addrspace(4)* addrspace(4)* addrspacecast{{[^@]+}} @A  // PIZ: store i32 {{.*}}, i32 addrspace(4)* -// CHECK: load i32*, i32** @B +// CHECK: load i32*, i32** addrspacecast{{.*}} @B  // CHECK: load i32, i32* -// CHECK: load i32*, i32** @A +// CHECK: load i32*, i32** addrspacecast{{.*}} @A  // CHECK: store i32 {{.*}}, i32*  void test3() {    *A = *B; @@ -50,7 +50,7 @@ void test3() {  // PIZ: %[[arrayidx:.*]] = getelementptr inbounds i32, i32 addrspace(4)* %[[r0]]  // PIZ: store i32 0, i32 addrspace(4)* %[[arrayidx]]  // CHECK-LABEL: define void @test4(i32* %a) -// CHECK: %[[alloca:.*]] = alloca i32*, align 4, addrspace(5) +// CHECK: %[[alloca:.*]] = alloca i32*, align 8, addrspace(5)  // CHECK: %[[a_addr:.*]] = addrspacecast{{.*}} %[[alloca]] to i32**  // CHECK: store i32* %a, i32** %[[a_addr]]  // CHECK: %[[r0:.*]] = load i32*, i32** %[[a_addr]] diff --git a/test/CodeGen/mcount.c b/test/CodeGen/mcount.c index 2839d8ef6af3..2284acac0f8e 100644 --- a/test/CodeGen/mcount.c +++ b/test/CodeGen/mcount.c @@ -8,6 +8,10 @@  // RUN: %clang_cc1 -pg -triple arm-netbsd-eabi -emit-llvm -o - %s | FileCheck -check-prefixes=CHECK-PREFIXED,NO-MCOUNT1 %s  // RUN: %clang_cc1 -pg -triple aarch64-netbsd -emit-llvm -o - %s | FileCheck -check-prefixes=CHECK-PREFIXED,NO-MCOUNT1 %s  // RUN: %clang_cc1 -pg -triple mips-netbsd -emit-llvm -o - %s | FileCheck -check-prefixes=CHECK-PREFIXED,NO-MCOUNT1 %s +// RUN: %clang_cc1 -pg -triple mips-unknown-gnu-linux -emit-llvm -o - %s | FileCheck -check-prefixes=CHECK-PREFIXED,NO-MCOUNT1 %s +// RUN: %clang_cc1 -pg -triple mipsel-unknown-gnu-linux -emit-llvm -o - %s | FileCheck -check-prefixes=CHECK-PREFIXED,NO-MCOUNT1 %s +// RUN: %clang_cc1 -pg -triple mips64-unknown-gnu-linux -emit-llvm -o - %s | FileCheck -check-prefixes=CHECK-PREFIXED,NO-MCOUNT1 %s +// RUN: %clang_cc1 -pg -triple mips64el-unknown-gnu-linux -emit-llvm -o - %s | FileCheck -check-prefixes=CHECK-PREFIXED,NO-MCOUNT1 %s  // RUN: %clang_cc1 -pg -triple powerpc-netbsd -emit-llvm -o - %s | FileCheck -check-prefixes=CHECK-PREFIXED,NO-MCOUNT1 %s  // RUN: %clang_cc1 -pg -triple powerpc64-netbsd -emit-llvm -o - %s | FileCheck -check-prefixes=CHECK-PREFIXED,NO-MCOUNT1 %s  // RUN: %clang_cc1 -pg -triple powerpc64le-netbsd -emit-llvm -o - %s | FileCheck -check-prefixes=CHECK-PREFIXED,NO-MCOUNT1 %s diff --git a/test/CodeGen/ms-barriers-intrinsics.c b/test/CodeGen/ms-barriers-intrinsics.c index b0dfc3042a6e..c7da50cd0d83 100644 --- a/test/CodeGen/ms-barriers-intrinsics.c +++ b/test/CodeGen/ms-barriers-intrinsics.c @@ -13,19 +13,19 @@ typedef __SIZE_TYPE__ size_t;  void test_ReadWriteBarrier() { _ReadWriteBarrier(); }  // CHECK-LABEL: define void @test_ReadWriteBarrier -// CHECK:   fence singlethread seq_cst +// CHECK:   fence syncscope("singlethread") seq_cst  // CHECK:   ret void  // CHECK: }  void test_ReadBarrier() { _ReadBarrier(); }  // CHECK-LABEL: define void @test_ReadBarrier -// CHECK:   fence singlethread seq_cst +// CHECK:   fence syncscope("singlethread") seq_cst  // CHECK:   ret void  // CHECK: }  void test_WriteBarrier() { _WriteBarrier(); }  // CHECK-LABEL: define void @test_WriteBarrier -// CHECK:   fence singlethread seq_cst +// CHECK:   fence syncscope("singlethread") seq_cst  // CHECK:   ret void  // CHECK: } diff --git a/test/CodeGen/no-devirt.cpp b/test/CodeGen/no-devirt.cpp index 4333b7cde7c6..544b1394f421 100644 --- a/test/CodeGen/no-devirt.cpp +++ b/test/CodeGen/no-devirt.cpp @@ -21,7 +21,7 @@ public:  struct Wrapper {    TmplWithArray<bool, 10> data;    bool indexIt(int a) { -    if (a > 6) return data[a] ;      // Should not devirtualize +    if (a > 6) return data[a] ;      // Should devirtualize      if (a > 4) return data.func1(a); // Should devirtualize      return data.func2(a);            // Should devirtualize    } @@ -53,7 +53,7 @@ bool stuff(int p)  }  #endif -// CHECK-NOT: call {{.*}} @_ZN13TmplWithArrayIbLi10EEixEi +// CHECK-DAG: call {{.*}} @_ZN13TmplWithArrayIbLi10EEixEi  // CHECK-DAG: call {{.*}} @_ZN13TmplWithArrayIbLi10EE5func1Ei  // CHECK-DAG: call {{.*}} @_ZN13TmplWithArrayIbLi10EE5func2Ei diff --git a/test/CodeGen/pgo-sample-thinlto-summary.c b/test/CodeGen/pgo-sample-thinlto-summary.c index 51c8faa6be6d..7045db08f22e 100644 --- a/test/CodeGen/pgo-sample-thinlto-summary.c +++ b/test/CodeGen/pgo-sample-thinlto-summary.c @@ -1,9 +1,7 @@  // RUN: %clang_cc1 -O2 -fprofile-sample-use=%S/Inputs/pgo-sample-thinlto-summary.prof %s -emit-llvm -o - 2>&1 | FileCheck %s -check-prefix=SAMPLEPGO  // RUN: %clang_cc1 -O2 -fprofile-sample-use=%S/Inputs/pgo-sample-thinlto-summary.prof %s -emit-llvm -flto=thin -o - 2>&1 | FileCheck %s -check-prefix=THINLTO  // RUN: %clang_cc1 -O2 -fexperimental-new-pass-manager -fprofile-sample-use=%S/Inputs/pgo-sample-thinlto-summary.prof %s -emit-llvm -o - 2>&1 | FileCheck %s -check-prefix=SAMPLEPGO -// FIXME: Run the following command once LTOPreLinkDefaultPipeline is -//        customized. -// %clang_cc1 -O2 -fexperimental-new-pass-manager -fprofile-sample-use=%S/Inputs/pgo-sample-thinlto-summary.prof %s -emit-llvm -flto=thin -o - 2>&1 | FileCheck %s -check-prefix=THINLTO +// RUN: %clang_cc1 -O2 -fexperimental-new-pass-manager -fprofile-sample-use=%S/Inputs/pgo-sample-thinlto-summary.prof %s -emit-llvm -flto=thin -o - 2>&1 | FileCheck %s -check-prefix=THINLTO  // Checks if hot call is inlined by normal compile, but not inlined by  // thinlto compile. diff --git a/test/CodeGenCXX/amdgcn-automatic-variable.cpp b/test/CodeGenCXX/amdgcn-automatic-variable.cpp index 7df27c28e6d2..a82275206c6d 100644 --- a/test/CodeGenCXX/amdgcn-automatic-variable.cpp +++ b/test/CodeGenCXX/amdgcn-automatic-variable.cpp @@ -15,8 +15,8 @@ void func2(void) {    // CHECK: %lv1 = alloca i32, align 4, addrspace(5)    // CHECK: %lv2 = alloca i32, align 4, addrspace(5)    // CHECK: %la = alloca [100 x i32], align 4, addrspace(5) -  // CHECK: %lp1 = alloca i32*, align 4, addrspace(5) -  // CHECK: %lp2 = alloca i32*, align 4, addrspace(5) +  // CHECK: %lp1 = alloca i32*, align 8, addrspace(5) +  // CHECK: %lp2 = alloca i32*, align 8, addrspace(5)    // CHECK: %lvc = alloca i32, align 4, addrspace(5)    // CHECK: %[[r0:.*]] = addrspacecast i32 addrspace(5)* %lv1 to i32* @@ -34,12 +34,12 @@ void func2(void) {    la[0] = 3;    // CHECK: %[[r3:.*]] = addrspacecast i32* addrspace(5)* %lp1 to i32** -  // CHECK: store i32* %[[r0]], i32** %[[r3]], align 4 +  // CHECK: store i32* %[[r0]], i32** %[[r3]], align 8    int *lp1 = &lv1;    // CHECK: %[[r4:.*]] = addrspacecast i32* addrspace(5)* %lp2 to i32**    // CHECK: %[[arraydecay:.*]] = getelementptr inbounds [100 x i32], [100 x i32]* %[[r2]], i32 0, i32 0 -  // CHECK: store i32* %[[arraydecay]], i32** %[[r4]], align 4 +  // CHECK: store i32* %[[arraydecay]], i32** %[[r4]], align 8    int *lp2 = la;    // CHECK: call void @_Z5func1Pi(i32* %[[r0]]) @@ -80,3 +80,5 @@ void func4(int x) {    // CHECK: call void @_Z5func1Pi(i32* %[[r0]])    func1(&x);  } + +// CHECK-NOT: !opencl.ocl.version diff --git a/test/CodeGenCXX/cxx0x-initializer-stdinitializerlist.cpp b/test/CodeGenCXX/cxx0x-initializer-stdinitializerlist.cpp index 7bab11488ad4..67215ef48fb3 100644 --- a/test/CodeGenCXX/cxx0x-initializer-stdinitializerlist.cpp +++ b/test/CodeGenCXX/cxx0x-initializer-stdinitializerlist.cpp @@ -1,4 +1,5 @@ -// RUN: %clang_cc1 -std=c++11 -triple x86_64-none-linux-gnu -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -std=c++11 -triple x86_64-none-linux-gnu -emit-llvm -o - %s | FileCheck -check-prefixes=X86,CHECK %s +// RUN: %clang_cc1 -std=c++11 -triple amdgcn-amd-amdhsa-amdgiz -DNO_TLS -emit-llvm -o - %s | FileCheck -check-prefixes=AMD,CHECK %s  namespace std {    typedef decltype(sizeof(int)) size_t; @@ -46,54 +47,72 @@ struct wantslist1 {    wantslist1(std::initializer_list<destroyme1>);    ~wantslist1();  }; - -// CHECK: @_ZGR15globalInitList1_ = internal constant [3 x i32] [i32 1, i32 2, i32 3] -// CHECK: @globalInitList1 = global %{{[^ ]+}} { i32* getelementptr inbounds ([3 x i32], [3 x i32]* @_ZGR15globalInitList1_, i32 0, i32 0), i{{32|64}} 3 } +// X86: @_ZGR15globalInitList1_ = internal constant [3 x i32] [i32 1, i32 2, i32 3] +// X86: @globalInitList1 = global %{{[^ ]+}} { i32* getelementptr inbounds ([3 x i32], [3 x i32]* @_ZGR15globalInitList1_, i32 0, i32 0), i{{32|64}} 3 } +// AMD: @_ZGR15globalInitList1_ = internal addrspace(1) constant [3 x i32] [i32 1, i32 2, i32 3] +// AMD: @globalInitList1 = addrspace(1) global %{{[^ ]+}} { i32* addrspacecast (i32 addrspace(1)* getelementptr inbounds ([3 x i32], [3 x i32] addrspace(1)* @_ZGR15globalInitList1_, i32 0, i32 0) to i32*), i{{32|64}} 3 }  std::initializer_list<int> globalInitList1 = {1, 2, 3}; +#ifndef NO_TLS  namespace thread_local_global_array { -  // FIXME: We should be able to constant-evaluate this even though the -  // initializer is not a constant expression (pointers to thread_local -  // objects aren't really a problem). -  // -  // CHECK: @_ZN25thread_local_global_array1xE = thread_local global -  // CHECK: @_ZGRN25thread_local_global_array1xE_ = internal thread_local constant [4 x i32] [i32 1, i32 2, i32 3, i32 4] -  std::initializer_list<int> thread_local x = { 1, 2, 3, 4 }; +// FIXME: We should be able to constant-evaluate this even though the +// initializer is not a constant expression (pointers to thread_local +// objects aren't really a problem). +// +// X86: @_ZN25thread_local_global_array1xE = thread_local global +// X86: @_ZGRN25thread_local_global_array1xE_ = internal thread_local constant [4 x i32] [i32 1, i32 2, i32 3, i32 4] +std::initializer_list<int> thread_local x = {1, 2, 3, 4};  } - -// CHECK: @globalInitList2 = global %{{[^ ]+}} zeroinitializer -// CHECK: @_ZGR15globalInitList2_ = internal global [2 x %[[WITHARG:[^ ]*]]] zeroinitializer - -// CHECK: @_ZN15partly_constant1kE = global i32 0, align 4 -// CHECK: @_ZN15partly_constant2ilE = global {{.*}} null, align 8 -// CHECK: @[[PARTLY_CONSTANT_OUTER:_ZGRN15partly_constant2ilE.*]] = internal global {{.*}} zeroinitializer, align 8 -// CHECK: @[[PARTLY_CONSTANT_INNER:_ZGRN15partly_constant2ilE.*]] = internal global [3 x {{.*}}] zeroinitializer, align 8 -// CHECK: @[[PARTLY_CONSTANT_FIRST:_ZGRN15partly_constant2ilE.*]] = internal constant [3 x i32] [i32 1, i32 2, i32 3], align 4 -// CHECK: @[[PARTLY_CONSTANT_SECOND:_ZGRN15partly_constant2ilE.*]] = internal global [2 x i32] zeroinitializer, align 4 -// CHECK: @[[PARTLY_CONSTANT_THIRD:_ZGRN15partly_constant2ilE.*]] = internal constant [4 x i32] [i32 5, i32 6, i32 7, i32 8], align 4 - -// CHECK: @[[REFTMP1:.*]] = private constant [2 x i32] [i32 42, i32 43], align 4 -// CHECK: @[[REFTMP2:.*]] = private constant [3 x %{{.*}}] [%{{.*}} { i32 1 }, %{{.*}} { i32 2 }, %{{.*}} { i32 3 }], align 4 +#endif + +// X86: @globalInitList2 = global %{{[^ ]+}} zeroinitializer +// X86: @_ZGR15globalInitList2_ = internal global [2 x %[[WITHARG:[^ ]*]]] zeroinitializer +// AMD: @globalInitList2 = addrspace(1) global %{{[^ ]+}} zeroinitializer +// AMD: @_ZGR15globalInitList2_ = internal addrspace(1) global [2 x %[[WITHARG:[^ ]*]]] zeroinitializer + +// X86: @_ZN15partly_constant1kE = global i32 0, align 4 +// X86: @_ZN15partly_constant2ilE = global {{.*}} null, align 8 +// X86: @[[PARTLY_CONSTANT_OUTER:_ZGRN15partly_constant2ilE.*]] = internal global {{.*}} zeroinitializer, align 8 +// X86: @[[PARTLY_CONSTANT_INNER:_ZGRN15partly_constant2ilE.*]] = internal global [3 x {{.*}}] zeroinitializer, align 8 +// X86: @[[PARTLY_CONSTANT_FIRST:_ZGRN15partly_constant2ilE.*]] = internal constant [3 x i32] [i32 1, i32 2, i32 3], align 4 +// X86: @[[PARTLY_CONSTANT_SECOND:_ZGRN15partly_constant2ilE.*]] = internal global [2 x i32] zeroinitializer, align 4 +// X86: @[[PARTLY_CONSTANT_THIRD:_ZGRN15partly_constant2ilE.*]] = internal constant [4 x i32] [i32 5, i32 6, i32 7, i32 8], align 4 +// AMD: @_ZN15partly_constant1kE = addrspace(1) global i32 0, align 4 +// AMD: @_ZN15partly_constant2ilE = addrspace(2) global {{.*}} null, align 8 +// AMD: @[[PARTLY_CONSTANT_OUTER:_ZGRN15partly_constant2ilE.*]] = internal addrspace(2) global {{.*}} zeroinitializer, align 8 +// AMD: @[[PARTLY_CONSTANT_INNER:_ZGRN15partly_constant2ilE.*]] = internal addrspace(2) global [3 x {{.*}}] zeroinitializer, align 8 +// AMD: @[[PARTLY_CONSTANT_FIRST:_ZGRN15partly_constant2ilE.*]] = internal addrspace(2) constant [3 x i32] [i32 1, i32 2, i32 3], align 4 +// AMD: @[[PARTLY_CONSTANT_SECOND:_ZGRN15partly_constant2ilE.*]] = internal addrspace(2) global [2 x i32] zeroinitializer, align 4 +// AMD: @[[PARTLY_CONSTANT_THIRD:_ZGRN15partly_constant2ilE.*]] = internal addrspace(2) constant [4 x i32] [i32 5, i32 6, i32 7, i32 8], align 4 + +// X86: @[[REFTMP1:.*]] = private constant [2 x i32] [i32 42, i32 43], align 4 +// X86: @[[REFTMP2:.*]] = private constant [3 x %{{.*}}] [%{{.*}} { i32 1 }, %{{.*}} { i32 2 }, %{{.*}} { i32 3 }], align 4 +// AMD: @[[REFTMP1:.*]] = private addrspace(2) constant [2 x i32] [i32 42, i32 43], align 4 +// AMD: @[[REFTMP2:.*]] = private addrspace(2) constant [3 x %{{.*}}] [%{{.*}} { i32 1 }, %{{.*}} { i32 2 }, %{{.*}} { i32 3 }], align 4  // CHECK: appending global -  // thread_local initializer: -// CHECK-LABEL: define internal void -// CHECK: store i32* getelementptr inbounds ([4 x i32], [4 x i32]* @_ZGRN25thread_local_global_array1xE_, i64 0, i64 0), -// CHECK:       i32** getelementptr inbounds ({{.*}}, {{.*}}* @_ZN25thread_local_global_array1xE, i32 0, i32 0), align 8 -// CHECK: store i64 4, i64* getelementptr inbounds ({{.*}}, {{.*}}* @_ZN25thread_local_global_array1xE, i32 0, i32 1), align 8 - - -// CHECK-LABEL: define internal void -// CHECK: call void @_ZN8witharg1C1ERK10destroyme1(%[[WITHARG]]* getelementptr inbounds ([2 x %[[WITHARG]]], [2 x %[[WITHARG]]]* @_ZGR15globalInitList2_, i{{32|64}} 0, i{{32|64}} 0 -// CHECK: call void @_ZN8witharg1C1ERK10destroyme1(%[[WITHARG]]* getelementptr inbounds ([2 x %[[WITHARG]]], [2 x %[[WITHARG]]]* @_ZGR15globalInitList2_, i{{32|64}} 0, i{{32|64}} 1 -// CHECK: __cxa_atexit -// CHECK: store %[[WITHARG]]* getelementptr inbounds ([2 x %[[WITHARG]]], [2 x %[[WITHARG]]]* @_ZGR15globalInitList2_, i64 0, i64 0), -// CHECK:       %[[WITHARG]]** getelementptr inbounds (%{{.*}}, %{{.*}}* @globalInitList2, i32 0, i32 0), align 8 -// CHECK: store i64 2, i64* getelementptr inbounds (%{{.*}}, %{{.*}}* @globalInitList2, i32 0, i32 1), align 8 -// CHECK: call void @_ZN10destroyme1D1Ev +// X86-LABEL: define internal void @__cxx_global_var_init +// X86: store i32* getelementptr inbounds ([4 x i32], [4 x i32]* @_ZGRN25thread_local_global_array1xE_, i64 0, i64 0), +// X86:       i32** getelementptr inbounds ({{.*}}, {{.*}}* @_ZN25thread_local_global_array1xE, i32 0, i32 0), align 8 +// X86: store i64 4, i64* getelementptr inbounds ({{.*}}, {{.*}}* @_ZN25thread_local_global_array1xE, i32 0, i32 1), align 8 + +// CHECK-LABEL: define internal void @__cxx_global_var_init +// X86: call void @_ZN8witharg1C1ERK10destroyme1(%[[WITHARG]]* getelementptr inbounds ([2 x %[[WITHARG]]], [2 x %[[WITHARG]]]* @_ZGR15globalInitList2_, i{{32|64}} 0, i{{32|64}} 0 +// X86: call void @_ZN8witharg1C1ERK10destroyme1(%[[WITHARG]]* getelementptr inbounds ([2 x %[[WITHARG]]], [2 x %[[WITHARG]]]* @_ZGR15globalInitList2_, i{{32|64}} 0, i{{32|64}} 1 +// AMD: call void @_ZN8witharg1C1ERK10destroyme1(%[[WITHARG]]* getelementptr inbounds ([2 x %[[WITHARG]]], [2 x %[[WITHARG]]]* addrspacecast ({{[^@]+}} @_ZGR15globalInitList2_ {{[^)]+}}), i{{32|64}} 0, i{{32|64}} 0 +// AMD: call void @_ZN8witharg1C1ERK10destroyme1(%[[WITHARG]]* getelementptr inbounds ([2 x %[[WITHARG]]], [2 x %[[WITHARG]]]* addrspacecast ({{[^@]+}} @_ZGR15globalInitList2_ {{[^)]+}}), i{{32|64}} 0, i{{32|64}} 1 +// CHECK: call i32 @__cxa_atexit +// X86: store %[[WITHARG]]* getelementptr inbounds ([2 x %[[WITHARG]]], [2 x %[[WITHARG]]]* @_ZGR15globalInitList2_, i64 0, i64 0), +// X86:       %[[WITHARG]]** getelementptr inbounds (%{{.*}}, %{{.*}}* @globalInitList2, i32 0, i32 0), align 8 +// X86: store i64 2, i64* getelementptr inbounds (%{{.*}}, %{{.*}}* @globalInitList2, i32 0, i32 1), align 8 +// AMD: store %[[WITHARG]]* getelementptr inbounds ([2 x %[[WITHARG]]], [2 x %[[WITHARG]]]* addrspacecast ({{[^@]+}} @_ZGR15globalInitList2_ {{[^)]+}}), i64 0, i64 0), +// AMD:       %[[WITHARG]]** getelementptr inbounds (%{{.*}}, %{{.*}}* addrspacecast ({{[^@]+}} @globalInitList2 {{[^)]+}}), i32 0, i32 0), align 8 +// AMD: store i64 2, i64* getelementptr inbounds (%{{.*}}, %{{.*}}* addrspacecast ({{[^@]+}} @globalInitList2 {{[^)]+}}), i32 0, i32 1), align 8  // CHECK: call void @_ZN10destroyme1D1Ev +// CHECK-NEXT: call void @_ZN10destroyme1D1Ev +// CHECK-NEXT: ret void  std::initializer_list<witharg1> globalInitList2 = {    witharg1(destroyme1()), witharg1(destroyme1())  }; @@ -101,7 +120,9 @@ std::initializer_list<witharg1> globalInitList2 = {  void fn1(int i) {    // CHECK-LABEL: define void @_Z3fn1i    // temporary array -  // CHECK: [[array:%[^ ]+]] = alloca [3 x i32] +  // X86: [[array:%[^ ]+]] = alloca [3 x i32] +  // AMD: [[alloca:%[^ ]+]] = alloca [3 x i32], align 4, addrspace(5) +  // AMD: [[array:%[^ ]+]] = addrspacecast [3 x i32] addrspace(5)* [[alloca]] to [3 x i32]*    // CHECK: getelementptr inbounds [3 x i32], [3 x i32]* [[array]], i{{32|64}} 0    // CHECK-NEXT: store i32 1, i32*    // CHECK-NEXT: getelementptr @@ -175,7 +196,6 @@ void fn6() {    destroyme2 dm2;    // CHECK: call void @_ZN10destroyme2D1Ev  } -  void fn7() {    // CHECK-LABEL: define void @_Z3fn7v    // temps should be destroyed before dm2 @@ -366,37 +386,36 @@ namespace partly_constant {    std::initializer_list<std::initializer_list<int>> &&il = { { 1, 2, 3 }, { 4, k }, { 5, 6, 7, 8 } };    // First init list.    // CHECK-NOT: @[[PARTLY_CONSTANT_FIRST]], -  // CHECK: store i32* getelementptr inbounds ({{.*}}, {{.*}}* @[[PARTLY_CONSTANT_FIRST]], i64 0, i64 0), -  // CHECK:       i32** getelementptr inbounds ({{.*}}, {{.*}}* @[[PARTLY_CONSTANT_INNER]], i64 0, i64 0, i32 0) -  // CHECK: store i64 3, i64* getelementptr inbounds ({{.*}}, {{.*}}* @[[PARTLY_CONSTANT_INNER]], i64 0, i64 0, i32 1) +  // CHECK: store i32* getelementptr inbounds ({{.*}}, {{.*}}* {{.*}}@[[PARTLY_CONSTANT_FIRST]]{{.*}}, i64 0, i64 0), +  // CHECK:       i32** getelementptr inbounds ({{.*}}, {{.*}}* {{.*}}@[[PARTLY_CONSTANT_INNER]]{{.*}}, i64 0, i64 0, i32 0) +  // CHECK: store i64 3, i64* getelementptr inbounds ({{.*}}, {{.*}}* {{.*}}@[[PARTLY_CONSTANT_INNER]]{{.*}}, i64 0, i64 0, i32 1)    // CHECK-NOT: @[[PARTLY_CONSTANT_FIRST]],    //    // Second init list array (non-constant). -  // CHECK: store i32 4, i32* getelementptr inbounds ({{.*}}, {{.*}}* @[[PARTLY_CONSTANT_SECOND]], i64 0, i64 0) -  // CHECK: load i32, i32* @_ZN15partly_constant1kE -  // CHECK: store i32 {{.*}}, i32* getelementptr inbounds ({{.*}}, {{.*}}* @[[PARTLY_CONSTANT_SECOND]], i64 0, i64 1) +  // CHECK: store i32 4, i32* getelementptr inbounds ({{.*}}, {{.*}}* {{.*}}@[[PARTLY_CONSTANT_SECOND]]{{.*}}, i64 0, i64 0) +  // CHECK: load i32, i32* {{.*}}@_ZN15partly_constant1kE +  // CHECK: store i32 {{.*}}, i32* getelementptr inbounds ({{.*}}, {{.*}}* {{.*}}@[[PARTLY_CONSTANT_SECOND]]{{.*}}, i64 0, i64 1)    //    // Second init list. -  // CHECK: store i32* getelementptr inbounds ({{.*}}, {{.*}}* @[[PARTLY_CONSTANT_SECOND]], i64 0, i64 0), -  // CHECK:       i32** getelementptr inbounds ({{.*}}, {{.*}}* @[[PARTLY_CONSTANT_INNER]], i64 0, i64 1, i32 0) -  // CHECK: store i64 2, i64* getelementptr inbounds ({{.*}}, {{.*}}* @[[PARTLY_CONSTANT_INNER]], i64 0, i64 1, i32 1) +  // CHECK: store i32* getelementptr inbounds ({{.*}}, {{.*}}* {{.*}}@[[PARTLY_CONSTANT_SECOND]]{{.*}}, i64 0, i64 0), +  // CHECK:       i32** getelementptr inbounds ({{.*}}, {{.*}}* {{.*}}@[[PARTLY_CONSTANT_INNER]]{{.*}}, i64 0, i64 1, i32 0) +  // CHECK: store i64 2, i64* getelementptr inbounds ({{.*}}, {{.*}}* {{.*}}@[[PARTLY_CONSTANT_INNER]]{{.*}}, i64 0, i64 1, i32 1)    //    // Third init list.    // CHECK-NOT: @[[PARTLY_CONSTANT_THIRD]], -  // CHECK: store i32* getelementptr inbounds ({{.*}}, {{.*}}* @[[PARTLY_CONSTANT_THIRD]], i64 0, i64 0), -  // CHECK:       i32** getelementptr inbounds ({{.*}}, {{.*}}* @[[PARTLY_CONSTANT_INNER]], i64 0, i64 2, i32 0) -  // CHECK: store i64 4, i64* getelementptr inbounds ({{.*}}, {{.*}}* @_ZGRN15partly_constant2ilE4_, i64 0, i64 2, i32 1) +  // CHECK: store i32* getelementptr inbounds ({{.*}}, {{.*}}* {{.*}}@[[PARTLY_CONSTANT_THIRD]]{{.*}}, i64 0, i64 0), +  // CHECK:       i32** getelementptr inbounds ({{.*}}, {{.*}}* {{.*}}@[[PARTLY_CONSTANT_INNER]]{{.*}}, i64 0, i64 2, i32 0) +  // CHECK: store i64 4, i64* getelementptr inbounds ({{.*}}, {{.*}}* {{.*}}@_ZGRN15partly_constant2ilE4_{{.*}}, i64 0, i64 2, i32 1)    // CHECK-NOT: @[[PARTLY_CONSTANT_THIRD]],    //    // Outer init list. -  // CHECK: store {{.*}}* getelementptr inbounds ({{.*}}, {{.*}}* @[[PARTLY_CONSTANT_INNER]], i64 0, i64 0), -  // CHECK:       {{.*}}** getelementptr inbounds ({{.*}}, {{.*}}* @[[PARTLY_CONSTANT_OUTER]], i32 0, i32 0) -  // CHECK: store i64 3, i64* getelementptr inbounds ({{.*}}, {{.*}}* @[[PARTLY_CONSTANT_OUTER]], i32 0, i32 1) +  // CHECK: store {{.*}}* getelementptr inbounds ({{.*}}, {{.*}}* {{.*}}@[[PARTLY_CONSTANT_INNER]]{{.*}}, i64 0, i64 0), +  // CHECK:       {{.*}}** getelementptr inbounds ({{.*}}, {{.*}}* {{.*}}@[[PARTLY_CONSTANT_OUTER]]{{.*}}, i32 0, i32 0) +  // CHECK: store i64 3, i64* getelementptr inbounds ({{.*}}, {{.*}}* {{.*}}@[[PARTLY_CONSTANT_OUTER]]{{.*}}, i32 0, i32 1)    //    // 'il' reference. -  // CHECK: store {{.*}}* @[[PARTLY_CONSTANT_OUTER]], {{.*}}** @_ZN15partly_constant2ilE, align 8 +  // CHECK: store {{.*}}* {{.*}}@[[PARTLY_CONSTANT_OUTER]]{{.*}}, {{.*}}** {{.*}}@_ZN15partly_constant2ilE{{.*}}, align 8  } -  namespace nested {    struct A { A(); ~A(); };    struct B { const A &a; ~B(); }; @@ -463,7 +482,7 @@ namespace PR20445 {    template<int x> void f() { new MyClass({42, 43}); }    template void f<0>();    // CHECK-LABEL: define {{.*}} @_ZN7PR204451fILi0EEEvv( -  // CHECK: store i32* getelementptr inbounds ([2 x i32], [2 x i32]* @[[REFTMP1]], i64 0, i64 0) +  // CHECK: store i32* getelementptr inbounds ([2 x i32], [2 x i32]* {{.*}}@[[REFTMP1]]{{.*}}, i64 0, i64 0)    // CHECK: call void @_ZN7PR204456vectorC1ESt16initializer_listIiE(    // CHECK: call void @_ZN7PR204457MyClassC1ERKNS_6vectorE(  } @@ -476,9 +495,9 @@ namespace ConstExpr {    };    void f(std::initializer_list<C>);    void g() { -// CHECK-LABEL: _ZN9ConstExpr1gEv -// CHECK: store %"class.ConstExpr::C"* getelementptr inbounds ([3 x %"class.ConstExpr::C"], [3 x %"class.ConstExpr::C"]* @[[REFTMP2]], i64 0, i64 0) -// CHECK: call void @_ZN9ConstExpr1fESt16initializer_listINS_1CEE +    // CHECK-LABEL: _ZN9ConstExpr1gEv +    // CHECK: store %"class.ConstExpr::C"* getelementptr inbounds ([3 x %"class.ConstExpr::C"], [3 x %"class.ConstExpr::C"]* {{.*}}@[[REFTMP2]]{{.*}}, i64 0, i64 0) +    // CHECK: call void @_ZN9ConstExpr1fESt16initializer_listINS_1CEE      f({C(1), C(2), C(3)});    }  } @@ -498,11 +517,13 @@ namespace B19773010 {    void f1() {      // CHECK-LABEL: @_ZN9B197730102f1Ev      testcase a{{"", ENUM_CONSTANT}}; -    // CHECK: store %"struct.B19773010::pair"* getelementptr inbounds ([1 x %"struct.B19773010::pair"], [1 x %"struct.B19773010::pair"]* bitcast ([1 x { i8*, i32 }]* @.ref.tmp{{.*}} to [1 x %"struct.B19773010::pair"]*), i64 0, i64 0), %"struct.B19773010::pair"** %{{.*}}, align 8 +    // X86: store %"struct.B19773010::pair"* getelementptr inbounds ([1 x %"struct.B19773010::pair"], [1 x %"struct.B19773010::pair"]* bitcast ([1 x { i8*, i32 }]* @.ref.tmp{{.*}} to [1 x %"struct.B19773010::pair"]*), i64 0, i64 0), %"struct.B19773010::pair"** %{{.*}}, align 8 +    // AMD: store %"struct.B19773010::pair"* getelementptr inbounds ([1 x %"struct.B19773010::pair"], [1 x %"struct.B19773010::pair"]* addrspacecast{{.*}} bitcast ([1 x { i8*, i32 }] addrspace(2)* @.ref.tmp{{.*}} to [1 x %"struct.B19773010::pair"] addrspace(2)*){{.*}}, i64 0, i64 0), %"struct.B19773010::pair"** %{{.*}}, align 8    }    void f2() {      // CHECK-LABEL: @_ZN9B197730102f2Ev -    // CHECK: store %"struct.B19773010::pair"* getelementptr inbounds ([1 x %"struct.B19773010::pair"], [1 x %"struct.B19773010::pair"]* bitcast ([1 x { i8*, i32 }]* @_ZGRZN9B197730102f2EvE1p_ to [1 x %"struct.B19773010::pair"]*), i64 0, i64 0), %"struct.B19773010::pair"** getelementptr inbounds ([2 x %"class.std::initializer_list.10"], [2 x %"class.std::initializer_list.10"]* @_ZZN9B197730102f2EvE1p, i64 0, i64 1, i32 0), align 16 +    // X86: store %"struct.B19773010::pair"* getelementptr inbounds ([1 x %"struct.B19773010::pair"], [1 x %"struct.B19773010::pair"]* bitcast ([1 x { i8*, i32 }]* @_ZGRZN9B197730102f2EvE1p_ to [1 x %"struct.B19773010::pair"]*), i64 0, i64 0), %"struct.B19773010::pair"** getelementptr inbounds ([2 x %"class.std::initializer_list.10"], [2 x %"class.std::initializer_list.10"]* @_ZZN9B197730102f2EvE1p, i64 0, i64 1, i32 0), align 16 +    // AMD: store %"struct.B19773010::pair"* getelementptr inbounds ([1 x %"struct.B19773010::pair"], [1 x %"struct.B19773010::pair"]* addrspacecast{{.*}} bitcast ([1 x { i8*, i32 }] addrspace(1)* @_ZGRZN9B197730102f2EvE1p_ to [1 x %"struct.B19773010::pair"] addrspace(1)*){{.*}}, i64 0, i64 0), %"struct.B19773010::pair"** getelementptr inbounds ([2 x %"class.std::initializer_list.10"], [2 x %"class.std::initializer_list.10"]* addrspacecast{{.*}}@_ZZN9B197730102f2EvE1p{{.*}}, i64 0, i64 1, i32 0), align 8      static std::initializer_list<pair<const char *, E>> a, p[2] =          {a, {{"", ENUM_CONSTANT}}};    } diff --git a/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp b/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp index b90620ab600f..2ab2f759cfe3 100644 --- a/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp +++ b/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp @@ -241,3 +241,53 @@ namespace Test10 {      return static_cast<A *>(b)->f();    }  } + +namespace Test11 { +  // Check that the definitions of Derived's operators are emitted. + +  // CHECK-LABEL: define linkonce_odr void @_ZN6Test111SIiE4foo1Ev( +  // CHECK: call void @_ZN6Test111SIiE7DerivedclEv( +  // CHECK: call zeroext i1 @_ZN6Test111SIiE7DerivedeqERKNS_4BaseE( +  // CHECK: call zeroext i1 @_ZN6Test111SIiE7DerivedntEv( +  // CHECK: call dereferenceable(4) %"class.Test11::Base"* @_ZN6Test111SIiE7DerivedixEi( +  // CHECK: define linkonce_odr void @_ZN6Test111SIiE7DerivedclEv( +  // CHECK: define linkonce_odr zeroext i1 @_ZN6Test111SIiE7DerivedeqERKNS_4BaseE( +  // CHECK: define linkonce_odr zeroext i1 @_ZN6Test111SIiE7DerivedntEv( +  // CHECK: define linkonce_odr dereferenceable(4) %"class.Test11::Base"* @_ZN6Test111SIiE7DerivedixEi( +  class Base { +  public: +    virtual void operator()() {} +    virtual bool operator==(const Base &other) { return false; } +    virtual bool operator!() { return false; } +    virtual Base &operator[](int i) { return *this; } +  }; + +  template<class T> +  struct S { +    class Derived final : public Base { +    public: +      void operator()() override {} +      bool operator==(const Base &other) override { return true; } +      bool operator!() override { return true; } +      Base &operator[](int i) override { return *this; } +    }; + +    Derived *ptr = nullptr, *ptr2 = nullptr; + +    void foo1() { +      if (ptr && ptr2) { +        // These calls get devirtualized. Linkage fails if the definitions of +        // the called functions are not emitted. +        (*ptr)(); +        (void)(*ptr == *ptr2); +        (void)(!(*ptr)); +        (void)((*ptr)[1]); +      } +    } +  }; + +  void foo2() { +    S<int> *s = new S<int>; +    s->foo1(); +  } +} diff --git a/test/CodeGenCXX/dllimport-memptr-global.cpp b/test/CodeGenCXX/dllimport-memptr-global.cpp new file mode 100644 index 000000000000..e64537b8b9f9 --- /dev/null +++ b/test/CodeGenCXX/dllimport-memptr-global.cpp @@ -0,0 +1,58 @@ +// Also check that -Wglobal-constructors does the right thing. Strictly +// speaking, this is a Sema test, but this avoids test case duplication. +// RUN: %clang_cc1 -Wglobal-constructors %s -verify -triple i686-windows-msvc -fms-extensions -std=c++11 +// +// RUN: %clang_cc1 %s -emit-llvm -o - -triple i686-windows-msvc -fms-extensions -std=c++11 | FileCheck %s + +struct __declspec(dllimport) Single { +  void nonvirt(); +  virtual void virt(); +}; + +struct A { int a; }; +struct B { int b; }; +struct __declspec(dllimport) Multi : A, B { +  void nonvirt(); +  virtual void virt(); +}; + +struct __declspec(dllimport) Virtual : virtual A { +  void nonvirt(); +  virtual void virt(); +}; + +struct General; +static_assert(sizeof(void (General::*)()) == 16, "force general memptr model"); +struct __declspec(dllimport) General { +  void nonvirt(); +  virtual void virt(); +}; + +auto mp_single_nv = &Single::nonvirt; // expected-warning {{global constructor}} +auto mp_multi_nv = &Multi::nonvirt; // expected-warning {{global constructor}} +auto mp_virtual_nv = &Virtual::nonvirt; // expected-warning {{global constructor}} +auto mp_general_nv = &General::nonvirt; // expected-warning {{global constructor}} + +auto mp_single_v = &Single::virt; +auto mp_multi_v = &Multi::virt; +auto mp_virtual_v = &Virtual::virt; +auto mp_general_v = &General::virt; + +// All of the non-virtual globals need dynamic initializers. + +// CHECK: @"\01?mp_single_nv@@3P8Single@@AEXXZQ1@" = global i8* null, align 4 +// CHECK: @"\01?mp_multi_nv@@3P8Multi@@AEXXZQ1@" = global { i8*, i32 } zeroinitializer, align 4 +// CHECK: @"\01?mp_virtual_nv@@3P8Virtual@@AEXXZQ1@" = global { i8*, i32, i32 } zeroinitializer, align 4 +// CHECK: @"\01?mp_general_nv@@3P8General@@AEXXZQ1@" = global { i8*, i32, i32, i32 } zeroinitializer, align 4 + +// CHECK: @"\01?mp_single_v@@3P8Single@@AEXXZQ1@" = global i8* bitcast (void (%struct.Single*, ...)* @"\01??_9Single@@$BA@AE" to i8*), align 4 +// CHECK: @"\01?mp_multi_v@@3P8Multi@@AEXXZQ1@" = global { i8*, i32 } { i8* bitcast (void (%struct.Multi*, ...)* @"\01??_9Multi@@$BA@AE" to i8*), i32 0 }, align 4 +// CHECK: @"\01?mp_virtual_v@@3P8Virtual@@AEXXZQ1@" = global { i8*, i32, i32 } { i8* bitcast (void (%struct.Virtual*, ...)* @"\01??_9Virtual@@$BA@AE" to i8*), i32 0, i32 0 }, align 4 +// CHECK: @"\01?mp_general_v@@3P8General@@AEXXZQ1@" = global { i8*, i32, i32, i32 } { i8* bitcast (void (%struct.General*, ...)* @"\01??_9General@@$BA@AE" to i8*), i32 0, i32 0, i32 0 }, align 4 + +// CHECK: define internal void @_GLOBAL__sub_I{{.*}}() {{.*}} { +// CHECK:   call void @"\01??__Emp_single_nv@@YAXXZ"() +// CHECK:   call void @"\01??__Emp_multi_nv@@YAXXZ"() +// CHECK:   call void @"\01??__Emp_virtual_nv@@YAXXZ"() +// CHECK:   call void @"\01??__Emp_general_nv@@YAXXZ"() +// CHECK: } diff --git a/test/CodeGenCXX/vtable-available-externally.cpp b/test/CodeGenCXX/vtable-available-externally.cpp index db99f73d9e72..2e2cdbbfeff5 100644 --- a/test/CodeGenCXX/vtable-available-externally.cpp +++ b/test/CodeGenCXX/vtable-available-externally.cpp @@ -275,9 +275,8 @@ struct C {    virtual D& operator=(const D&);  }; -// Cannot emit D's vtable available_externally, because we cannot create -// a reference to the inline virtual D::operator= function. -// CHECK-TEST11: @_ZTVN6Test111DE = external unnamed_addr constant +// Can emit D's vtable available_externally. +// CHECK-TEST11: @_ZTVN6Test111DE = available_externally unnamed_addr constant  struct D : C {    virtual void key();  }; diff --git a/test/CodeGenCXX/windows-itanium-type-info.cpp b/test/CodeGenCXX/windows-itanium-type-info.cpp index ad89318f599e..285b59815da2 100644 --- a/test/CodeGenCXX/windows-itanium-type-info.cpp +++ b/test/CodeGenCXX/windows-itanium-type-info.cpp @@ -32,9 +32,15 @@ void f() {  // CHECK-DAG: @_ZTV7derived = dllexport unnamed_addr constant  // CHECK-DAG: @_ZTI4base = external dllimport constant -// CHECK-DAG: @_ZTS4base = external dllimport constant -// CHECK-NOT: @_ZTV4base = external dllimport constant  // CHECK-EH-IMPORT: @_ZTS4base = linkonce_odr constant  // CHECK-EH-IMPORT: @_ZTI4base = linkonce_odr constant +struct __declspec(dllimport) gatekeeper {}; +struct zuul : gatekeeper { +  virtual ~zuul(); +}; +zuul::~zuul() {} + +// CHECK-DAG: @_ZTI10gatekeeper = linkonce_odr constant +// CHECK-DAG: @_ZTS10gatekeeper = linkonce_odr constant diff --git a/test/CodeGenOpenCL/address-spaces.cl b/test/CodeGenOpenCL/address-spaces.cl index 7c665286547a..488b8f9d480e 100644 --- a/test/CodeGenOpenCL/address-spaces.cl +++ b/test/CodeGenOpenCL/address-spaces.cl @@ -4,6 +4,8 @@  // RUN: %clang_cc1 %s -O0 -triple amdgcn-amd-amdhsa-opencl -DCL20 -cl-std=CL2.0 -emit-llvm -o - | FileCheck %s --check-prefixes=CL20,CL20SPIR  // RUN: %clang_cc1 %s -O0 -triple amdgcn-amd-amdhsa-amdgizcl -emit-llvm -o - | FileCheck %s -check-prefixes=CHECK,GIZ  // RUN: %clang_cc1 %s -O0 -triple amdgcn-amd-amdhsa-amdgizcl -DCL20 -cl-std=CL2.0 -emit-llvm -o - | FileCheck %s --check-prefixes=CL20,CL20GIZ +// RUN: %clang_cc1 %s -O0 -triple amdgcn-mesa-mesa3d -emit-llvm -o - | FileCheck --check-prefixes=CHECK,SPIR %s +// RUN: %clang_cc1 %s -O0 -triple r600-- -emit-llvm -o - | FileCheck --check-prefixes=CHECK,SPIR %s  // SPIR: i32* %arg  // GIZ: i32 addrspace(5)* %arg diff --git a/test/CodeGenOpenCL/amdgcn-automatic-variable.cl b/test/CodeGenOpenCL/amdgcn-automatic-variable.cl index 29309567ec71..19287c7d8998 100644 --- a/test/CodeGenOpenCL/amdgcn-automatic-variable.cl +++ b/test/CodeGenOpenCL/amdgcn-automatic-variable.cl @@ -22,8 +22,8 @@ void func2(void) {    // CHECK: %la = alloca [100 x i32], align 4, addrspace(5)    // CL12: %lp1 = alloca i32 addrspace(5)*, align 4, addrspace(5)    // CL12: %lp2 = alloca i32 addrspace(5)*, align 4, addrspace(5) -  // CL20: %lp1 = alloca i32*, align 4, addrspace(5) -  // CL20: %lp2 = alloca i32*, align 4, addrspace(5) +  // CL20: %lp1 = alloca i32*, align 8, addrspace(5) +  // CL20: %lp2 = alloca i32*, align 8, addrspace(5)    // CHECK: %lvc = alloca i32, align 4, addrspace(5)    // CHECK: store i32 1, i32 addrspace(5)* %lv1 @@ -39,13 +39,13 @@ void func2(void) {    // CL12: store i32 addrspace(5)* %lv1, i32 addrspace(5)* addrspace(5)* %lp1, align 4    // CL20: %[[r0:.*]] = addrspacecast i32 addrspace(5)* %lv1 to i32* -  // CL20: store i32* %[[r0]], i32* addrspace(5)* %lp1, align 4 +  // CL20: store i32* %[[r0]], i32* addrspace(5)* %lp1, align 8    int *lp1 = &lv1;    // CHECK: %[[arraydecay:.*]] = getelementptr inbounds [100 x i32], [100 x i32] addrspace(5)* %la, i32 0, i32 0    // CL12: store i32 addrspace(5)* %[[arraydecay]], i32 addrspace(5)* addrspace(5)* %lp2, align 4    // CL20: %[[r1:.*]] = addrspacecast i32 addrspace(5)* %[[arraydecay]] to i32* -  // CL20: store i32* %[[r1]], i32* addrspace(5)* %lp2, align 4 +  // CL20: store i32* %[[r1]], i32* addrspace(5)* %lp2, align 8    int *lp2 = la;    // CL12: call void @func1(i32 addrspace(5)* %lv1) diff --git a/test/CodeGenOpenCL/amdgpu-nullptr.cl b/test/CodeGenOpenCL/amdgpu-nullptr.cl index 402be5760cf7..69f54fcaa483 100644 --- a/test/CodeGenOpenCL/amdgpu-nullptr.cl +++ b/test/CodeGenOpenCL/amdgpu-nullptr.cl @@ -27,13 +27,13 @@ private char *private_p = 0;  // CHECK: @local_p = local_unnamed_addr addrspace(1) global i8 addrspace(3)* addrspacecast (i8 addrspace(4)* null to i8 addrspace(3)*), align 4  local char *local_p = 0; -// CHECK: @global_p = local_unnamed_addr addrspace(1) global i8 addrspace(1)* null, align 4 +// CHECK: @global_p = local_unnamed_addr addrspace(1) global i8 addrspace(1)* null, align 8  global char *global_p = 0; -// CHECK: @constant_p = local_unnamed_addr addrspace(1) global i8 addrspace(2)* null, align 4 +// CHECK: @constant_p = local_unnamed_addr addrspace(1) global i8 addrspace(2)* null, align 8  constant char *constant_p = 0; -// CHECK: @generic_p = local_unnamed_addr addrspace(1) global i8 addrspace(4)* null, align 4 +// CHECK: @generic_p = local_unnamed_addr addrspace(1) global i8 addrspace(4)* null, align 8  generic char *generic_p = 0;  // Test NULL as initializer. @@ -44,19 +44,19 @@ private char *private_p_NULL = NULL;  // CHECK: @local_p_NULL = local_unnamed_addr addrspace(1) global i8 addrspace(3)* addrspacecast (i8 addrspace(4)* null to i8 addrspace(3)*), align 4  local char *local_p_NULL = NULL; -// CHECK: @global_p_NULL = local_unnamed_addr addrspace(1) global i8 addrspace(1)* null, align 4 +// CHECK: @global_p_NULL = local_unnamed_addr addrspace(1) global i8 addrspace(1)* null, align 8  global char *global_p_NULL = NULL; -// CHECK: @constant_p_NULL = local_unnamed_addr addrspace(1) global i8 addrspace(2)* null, align 4 +// CHECK: @constant_p_NULL = local_unnamed_addr addrspace(1) global i8 addrspace(2)* null, align 8  constant char *constant_p_NULL = NULL; -// CHECK: @generic_p_NULL = local_unnamed_addr addrspace(1) global i8 addrspace(4)* null, align 4 +// CHECK: @generic_p_NULL = local_unnamed_addr addrspace(1) global i8 addrspace(4)* null, align 8  generic char *generic_p_NULL = NULL;  // Test constant folding of null pointer.  // A null pointer should be folded to a null pointer in the target address space. -// CHECK: @fold_generic = local_unnamed_addr addrspace(1) global i32 addrspace(4)* null, align 4 +// CHECK: @fold_generic = local_unnamed_addr addrspace(1) global i32 addrspace(4)* null, align 8  generic int *fold_generic = (global int*)(generic float*)(private char*)0;  // CHECK: @fold_priv = local_unnamed_addr addrspace(1) global i16* null, align 4 @@ -104,8 +104,8 @@ int fold_int5_local = (int) &((local StructTy1*)0)->p2;  // NOOPT: @test_static_var_private.sp3 = internal addrspace(1) global i8* null, align 4  // NOOPT: @test_static_var_private.sp4 = internal addrspace(1) global i8* null, align 4  // NOOPT: @test_static_var_private.sp5 = internal addrspace(1) global i8* null, align 4 -// NOOPT: @test_static_var_private.SS1 = internal addrspace(1) global %struct.StructTy1 { i8* null, i8 addrspace(3)* addrspacecast (i8 addrspace(4)* null to i8 addrspace(3)*), i8 addrspace(2)* null, i8 addrspace(1)* null, i8 addrspace(4)* null }, align 4 -// NOOPT: @test_static_var_private.SS2 = internal addrspace(1) global %struct.StructTy2 zeroinitializer, align 4 +// NOOPT: @test_static_var_private.SS1 = internal addrspace(1) global %struct.StructTy1 { i8* null, i8 addrspace(3)* addrspacecast (i8 addrspace(4)* null to i8 addrspace(3)*), i8 addrspace(2)* null, i8 addrspace(1)* null, i8 addrspace(4)* null }, align 8 +// NOOPT: @test_static_var_private.SS2 = internal addrspace(1) global %struct.StructTy2 zeroinitializer, align 8  void test_static_var_private(void) {    static private char *sp1 = 0; @@ -123,8 +123,8 @@ void test_static_var_private(void) {  // NOOPT: @test_static_var_local.sp3 = internal addrspace(1) global i8 addrspace(3)* addrspacecast (i8 addrspace(4)* null to i8 addrspace(3)*), align 4  // NOOPT: @test_static_var_local.sp4 = internal addrspace(1) global i8 addrspace(3)* null, align 4  // NOOPT: @test_static_var_local.sp5 = internal addrspace(1) global i8 addrspace(3)* null, align 4 -// NOOPT: @test_static_var_local.SS1 = internal addrspace(1) global %struct.StructTy1 { i8* null, i8 addrspace(3)* addrspacecast (i8 addrspace(4)* null to i8 addrspace(3)*), i8 addrspace(2)* null, i8 addrspace(1)* null, i8 addrspace(4)* null }, align 4 -// NOOPT: @test_static_var_local.SS2 = internal addrspace(1) global %struct.StructTy2 zeroinitializer, align 4 +// NOOPT: @test_static_var_local.SS1 = internal addrspace(1) global %struct.StructTy1 { i8* null, i8 addrspace(3)* addrspacecast (i8 addrspace(4)* null to i8 addrspace(3)*), i8 addrspace(2)* null, i8 addrspace(1)* null, i8 addrspace(4)* null }, align 8 +// NOOPT: @test_static_var_local.SS2 = internal addrspace(1) global %struct.StructTy2 zeroinitializer, align 8  void test_static_var_local(void) {    static local char *sp1 = 0;    static local char *sp2 = NULL; @@ -143,9 +143,9 @@ void test_static_var_local(void) {  // NOOPT: store i8* null, i8** %sp3, align 4  // NOOPT: store i8* null, i8** %sp4, align 4  // NOOPT: %[[SS1:.*]] = bitcast %struct.StructTy1* %SS1 to i8* -// NOOPT: call void @llvm.memcpy.p0i8.p2i8.i64(i8* %[[SS1]], i8 addrspace(2)* bitcast (%struct.StructTy1 addrspace(2)* @test_func_scope_var_private.SS1 to i8 addrspace(2)*), i64 32, i32 4, i1 false) +// NOOPT: call void @llvm.memcpy.p0i8.p2i8.i64(i8* %[[SS1]], i8 addrspace(2)* bitcast (%struct.StructTy1 addrspace(2)* @test_func_scope_var_private.SS1 to i8 addrspace(2)*), i64 32, i32 8, i1 false)  // NOOPT: %[[SS2:.*]] = bitcast %struct.StructTy2* %SS2 to i8* -// NOOPT: call void @llvm.memset.p0i8.i64(i8* %[[SS2]], i8 0, i64 24, i32 4, i1 false) +// NOOPT: call void @llvm.memset.p0i8.i64(i8* %[[SS2]], i8 0, i64 24, i32 8, i1 false)  void test_func_scope_var_private(void) {    private char *sp1 = 0;    private char *sp2 = NULL; @@ -163,9 +163,9 @@ void test_func_scope_var_private(void) {  // NOOPT: store i8 addrspace(3)* null, i8 addrspace(3)** %sp3, align 4  // NOOPT: store i8 addrspace(3)* null, i8 addrspace(3)** %sp4, align 4  // NOOPT: %[[SS1:.*]] = bitcast %struct.StructTy1* %SS1 to i8* -// NOOPT: call void @llvm.memcpy.p0i8.p2i8.i64(i8* %[[SS1]], i8 addrspace(2)* bitcast (%struct.StructTy1 addrspace(2)* @test_func_scope_var_local.SS1 to i8 addrspace(2)*), i64 32, i32 4, i1 false) +// NOOPT: call void @llvm.memcpy.p0i8.p2i8.i64(i8* %[[SS1]], i8 addrspace(2)* bitcast (%struct.StructTy1 addrspace(2)* @test_func_scope_var_local.SS1 to i8 addrspace(2)*), i64 32, i32 8, i1 false)  // NOOPT: %[[SS2:.*]] = bitcast %struct.StructTy2* %SS2 to i8* -// NOOPT: call void @llvm.memset.p0i8.i64(i8* %[[SS2]], i8 0, i64 24, i32 4, i1 false) +// NOOPT: call void @llvm.memset.p0i8.i64(i8* %[[SS2]], i8 0, i64 24, i32 8, i1 false)  void test_func_scope_var_local(void) {    local char *sp1 = 0;    local char *sp2 = NULL; @@ -189,28 +189,28 @@ private char *p1;  // CHECK: @p2 = weak local_unnamed_addr addrspace(1) global i8 addrspace(3)* addrspacecast (i8 addrspace(4)* null to i8 addrspace(3)*), align 4  local char *p2; -// CHECK: @p3 = common local_unnamed_addr addrspace(1) global i8 addrspace(2)* null, align 4 +// CHECK: @p3 = common local_unnamed_addr addrspace(1) global i8 addrspace(2)* null, align 8  constant char *p3; -// CHECK: @p4 = common local_unnamed_addr addrspace(1) global i8 addrspace(1)* null, align 4 +// CHECK: @p4 = common local_unnamed_addr addrspace(1) global i8 addrspace(1)* null, align 8  global char *p4; -// CHECK: @p5 = common local_unnamed_addr addrspace(1) global i8 addrspace(4)* null, align 4 +// CHECK: @p5 = common local_unnamed_addr addrspace(1) global i8 addrspace(4)* null, align 8  generic char *p5;  // Test default initialization of sturcture. -// CHECK: @S1 = weak local_unnamed_addr addrspace(1) global %struct.StructTy1 { i8* null, i8 addrspace(3)* addrspacecast (i8 addrspace(4)* null to i8 addrspace(3)*), i8 addrspace(2)* null, i8 addrspace(1)* null, i8 addrspace(4)* null }, align 4 +// CHECK: @S1 = weak local_unnamed_addr addrspace(1) global %struct.StructTy1 { i8* null, i8 addrspace(3)* addrspacecast (i8 addrspace(4)* null to i8 addrspace(3)*), i8 addrspace(2)* null, i8 addrspace(1)* null, i8 addrspace(4)* null }, align 8  StructTy1 S1; -// CHECK: @S2 = common local_unnamed_addr addrspace(1) global %struct.StructTy2 zeroinitializer, align 4 +// CHECK: @S2 = common local_unnamed_addr addrspace(1) global %struct.StructTy2 zeroinitializer, align 8  StructTy2 S2;  // Test default initialization of array. -// CHECK: @A1 = weak local_unnamed_addr addrspace(1) global [2 x %struct.StructTy1] [%struct.StructTy1 { i8* null, i8 addrspace(3)* addrspacecast (i8 addrspace(4)* null to i8 addrspace(3)*), i8 addrspace(2)* null, i8 addrspace(1)* null, i8 addrspace(4)* null }, %struct.StructTy1 { i8* null, i8 addrspace(3)* addrspacecast (i8 addrspace(4)* null to i8 addrspace(3)*), i8 addrspace(2)* null, i8 addrspace(1)* null, i8 addrspace(4)* null }], align 4 +// CHECK: @A1 = weak local_unnamed_addr addrspace(1) global [2 x %struct.StructTy1] [%struct.StructTy1 { i8* null, i8 addrspace(3)* addrspacecast (i8 addrspace(4)* null to i8 addrspace(3)*), i8 addrspace(2)* null, i8 addrspace(1)* null, i8 addrspace(4)* null }, %struct.StructTy1 { i8* null, i8 addrspace(3)* addrspacecast (i8 addrspace(4)* null to i8 addrspace(3)*), i8 addrspace(2)* null, i8 addrspace(1)* null, i8 addrspace(4)* null }], align 8  StructTy1 A1[2]; -// CHECK: @A2 = common local_unnamed_addr addrspace(1) global [2 x %struct.StructTy2] zeroinitializer, align 4 +// CHECK: @A2 = common local_unnamed_addr addrspace(1) global [2 x %struct.StructTy2] zeroinitializer, align 8  StructTy2 A2[2];  // Test comparison with 0. @@ -597,7 +597,7 @@ int test_and_ptr(private char* p1, local char* p2) {  // Test folding of null pointer in function scope.  // NOOPT-LABEL: test_fold_private  // NOOPT: call void @test_fold_callee -// NOOPT: store i32 addrspace(1)* null, i32 addrspace(1)** %glob, align 4 +// NOOPT: store i32 addrspace(1)* null, i32 addrspace(1)** %glob, align 8  // NOOPT: %{{.*}} = sub i64 %{{.*}}, 0  // NOOPT: call void @test_fold_callee  // NOOPT: %{{.*}} = add nsw i64 %{{.*}}, 0 @@ -612,7 +612,7 @@ void test_fold_private(void) {  // NOOPT-LABEL: test_fold_local  // NOOPT: call void @test_fold_callee -// NOOPT: store i32 addrspace(1)* null, i32 addrspace(1)** %glob, align 4 +// NOOPT: store i32 addrspace(1)* null, i32 addrspace(1)** %glob, align 8  // NOOPT: %{{.*}} = sub i64 %{{.*}}, 0  // NOOPT: call void @test_fold_callee  // NOOPT: %{{.*}} = add nsw i64 %{{.*}}, sext (i32 ptrtoint (i32 addrspace(3)* addrspacecast (i32 addrspace(4)* null to i32 addrspace(3)*) to i32) to i64) diff --git a/test/CodeGenOpenCL/amdgpu-sizeof-alignof.cl b/test/CodeGenOpenCL/amdgpu-sizeof-alignof.cl new file mode 100644 index 000000000000..a5d438933fa4 --- /dev/null +++ b/test/CodeGenOpenCL/amdgpu-sizeof-alignof.cl @@ -0,0 +1,70 @@ +// RUN: %clang_cc1 -triple r600 -cl-std=CL1.2 %s -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 -triple amdgcn-mesa-mesa3d -cl-std=CL1.2 %s -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 -triple amdgcn---opencl -cl-std=CL1.2 %s -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 -triple amdgcn---opencl -cl-std=CL2.0 %s -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 -triple amdgcn---amdgizcl -cl-std=CL1.2 %s -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 -triple amdgcn---amdgizcl -cl-std=CL2.0 %s -emit-llvm -o - | FileCheck %s + +#ifdef __AMDGCN__ +#define PTSIZE 8 +#else +#define PTSIZE 4 +#endif + +#ifdef cl_khr_fp64 +#pragma OPENCL EXTENSION cl_khr_fp64 : enable +#endif +#ifdef cl_khr_fp16 +#pragma OPENCL EXTENSION cl_khr_fp16 : enable +#endif + +typedef __SIZE_TYPE__ size_t; +typedef __PTRDIFF_TYPE__ ptrdiff_t; +typedef __INTPTR_TYPE__ intptr_t; +typedef __UINTPTR_TYPE__ uintptr_t; +typedef global void *global_ptr_t; +typedef constant void *constant_ptr_t; +typedef local void *local_ptr_t; +typedef private void *private_ptr_t; + +void check(bool); + +void test() { +  // CHECK-NOT: call void @check(i1 zeroext false) +  check(sizeof(size_t) == PTSIZE); +  check(__alignof__(size_t) == PTSIZE); +  check(sizeof(intptr_t) == PTSIZE); +  check(__alignof__(intptr_t) == PTSIZE); +  check(sizeof(uintptr_t) == PTSIZE); +  check(__alignof__(uintptr_t) == PTSIZE); +  check(sizeof(ptrdiff_t) == PTSIZE); +  check(__alignof__(ptrdiff_t) == PTSIZE); + +  check(sizeof(char) == 1); +  check(__alignof__(char) == 1); +  check(sizeof(short) == 2); +  check(__alignof__(short) == 2); +  check(sizeof(int) == 4); +  check(__alignof__(int) == 4); +  check(sizeof(long) == 8); +  check(__alignof__(long) == 8); +#ifdef cl_khr_fp16 +  check(sizeof(half) == 2); +  check(__alignof__(half) == 2); +#endif +  check(sizeof(float) == 4); +  check(__alignof__(float) == 4); +#ifdef cl_khr_fp64 +  check(sizeof(double) == 8); +  check(__alignof__(double) == 8); +#endif + +  check(sizeof(void*) == (__OPENCL_C_VERSION__ >= 200 ? 8 : 4)); +  check(__alignof__(void*) == (__OPENCL_C_VERSION__ >= 200 ? 8 : 4)); +  check(sizeof(global_ptr_t) == PTSIZE); +  check(__alignof__(global_ptr_t) == PTSIZE); +  check(sizeof(constant_ptr_t) == PTSIZE); +  check(__alignof__(constant_ptr_t) == PTSIZE); +  check(sizeof(local_ptr_t) == 4); +  check(__alignof__(private_ptr_t) == 4); +} diff --git a/test/Driver/autocomplete.c b/test/Driver/autocomplete.c index f0bdcce5707c..e9e2e992bae9 100644 --- a/test/Driver/autocomplete.c +++ b/test/Driver/autocomplete.c @@ -36,3 +36,7 @@  // MTHREADMODELALL: posix single  // RUN: %clang --autocomplete=-mrelocation-model, | FileCheck %s -check-prefix=MRELOCMODELALL  // MRELOCMODELALL: dynamic-no-pic pic ropi ropi-rwpi rwpi static +// RUN: %clang --autocomplete=-mrelocation-mode | FileCheck %s -check-prefix=MRELOCMODEL_CLANG +// MRELOCMODEL_CLANG-NOT: -mrelocation-model +// RUN: %clang --autocomplete=#-mrelocation-mode | FileCheck %s -check-prefix=MRELOCMODEL_CC1 +// MRELOCMODEL_CC1: -mrelocation-model diff --git a/test/Driver/clang_f_opts.c b/test/Driver/clang_f_opts.c index e4b72d69ca3f..c17cec6eba9b 100644 --- a/test/Driver/clang_f_opts.c +++ b/test/Driver/clang_f_opts.c @@ -356,6 +356,8 @@  // RUN: -ftree-vrp                                                            \  // RUN: -fno-devirtualize                                                     \  // RUN: -fno-devirtualize-speculatively                                       \ +// RUN: -fslp-vectorize-aggressive                                            \ +// RUN: -fno-slp-vectorize-aggressive                                         \  // RUN: %s 2>&1 | FileCheck --check-prefix=CHECK-WARNING %s  // CHECK-WARNING-DAG: optimization flag '-finline-limit=1000' is not supported  // CHECK-WARNING-DAG: optimization flag '-finline-limit' is not supported @@ -422,6 +424,8 @@  // CHECK-WARNING-DAG: optimization flag '-ftree-vrp' is not supported  // CHECK-WARNING-DAG: optimization flag '-fno-devirtualize' is not supported  // CHECK-WARNING-DAG: optimization flag '-fno-devirtualize-speculatively' is not supported +// CHECK-WARNING-DAG: the flag '-fslp-vectorize-aggressive' has been deprecated and will be ignored +// CHECK-WARNING-DAG: the flag '-fno-slp-vectorize-aggressive' has been deprecated and will be ignored  // Test that we mute the warning on these  // RUN: %clang -### -finline-limit=1000 -Wno-invalid-command-line-argument              \ diff --git a/test/Driver/crash report spaces.c b/test/Driver/crash-report-spaces.c index 9bc4626b48b8..3e95a0de2516 100644 --- a/test/Driver/crash report spaces.c +++ b/test/Driver/crash-report-spaces.c @@ -1,6 +1,7 @@  // RUN: rm -rf "%t"  // RUN: mkdir "%t" -// RUN: not env TMPDIR="%t" TEMP="%t" TMP="%t" RC_DEBUG_OPTIONS=1 %clang -fsyntax-only "%s" 2>&1 | FileCheck "%s" +// RUN: cp "%s" "%t/crash report spaces.c" +// RUN: not env TMPDIR="%t" TEMP="%t" TMP="%t" RC_DEBUG_OPTIONS=1 %clang -fsyntax-only "%t/crash report spaces.c" 2>&1 | FileCheck "%s"  // RUN: cat "%t/crash report spaces"-*.c | FileCheck --check-prefix=CHECKSRC "%s"  // RUN: cat "%t/crash report spaces"-*.sh | FileCheck --check-prefix=CHECKSH "%s"  // REQUIRES: crash-recovery diff --git a/test/Driver/darwin-sdk-vs-os-version.c b/test/Driver/darwin-sdk-vs-os-version.c new file mode 100644 index 000000000000..391f4d5a7305 --- /dev/null +++ b/test/Driver/darwin-sdk-vs-os-version.c @@ -0,0 +1,10 @@ +// REQUIRES: system-darwin + +// Ensure that we never pick a version that's based on the SDK that's newer than +// the system version: +// RUN: rm -rf %t/SDKs/MacOSX10.99.99.sdk +// RUN: mkdir -p %t/SDKs/MacOSX10.99.99.sdk +// RUN: %clang -target x86_64-apple-darwin -isysroot %t/SDKs/MacOSX10.99.99.sdk %s -### 2>&1 \ +// RUN:   | FileCheck --check-prefix=CHECK-MACOSX-SYSTEM-VERSION %s + +// CHECK-MACOSX-SYSTEM-VERSION-NOT: 10.99.99" diff --git a/test/Driver/fuchsia.c b/test/Driver/fuchsia.c index 58c2bbe533c9..64d31cc0d38c 100644 --- a/test/Driver/fuchsia.c +++ b/test/Driver/fuchsia.c @@ -12,7 +12,7 @@  // CHECK: Scrt1.o  // CHECK-NOT: crti.o  // CHECK-NOT: crtbegin.o -// CHECK: "-L[[SYSROOT]]/lib" +// CHECK: "-L[[SYSROOT]]{{/|\\\\}}lib"  // CHECK: "{{.*[/\\]}}libclang_rt.builtins-x86_64.a"  // CHECK: "-lc"  // CHECK-NOT: crtend.o diff --git a/test/Driver/fuchsia.cpp b/test/Driver/fuchsia.cpp index 4490f94d0715..4c3f7d29acd8 100644 --- a/test/Driver/fuchsia.cpp +++ b/test/Driver/fuchsia.cpp @@ -1,9 +1,10 @@  // RUN: %clangxx %s -### -no-canonical-prefixes --target=x86_64-unknown-fuchsia \  // RUN:     --sysroot=%S/platform 2>&1 -fuse-ld=ld | FileCheck %s  // CHECK: {{.*}}clang{{.*}}" "-cc1" +// CHECK: "-triple" "x86_64-fuchsia"  // CHECK: "-fuse-init-array"  // CHECK: "-isysroot" "[[SYSROOT:[^"]+]]" -// CHECK: "-internal-isystem" "[[SYSROOT]]{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}v1" +// CHECK: "-internal-isystem" "{{.*[/\\]}}x86_64-fuchsia{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}v1"  // CHECK: "-internal-externc-isystem" "[[SYSROOT]]{{/|\\\\}}include"  // CHECK: {{.*}}lld{{.*}}" "-flavor" "gnu"  // CHECK: "--sysroot=[[SYSROOT]]" @@ -13,7 +14,7 @@  // CHECK: Scrt1.o  // CHECK-NOT: crti.o  // CHECK-NOT: crtbegin.o -// CHECK: "-L[[SYSROOT]]/lib" +// CHECK: "-L[[SYSROOT]]{{/|\\\\}}lib"  // CHECK: "-lc++" "-lc++abi" "-lunwind" "-lm"  // CHECK: "{{.*[/\\]}}libclang_rt.builtins-x86_64.a"  // CHECK: "-lc" diff --git a/test/Driver/mips-features.c b/test/Driver/mips-features.c index 69fc20e1f245..b228a2d5781d 100644 --- a/test/Driver/mips-features.c +++ b/test/Driver/mips-features.c @@ -70,6 +70,18 @@  // RUN:   | FileCheck --check-prefix=CHECK-NOMMSA %s  // CHECK-NOMMSA: "-target-feature" "-msa"  // +// -mmt +// RUN: %clang -target mips-linux-gnu -### -c %s \ +// RUN:     -mno-mt -mmt 2>&1 \ +// RUN:   | FileCheck --check-prefix=CHECK-MMT %s +// CHECK-MMT: "-target-feature" "+mt" +// +// -mno-mt +// RUN: %clang -target mips-linux-gnu -### -c %s \ +// RUN:     -mmt -mno-mt 2>&1 \ +// RUN:   | FileCheck --check-prefix=CHECK-NOMMT %s +// CHECK-NOMMT: "-target-feature" "-mt" +//  // -modd-spreg  // RUN: %clang -target mips-linux-gnu -### -c %s -mno-odd-spreg -modd-spreg 2>&1 \  // RUN:   | FileCheck --check-prefix=CHECK-MODDSPREG %s @@ -247,3 +259,14 @@  // RUN:   | FileCheck --check-prefix=CHECK-IMG-SINGLEFLOAT-FPXX %s  // CHECK-IMG-SINGLEFLOAT-FPXX: "-target-feature" "+single-float"  // CHECK-IMG-SINGLEFLOAT-FPXX: "-target-feature" "+fpxx" + +// -mlong-call +// RUN: %clang -target mips-img-linux-gnu -### -c %s -mlong-calls 2>&1 \ +// RUN:   | FileCheck --check-prefix=LONG-CALLS-ON %s +// RUN: %clang -target mips-img-linux-gnu -### -c %s -mno-long-calls 2>&1 \ +// RUN:   | FileCheck --check-prefix=LONG-CALLS-OFF %s +// RUN: %clang -target mips-img-linux-gnu -### -c %s 2>&1 \ +// RUN:   | FileCheck --check-prefix=LONG-CALLS-DEF %s +// LONG-CALLS-ON: "-target-feature" "+long-calls" +// LONG-CALLS-OFF: "-target-feature" "-long-calls" +// LONG-CALLS-DEF-NOT: "long-calls" diff --git a/test/FixIt/fixit-add-synthesize-to-property.m b/test/FixIt/fixit-add-synthesize-to-property.m new file mode 100644 index 000000000000..19b2f4b73f01 --- /dev/null +++ b/test/FixIt/fixit-add-synthesize-to-property.m @@ -0,0 +1,14 @@ +// RUN: %clang_cc1 -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s + +@protocol P1 + +@property int prop; + +@end + +@interface I <P1> + +@end + +@implementation I +@end // CHECK: fix-it:{{.*}}:{[[@LINE]]:1-[[@LINE]]:1}:"@synthesize prop;\n\n" diff --git a/test/Import/direct/Inputs/S.c b/test/Import/direct/Inputs/S.c new file mode 100644 index 000000000000..b0876d27df44 --- /dev/null +++ b/test/Import/direct/Inputs/S.c @@ -0,0 +1,3 @@ +struct S { +  int a; +}; diff --git a/test/Import/direct/test.c b/test/Import/direct/test.c new file mode 100644 index 000000000000..5fac24c015dc --- /dev/null +++ b/test/Import/direct/test.c @@ -0,0 +1,5 @@ +// RUN: clang-import-test -direct -import %S/Inputs/S.c -expression %s +void expr() { +  struct S MyS; +  MyS.a = 3; +} diff --git a/test/Import/enum/Inputs/S.cpp b/test/Import/enum/Inputs/S.cpp new file mode 100644 index 000000000000..8506c68512db --- /dev/null +++ b/test/Import/enum/Inputs/S.cpp @@ -0,0 +1,4 @@ +enum E { +  a = 1, +  b = 2 +}; diff --git a/test/Import/enum/test.cpp b/test/Import/enum/test.cpp new file mode 100644 index 000000000000..aa68063cb207 --- /dev/null +++ b/test/Import/enum/test.cpp @@ -0,0 +1,4 @@ +// RUN: clang-import-test -import %S/Inputs/S.cpp -expression %s +void expr() { +  static_assert(E::a + E::b == 3); +} diff --git a/test/Import/import-overrides/Inputs/Hierarchy.cpp b/test/Import/import-overrides/Inputs/Hierarchy.cpp new file mode 100644 index 000000000000..3f91be765d18 --- /dev/null +++ b/test/Import/import-overrides/Inputs/Hierarchy.cpp @@ -0,0 +1,9 @@ +class Base { +public: +  virtual void foo() {} +}; + +class Derived : public Base { +public: +  void foo() override {} +}; diff --git a/test/Import/import-overrides/test.cpp b/test/Import/import-overrides/test.cpp new file mode 100644 index 000000000000..ded29cded2ee --- /dev/null +++ b/test/Import/import-overrides/test.cpp @@ -0,0 +1,7 @@ +// RUN: clang-import-test -dump-ast -import %S/Inputs/Hierarchy.cpp -expression %s | FileCheck %s + +// CHECK: Overrides:{{.*}}Base::foo + +void foo() { +  Derived d; +} diff --git a/test/Index/Core/index-source-invalid-name.cpp b/test/Index/Core/index-source-invalid-name.cpp new file mode 100644 index 000000000000..1b4b059cd1b3 --- /dev/null +++ b/test/Index/Core/index-source-invalid-name.cpp @@ -0,0 +1,13 @@ +// RUN: c-index-test core -print-source-symbols -- %s -std=c++1z -target x86_64-apple-macosx10.7 | FileCheck %s + +namespace rdar32474406 { +// CHECK: [[@LINE+1]]:6 | function/C | foo | c:@N@rdar32474406@F@foo# | __ZN12rdar324744063fooEv | Decl,RelChild | rel: 1 +void foo(); +// CHECK: [[@LINE+1]]:16 | type-alias/C | Func_t | c:index-source-invalid-name.cpp@N@rdar32474406@T@Func_t | <no-cgname> | Def,RelChild | rel: 1 +typedef void (*Func_t)(); +// CHECK: [[@LINE+4]]:1 | type-alias/C | Func_t | c:index-source-invalid-name.cpp@N@rdar32474406@T@Func_t | <no-cgname> | Ref,RelCont | rel: 1 +// CHECK-NEXT: RelCont | rdar32474406 | c:@N@rdar32474406 +// CHECK: [[@LINE+2]]:14 | function/C | foo | c:@N@rdar32474406@F@foo# | __ZN12rdar324744063fooEv | Ref,RelCont | rel: 1 +// CHECK-NEXT: RelCont | rdar32474406 | c:@N@rdar32474406 +Func_t[] = { foo }; // invalid decomposition +} diff --git a/test/Index/Core/index-source.cpp b/test/Index/Core/index-source.cpp index 6d20fdd48e50..4864d6cf0150 100644 --- a/test/Index/Core/index-source.cpp +++ b/test/Index/Core/index-source.cpp @@ -496,3 +496,19 @@ void localStructuredBindingAndRef() {  }  } + +namespace rd33122110 { + +struct Outer { +    template<typename T> +    struct Nested { }; +}; + +} + +template<> +struct rd33122110::Outer::Nested<int>; +// CHECK: [[@LINE-1]]:8 | namespace/C++ | rd33122110 | c:@N@rd33122110 | <no-cgname> | Ref,RelCont | rel: 1 +// CHECK-NEXT: RelCont | Nested | c:@N@rd33122110@S@Outer@S@Nested>#I +// CHECK: [[@LINE-3]]:20 | struct/C++ | Outer | c:@N@rd33122110@S@Outer | <no-cgname> | Ref,RelCont | rel: 1 +// CHECK-NEXT: RelCont | Nested | c:@N@rd33122110@S@Outer@S@Nested>#I diff --git a/test/Index/Core/index-source.m b/test/Index/Core/index-source.m index a64c34ad2ac1..c911973a70d6 100644 --- a/test/Index/Core/index-source.m +++ b/test/Index/Core/index-source.m @@ -413,3 +413,28 @@ void classReceivers() {    (void)ClassReceivers.implicit;  // CHECK: [[@LINE-1]]:9 | class/ObjC | ClassReceivers | c:objc(cs)ClassReceivers | _OBJC_CLASS_$_ClassReceivers | Ref,RelCont | rel: 1  } + +@interface ImplicitProperties + +- (int)implicit; +- (void)setImplicit:(int)x; + ++ (int)classImplicit; ++ (void)setClassImplicit:(int)y; + +@end + +void testImplicitProperties(ImplicitProperties *c) { +  c.implicit = 0; +// CHECK: [[@LINE-1]]:5 | instance-method/ObjC | setImplicit: | c:objc(cs)ImplicitProperties(im)setImplicit: | -[ImplicitProperties setImplicit:] | Ref,Call,Dyn,RelRec,RelCall,RelCont | rel: 2 +// CHECK-NEXT: RelCall,RelCont | testImplicitProperties | c:@F@testImplicitProperties +  c.implicit; +// CHECK: [[@LINE-1]]:5 | instance-method/ObjC | implicit | c:objc(cs)ImplicitProperties(im)implicit | -[ImplicitProperties implicit] | Ref,Call,Dyn,RelRec,RelCall,RelCont | rel: 2 +// CHECK-NEXT: RelCall,RelCont | testImplicitProperties | c:@F@testImplicitProperties +  ImplicitProperties.classImplicit = 1; +// CHECK: [[@LINE-1]]:22 | class-method/ObjC | setClassImplicit: | c:objc(cs)ImplicitProperties(cm)setClassImplicit: | +[ImplicitProperties setClassImplicit:] | Ref,Call,RelCall,RelCont | rel: 1 +// CHECK-NEXT: RelCall,RelCont | testImplicitProperties | c:@F@testImplicitProperties +  ImplicitProperties.classImplicit; +// CHECK: [[@LINE-1]]:22 | class-method/ObjC | classImplicit | c:objc(cs)ImplicitProperties(cm)classImplicit | +[ImplicitProperties classImplicit] | Ref,Call,RelCall,RelCont | rel: 1 +// CHECK-NEXT: RelCall,RelCont | testImplicitProperties | c:@F@testImplicitProperties +} diff --git a/test/Index/Inputs/empty.dia b/test/Index/Inputs/empty.dia new file mode 100644 index 000000000000..e69de29bb2d1 --- /dev/null +++ b/test/Index/Inputs/empty.dia diff --git a/test/Index/pipe-size.cl b/test/Index/pipe-size.cl index d07d7067da8c..cfe97935ee63 100644 --- a/test/Index/pipe-size.cl +++ b/test/Index/pipe-size.cl @@ -11,6 +11,6 @@ __kernel void testPipe( pipe int test )      // SPIR: store i32 4, i32* %s, align 4      // SPIR64: store %opencl.pipe_t addrspace(1)* %test, %opencl.pipe_t addrspace(1)** %test.addr, align 8      // SPIR64: store i32 8, i32* %s, align 4 -    // AMD: store %opencl.pipe_t addrspace(1)* %test, %opencl.pipe_t addrspace(1)* addrspace(5)* %test.addr, align 4 +    // AMD: store %opencl.pipe_t addrspace(1)* %test, %opencl.pipe_t addrspace(1)* addrspace(5)* %test.addr, align 8      // AMD: store i32 8, i32 addrspace(5)* %s, align 4  } diff --git a/test/Index/print-type-declaration.cpp b/test/Index/print-type-declaration.cpp index 31c0a73fcd06..a0953d1e5638 100644 --- a/test/Index/print-type-declaration.cpp +++ b/test/Index/print-type-declaration.cpp @@ -7,6 +7,13 @@ int main()    auto b = a;  } +enum RegularEnum {}; + +enum class ScopedEnum {}; +  // RUN: c-index-test -test-print-type-declaration -std=c++11 %s | FileCheck %s  // CHECK: VarDecl=a:6:8 (Definition) [typedeclaration=Test] [typekind=Record]  // CHECK: VarDecl=b:7:8 (Definition) [typedeclaration=Test] [typekind=Record] +// CHECK: EnumDecl=RegularEnum:10:6 (Definition) [typedeclaration=RegularEnum] [typekind=Enum] +// CHECK: EnumDecl=ScopedEnum:12:12 (Definition) (scoped) [typedeclaration=ScopedEnum] [typekind=Enum] + diff --git a/test/Index/read-empty-diags.test b/test/Index/read-empty-diags.test new file mode 100644 index 000000000000..cef751c920ab --- /dev/null +++ b/test/Index/read-empty-diags.test @@ -0,0 +1,2 @@ +// RUN: not c-index-test -read-diagnostics %S/Inputs/empty.dia 2>&1 | FileCheck %s +// CHECK: Trouble deserializing file (Invalid File): Invalid diagnostics signature diff --git a/test/Index/usrs.m b/test/Index/usrs.m index 92c3a3fafee2..d0a860e1afad 100644 --- a/test/Index/usrs.m +++ b/test/Index/usrs.m @@ -119,7 +119,7 @@ int test_multi_declaration(void) {  // CHECK: usrs.m c:@SA@MyStruct Extent=[15:9 - 18:2]  // CHECK: usrs.m c:@SA@MyStruct@FI@wa Extent=[16:3 - 16:9]  // CHECK: usrs.m c:@SA@MyStruct@FI@moo Extent=[17:3 - 17:10] -// CHECK: usrs.m c:usrs.m@T@MyStruct Extent=[15:1 - 18:11] +// CHECK: usrs.m c:@T@MyStruct Extent=[15:1 - 18:11]  // CHECK: usrs.m c:@E@Pizza Extent=[20:1 - 23:2]  // CHECK: usrs.m c:@E@Pizza@CHEESE Extent=[21:3 - 21:9]  // CHECK: usrs.m c:@E@Pizza@MUSHROOMS Extent=[22:3 - 22:12] diff --git a/test/Misc/find-diagnostic-id.c b/test/Misc/find-diagnostic-id.c new file mode 100644 index 000000000000..bef66178f96f --- /dev/null +++ b/test/Misc/find-diagnostic-id.c @@ -0,0 +1,5 @@ +// RUN: diagtool find-diagnostic-id warn_unused_variable | FileCheck %s +// RUN: not diagtool find-diagnostic-id warn_unused_vars 2>&1 | FileCheck --check-prefix=ERROR %s + +// CHECK: {{^[0-9]+$}} +// ERROR: error: invalid diagnostic 'warn_unused_vars' diff --git a/test/Modules/missing-flag.cpp b/test/Modules/missing-flag.cpp new file mode 100644 index 000000000000..560183be59e8 --- /dev/null +++ b/test/Modules/missing-flag.cpp @@ -0,0 +1,4 @@ +// RUN: not %clang_cc1 -x c++-module-map %s -emit-module -fmodule-name=Foo -o %t 2>&1 | FileCheck %s +// CHECK: module compilation requires '-fmodules' +module Foo {} +#pragma clang module contents diff --git a/test/Modules/odr_hash.cpp b/test/Modules/odr_hash.cpp index 6e01e989a374..ee45ae529961 100644 --- a/test/Modules/odr_hash.cpp +++ b/test/Modules/odr_hash.cpp @@ -1339,6 +1339,84 @@ Bravo<char> golf;  #endif  } +namespace Friend { +#if defined(FIRST) +struct T1 {}; +struct S1 { +  friend class T1; +}; +#elif defined(SECOND) +struct T1 {}; +struct S1 { +  friend T1; +}; +#else +S1 s1; +// expected-error@second.h:* {{'Friend::S1' has different definitions in different modules; first difference is definition in module 'SecondModule' found friend 'Friend::T1'}} +// expected-note@first.h:* {{but in 'FirstModule' found friend 'class T1'}} +#endif + +#if defined(FIRST) +struct T2 {}; +struct S2 { +  friend class T2; +}; +#elif defined(SECOND) +struct T2 {}; +struct S2 { +  friend struct T2; +}; +#else +S2 s2; +// expected-error@second.h:* {{'Friend::S2' has different definitions in different modules; first difference is definition in module 'SecondModule' found friend 'struct T2'}} +// expected-note@first.h:* {{but in 'FirstModule' found friend 'class T2'}} +#endif + +#if defined(FIRST) +struct T3 {}; +struct S3 { +  friend const T3; +}; +#elif defined(SECOND) +struct T3 {}; +struct S3 { +  friend T3; +}; +#else +S3 s3; +// expected-error@second.h:* {{'Friend::S3' has different definitions in different modules; first difference is definition in module 'SecondModule' found friend 'Friend::T3'}} +// expected-note@first.h:* {{but in 'FirstModule' found friend 'const Friend::T3'}} +#endif + +#if defined(FIRST) +struct T4 {}; +struct S4 { +  friend T4; +}; +#elif defined(SECOND) +struct S4 { +  friend void T4(); +}; +#else +S4 s4; +// expected-error@second.h:* {{'Friend::S4' has different definitions in different modules; first difference is definition in module 'SecondModule' found friend function}} +// expected-note@first.h:* {{but in 'FirstModule' found friend class}} +#endif + +#if defined(FIRST) +struct S5 { +  friend void T5a(); +}; +#elif defined(SECOND) +struct S5 { +  friend void T5b(); +}; +#else +S5 s5; +// expected-error@second.h:* {{'Friend::S5' has different definitions in different modules; first difference is definition in module 'SecondModule' found friend function 'T5b'}} +// expected-note@first.h:* {{but in 'FirstModule' found friend function 'T5a'}} +#endif +}  // Interesting cases that should not cause errors.  struct S should not error  // while struct T should error at the access specifier mismatch at the end.  namespace AllDecls { diff --git a/test/Modules/preprocess-build.cpp b/test/Modules/preprocess-build.cpp index bf9f16162be2..36a0740a0a76 100644 --- a/test/Modules/preprocess-build.cpp +++ b/test/Modules/preprocess-build.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -std=c++1z %s -verify +// RUN: %clang_cc1 -std=c++1z -fmodules %s -verify  #pragma clang module build baz    module baz {} diff --git a/test/Modules/relative-dep-gen.cpp b/test/Modules/relative-dep-gen.cpp index e58dd6eb3596..bfa9471859b8 100644 --- a/test/Modules/relative-dep-gen.cpp +++ b/test/Modules/relative-dep-gen.cpp @@ -2,17 +2,17 @@  // RUN: rm -rf %t  // RUN: mkdir %t  // -// RUN: %clang_cc1 -cc1 -fno-implicit-modules -fmodule-name=relative-dep-gen -emit-module -x c++ Inputs/relative-dep-gen.modulemap -dependency-file %t/build.d -MT mod.pcm -o %t/mod.pcm -// RUN: %clang_cc1 -cc1 -fno-implicit-modules -fmodule-map-file=Inputs/relative-dep-gen.modulemap -fmodule-file=%t/mod.pcm -dependency-file %t/use-explicit.d -MT use.o relative-dep-gen.cpp -fsyntax-only -// RUN: %clang_cc1 -cc1 -fno-implicit-modules -fmodule-map-file=Inputs/relative-dep-gen.modulemap -dependency-file %t/use-implicit.d relative-dep-gen.cpp -MT use.o -fsyntax-only +// RUN: %clang_cc1 -fmodules -fno-implicit-modules -fmodule-name=relative-dep-gen -emit-module -x c++ Inputs/relative-dep-gen.modulemap -dependency-file %t/build.d -MT mod.pcm -o %t/mod.pcm +// RUN: %clang_cc1 -fmodules -fno-implicit-modules -fmodule-map-file=Inputs/relative-dep-gen.modulemap -fmodule-file=%t/mod.pcm -dependency-file %t/use-explicit.d -MT use.o relative-dep-gen.cpp -fsyntax-only +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fmodule-map-file=Inputs/relative-dep-gen.modulemap -dependency-file %t/use-implicit.d relative-dep-gen.cpp -MT use.o -fsyntax-only  //  // RUN: FileCheck --check-prefix=CHECK-BUILD %s < %t/build.d -// RUN: FileCheck --check-prefix=CHECK-USE %s < %t/use-explicit.d -// RUN: FileCheck --check-prefix=CHECK-USE %s < %t/use-implicit.d +// RUN: FileCheck --check-prefix=CHECK-USE --check-prefix=CHECK-EXPLICIT %s < %t/use-explicit.d +// RUN: FileCheck --check-prefix=CHECK-USE --check-prefix=CHECK-IMPLICIT %s < %t/use-implicit.d  // -// RUN: %clang_cc1 -cc1 -fno-implicit-modules -fmodule-name=relative-dep-gen -emit-module -x c++ Inputs/relative-dep-gen-cwd.modulemap -dependency-file %t/build-cwd.d -MT mod.pcm -o %t/mod-cwd.pcm -fmodule-map-file-home-is-cwd -// RUN: %clang_cc1 -cc1 -fno-implicit-modules -fmodule-map-file=Inputs/relative-dep-gen-cwd.modulemap -fmodule-file=%t/mod-cwd.pcm -dependency-file %t/use-explicit-cwd.d -MT use.o relative-dep-gen.cpp -fsyntax-only -fmodule-map-file-home-is-cwd -// RUN: %clang_cc1 -cc1 -fno-implicit-modules -fmodule-map-file=Inputs/relative-dep-gen-cwd.modulemap -dependency-file %t/use-implicit-cwd.d relative-dep-gen.cpp -MT use.o -fsyntax-only -fmodule-map-file-home-is-cwd +// RUN: %clang_cc1 -fmodules -fno-implicit-modules -fmodule-name=relative-dep-gen -emit-module -x c++ Inputs/relative-dep-gen-cwd.modulemap -dependency-file %t/build-cwd.d -MT mod.pcm -o %t/mod-cwd.pcm -fmodule-map-file-home-is-cwd +// RUN: %clang_cc1 -fmodules -fno-implicit-modules -fmodule-map-file=Inputs/relative-dep-gen-cwd.modulemap -fmodule-file=%t/mod-cwd.pcm -dependency-file %t/use-explicit-cwd.d -MT use.o relative-dep-gen.cpp -fsyntax-only -fmodule-map-file-home-is-cwd +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fmodule-map-file=Inputs/relative-dep-gen-cwd.modulemap -dependency-file %t/use-implicit-cwd.d relative-dep-gen.cpp -MT use.o -fsyntax-only -fmodule-map-file-home-is-cwd  //  // RUN: FileCheck --check-prefix=CHECK-BUILD %s < %t/build-cwd.d  // RUN: FileCheck --check-prefix=CHECK-USE %s < %t/use-explicit-cwd.d @@ -23,7 +23,7 @@  // RUN: cp %S/Inputs/relative-dep-gen-1.h %t/Inputs  // RUN: cp %s %t  // RUN: cd %t -// RUN: %clang_cc1 -cc1 -fno-implicit-modules -fmodule-file=%t/mod-cwd.pcm -dependency-file %t/use-explicit-no-map-cwd.d -MT use.o relative-dep-gen.cpp -fsyntax-only -fmodule-map-file-home-is-cwd +// RUN: %clang_cc1 -fmodules -fno-implicit-modules -fmodule-file=%t/mod-cwd.pcm -dependency-file %t/use-explicit-no-map-cwd.d -MT use.o relative-dep-gen.cpp -fsyntax-only -fmodule-map-file-home-is-cwd  // RUN: cat %t/use-explicit-no-map-cwd.d  // RUN: FileCheck --check-prefix=CHECK-USE %s < %t/use-explicit-no-map-cwd.d @@ -35,4 +35,5 @@  // CHECK-BUILD:   {{[ \t]}}Inputs/relative-dep-gen-2.h  // CHECK-USE: use.o:  // CHECK-USE-DAG:   {{[ \t]}}relative-dep-gen.cpp -// CHECK-USE-DAG:   {{[ \t]}}Inputs{{[/\\]}}relative-dep-gen-1.h +// CHECK-EXPLICIT-DAG:   mod.pcm +// CHECK-IMPLICIT-DAG:   {{[ \t]}}Inputs{{[/\\]}}relative-dep-gen-1.h diff --git a/test/OpenMP/taskloop_ast_print.cpp b/test/OpenMP/taskloop_ast_print.cpp index 36f90c95dd33..dd0af85916cf 100644 --- a/test/OpenMP/taskloop_ast_print.cpp +++ b/test/OpenMP/taskloop_ast_print.cpp @@ -20,7 +20,7 @@ T tmain(T argc) {  // CHECK-NEXT: for (int i = 0; i < 2; ++i)  // CHECK-NEXT: a = 2;  #pragma omp parallel -#pragma omp taskloop private(argc, b), firstprivate(c, d), lastprivate(d, f) collapse(N) shared(g) if (c) final(d) mergeable priority(f) nogroup num_tasks(N) reduction(min:a) +#pragma omp taskloop private(argc, b), firstprivate(c, d), lastprivate(d, f) collapse(N) shared(g) if (c) final(d) mergeable priority(f) nogroup num_tasks(N)    for (int i = 0; i < 2; ++i)      for (int j = 0; j < 2; ++j)        for (int j = 0; j < 2; ++j) @@ -33,7 +33,7 @@ T tmain(T argc) {            for (int j = 0; j < 2; ++j)              foo();    // CHECK-NEXT: #pragma omp parallel -  // CHECK-NEXT: #pragma omp taskloop private(argc,b) firstprivate(c,d) lastprivate(d,f) collapse(N) shared(g) if(c) final(d) mergeable priority(f) nogroup num_tasks(N) reduction(min: a) +  // CHECK-NEXT: #pragma omp taskloop private(argc,b) firstprivate(c,d) lastprivate(d,f) collapse(N) shared(g) if(c) final(d) mergeable priority(f) nogroup num_tasks(N)    // CHECK-NEXT: for (int i = 0; i < 2; ++i)    // CHECK-NEXT: for (int j = 0; j < 2; ++j)    // CHECK-NEXT: for (int j = 0; j < 2; ++j) @@ -53,8 +53,8 @@ int main(int argc, char **argv) {    int b = argc, c, d, e, f, g;    static int a;  // CHECK: static int a; -#pragma omp taskloop if(taskloop: a) default(none) shared(a) final(b) priority(5) nogroup num_tasks(argc) reduction(*: g) -  // CHECK-NEXT: #pragma omp taskloop if(taskloop: a) default(none) shared(a) final(b) priority(5) nogroup num_tasks(argc) reduction(*: g) +#pragma omp taskloop if(taskloop: a) default(none) shared(a) final(b) priority(5) num_tasks(argc) reduction(*: g) +  // CHECK-NEXT: #pragma omp taskloop if(taskloop: a) default(none) shared(a) final(b) priority(5) num_tasks(argc) reduction(*: g)    for (int i = 0; i < 2; ++i)      a = 2;  // CHECK-NEXT: for (int i = 0; i < 2; ++i) diff --git a/test/OpenMP/taskloop_codegen.cpp b/test/OpenMP/taskloop_codegen.cpp index bc7367ce0216..b1b45455802a 100644 --- a/test/OpenMP/taskloop_codegen.cpp +++ b/test/OpenMP/taskloop_codegen.cpp @@ -8,6 +8,7 @@  // CHECK-LABEL: @main  int main(int argc, char **argv) {  // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(%ident_t* [[DEFLOC:@.+]]) +// CHECK: call void @__kmpc_taskgroup(%ident_t* [[DEFLOC]], i32 [[GTID]])  // CHECK: [[TASKV:%.+]] = call i8* @__kmpc_omp_task_alloc(%ident_t* [[DEFLOC]], i32 [[GTID]], i32 33, i64 72, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, [[TDP_TY:%.+]]*)* [[TASK1:@.+]] to i32 (i32, i8*)*))  // CHECK: [[TASK:%.+]] = bitcast i8* [[TASKV]] to [[TDP_TY]]*  // CHECK: [[TASK_DATA:%.+]] = getelementptr inbounds [[TDP_TY]], [[TDP_TY]]* [[TASK]], i32 0, i32 0 @@ -19,6 +20,7 @@ int main(int argc, char **argv) {  // CHECK: store i64 1, i64* [[ST]],  // CHECK: [[ST_VAL:%.+]] = load i64, i64* [[ST]],  // CHECK: call void @__kmpc_taskloop(%ident_t* [[DEFLOC]], i32 [[GTID]], i8* [[TASKV]], i32 1, i64* [[DOWN]], i64* [[UP]], i64 [[ST_VAL]], i32 0, i32 0, i64 0, i8* null) +// CHECK: call void @__kmpc_end_taskgroup(%ident_t* [[DEFLOC]], i32 [[GTID]])  #pragma omp taskloop priority(argc)    for (int i = 0; i < 10; ++i)      ; @@ -33,10 +35,11 @@ int main(int argc, char **argv) {  // CHECK: store i64 1, i64* [[ST]],  // CHECK: [[ST_VAL:%.+]] = load i64, i64* [[ST]],  // CHECK: [[GRAINSIZE:%.+]] = zext i32 %{{.+}} to i64 -// CHECK: call void @__kmpc_taskloop(%ident_t* [[DEFLOC]], i32 [[GTID]], i8* [[TASKV]], i32 1, i64* [[DOWN]], i64* [[UP]], i64 [[ST_VAL]], i32 1, i32 1, i64 [[GRAINSIZE]], i8* null) +// CHECK: call void @__kmpc_taskloop(%ident_t* [[DEFLOC]], i32 [[GTID]], i8* [[TASKV]], i32 1, i64* [[DOWN]], i64* [[UP]], i64 [[ST_VAL]], i32 0, i32 1, i64 [[GRAINSIZE]], i8* null)  #pragma omp taskloop nogroup grainsize(argc)    for (int i = 0; i < 10; ++i)      ; +// CHECK: call void @__kmpc_taskgroup(%ident_t* [[DEFLOC]], i32 [[GTID]])  // CHECK: [[TASKV:%.+]] = call i8* @__kmpc_omp_task_alloc(%ident_t* [[DEFLOC]], i32 [[GTID]], i32 1, i64 72, i64 24, i32 (i32, i8*)* bitcast (i32 (i32, [[TDP_TY:%.+]]*)* [[TASK3:@.+]] to i32 (i32, i8*)*))  // CHECK: [[TASK:%.+]] = bitcast i8* [[TASKV]] to [[TDP_TY]]*  // CHECK: [[TASK_DATA:%.+]] = getelementptr inbounds [[TDP_TY]], [[TDP_TY]]* [[TASK]], i32 0, i32 0 @@ -50,6 +53,7 @@ int main(int argc, char **argv) {  // CHECK: store i64 1, i64* [[ST]],  // CHECK: [[ST_VAL:%.+]] = load i64, i64* [[ST]],  // CHECK: call void @__kmpc_taskloop(%ident_t* [[DEFLOC]], i32 [[GTID]], i8* [[TASKV]], i32 [[IF_INT]], i64* [[DOWN]], i64* [[UP]], i64 [[ST_VAL]], i32 0, i32 2, i64 4, i8* null) +// CHECK: call void @__kmpc_end_taskgroup(%ident_t* [[DEFLOC]], i32 [[GTID]])    int i;  #pragma omp taskloop if(argc) shared(argc, argv) collapse(2) num_tasks(4)    for (i = 0; i < argc; ++i) diff --git a/test/OpenMP/taskloop_reduction_messages.cpp b/test/OpenMP/taskloop_reduction_messages.cpp new file mode 100644 index 000000000000..7295075c3cb8 --- /dev/null +++ b/test/OpenMP/taskloop_reduction_messages.cpp @@ -0,0 +1,331 @@ +// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 150 -o - %s +// RUN: %clang_cc1 -verify -fopenmp -std=c++98 -ferror-limit 150 -o - %s +// RUN: %clang_cc1 -verify -fopenmp -std=c++11 -ferror-limit 150 -o - %s + +void foo() { +} + +bool foobool(int argc) { +  return argc; +} + +void foobar(int &ref) { +#pragma omp taskloop reduction(+:ref) +  for (int i = 0; i < 10; ++i) +    foo(); +} + +struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}} +extern S1 a; +class S2 { +  mutable int a; +  S2 &operator+(const S2 &arg) { return (*this); } // expected-note 3 {{implicitly declared private here}} + +public: +  S2() : a(0) {} +  S2(S2 &s2) : a(s2.a) {} +  static float S2s; // expected-note 2 {{static data member is predetermined as shared}} +  static const float S2sc; +}; +const float S2::S2sc = 0; // expected-note 2 {{'S2sc' defined here}} +S2 b;                     // expected-note 3 {{'b' defined here}} +const S2 ba[5];           // expected-note 2 {{'ba' defined here}} +class S3 { +  int a; + +public: +  int b; +  S3() : a(0) {} +  S3(const S3 &s3) : a(s3.a) {} +  S3 operator+(const S3 &arg1) { return arg1; } +}; +int operator+(const S3 &arg1, const S3 &arg2) { return 5; } +S3 c;               // expected-note 3 {{'c' defined here}} +const S3 ca[5];     // expected-note 2 {{'ca' defined here}} +extern const int f; // expected-note 4 {{'f' declared here}} +class S4 { +  int a; +  S4(); // expected-note {{implicitly declared private here}} +  S4(const S4 &s4); +  S4 &operator+(const S4 &arg) { return (*this); } + +public: +  S4(int v) : a(v) {} +}; +S4 &operator&=(S4 &arg1, S4 &arg2) { return arg1; } +class S5 { +  int a:32; +  S5() : a(0) {} // expected-note {{implicitly declared private here}} +  S5(const S5 &s5) : a(s5.a) {} +  S5 &operator+(const S5 &arg); + +public: +  S5(int v) : a(v) {} +}; +class S6 { // expected-note 3 {{candidate function (the implicit copy assignment operator) not viable: no known conversion from 'int' to 'const S6' for 1st argument}} +#if __cplusplus >= 201103L // C++11 or later +// expected-note@-2 3 {{candidate function (the implicit move assignment operator) not viable}} +#endif +  int a; + +public: +  S6() : a(6) {} +  operator int() { return 6; } +} o; + +struct S7 { +  int a: 32; +  S7() { +#pragma omp taskloop reduction(+:a) // expected-error {{expected addressable reduction item for the task-based directives}} +    for (int i = 0; i < 10; ++i) +      ++a; +  } +}; + +S3 h, k; +#pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}} + +template <class T>       // expected-note {{declared here}} +T tmain(T argc) { +  const T d = T();       // expected-note 4 {{'d' defined here}} +  const T da[5] = {T()}; // expected-note 2 {{'da' defined here}} +  T qa[5] = {T()}; +  T i; +  T &j = i;                        // expected-note 4 {{'j' defined here}} +  S3 &p = k;                       // expected-note 2 {{'p' defined here}} +  const T &r = da[(int)i];         // expected-note 2 {{'r' defined here}} +  T &q = qa[(int)i];               // expected-note 2 {{'q' defined here}} +  T fl; +#pragma omp taskloop reduction // expected-error {{expected '(' after 'reduction'}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction + // expected-error {{expected '(' after 'reduction'}} expected-warning {{extra tokens at the end of '#pragma omp taskloop' are ignored}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction( // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected ')'}} expected-note {{to match this '('}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(- // expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction() // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(*) // expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected expression}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(\) // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(& : argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{invalid operands to binary expression ('float' and 'float')}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(| : argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{invalid operands to binary expression ('float' and 'float')}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(|| : argc ? i : argc) // expected-error 2 {{expected variable name, array element or array section}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(foo : argc) //expected-error {{incorrect reduction identifier, expected one of '+', '-', '*', '&', '|', '^', '&&', '||', 'min' or 'max' or declare reduction for type 'float'}} expected-error {{incorrect reduction identifier, expected one of '+', '-', '*', '&', '|', '^', '&&', '||', 'min' or 'max' or declare reduction for type 'int'}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(&& : argc) +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(^ : T) // expected-error {{'T' does not refer to a value}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(+ : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 3 {{const-qualified list item cannot be reduction}} expected-error 2 {{'operator+' is a private member of 'S2'}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(min : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 4 {{arguments of OpenMP clause 'reduction' for 'min' or 'max' must be of arithmetic type}} expected-error 3 {{const-qualified list item cannot be reduction}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(max : h.b) // expected-error {{expected variable name, array element or array section}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(+ : ba) // expected-error {{const-qualified list item cannot be reduction}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(* : ca) // expected-error {{const-qualified list item cannot be reduction}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(- : da) // expected-error {{const-qualified list item cannot be reduction}} expected-error {{const-qualified list item cannot be reduction}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(^ : fl) // expected-error {{invalid operands to binary expression ('float' and 'float')}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(&& : S2::S2s) // expected-error {{shared variable cannot be reduction}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(&& : S2::S2sc) // expected-error {{const-qualified list item cannot be reduction}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(+ : h, k) // expected-error {{threadprivate or thread local variable cannot be reduction}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(+ : o) // expected-error 2 {{no viable overloaded '='}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop private(i), reduction(+ : j), reduction(+ : q) // expected-error 4 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp parallel private(k) +#pragma omp taskloop reduction(+ : p), reduction(+ : p) // expected-error 2 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(+ : p), reduction(+ : p) // expected-error 2 {{variable can appear only once in OpenMP 'reduction' clause}} expected-note 2 {{previously referenced here}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(+ : r) // expected-error 2 {{const-qualified list item cannot be reduction}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp parallel shared(i) +#pragma omp parallel reduction(min : i) +#pragma omp taskloop reduction(max : j) // expected-error 2 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp parallel private(fl) +#pragma omp taskloop reduction(+ : fl) +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp parallel reduction(* : fl) +#pragma omp taskloop reduction(+ : fl) +  for (int i = 0; i < 10; ++i) +    foo(); + +  return T(); +} + +namespace A { +double x; +#pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}} +} +namespace B { +using A::x; +} + +int main(int argc, char **argv) { +  const int d = 5;       // expected-note 2 {{'d' defined here}} +  const int da[5] = {0}; // expected-note {{'da' defined here}} +  int qa[5] = {0}; +  S4 e(4); +  S5 g(5); +  int i; +  int &j = i;                      // expected-note 2 {{'j' defined here}} +  S3 &p = k;                       // expected-note 2 {{'p' defined here}} +  const int &r = da[i];            // expected-note {{'r' defined here}} +  int &q = qa[i];                  // expected-note {{'q' defined here}} +  float fl; +#pragma omp taskloop reduction // expected-error {{expected '(' after 'reduction'}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction + // expected-error {{expected '(' after 'reduction'}} expected-warning {{extra tokens at the end of '#pragma omp taskloop' are ignored}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction( // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected ')'}} expected-note {{to match this '('}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(- // expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction() // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(*) // expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected expression}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(\) // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(foo : argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{incorrect reduction identifier, expected one of '+', '-', '*', '&', '|', '^', '&&', '||', 'min' or 'max'}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(| : argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(|| : argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name, array element or array section}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(~ : argc) // expected-error {{expected unqualified-id}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(&& : argc) +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(^ : S1) // expected-error {{'S1' does not refer to a value}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(+ : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 2 {{const-qualified list item cannot be reduction}} expected-error {{'operator+' is a private member of 'S2'}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(min : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 2 {{arguments of OpenMP clause 'reduction' for 'min' or 'max' must be of arithmetic type}} expected-error 2 {{const-qualified list item cannot be reduction}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(max : h.b) // expected-error {{expected variable name, array element or array section}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(+ : ba) // expected-error {{const-qualified list item cannot be reduction}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(* : ca) // expected-error {{const-qualified list item cannot be reduction}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(- : da) // expected-error {{const-qualified list item cannot be reduction}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(^ : fl) // expected-error {{invalid operands to binary expression ('float' and 'float')}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(&& : S2::S2s) // expected-error {{shared variable cannot be reduction}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(&& : S2::S2sc) // expected-error {{const-qualified list item cannot be reduction}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(& : e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{invalid operands to binary expression ('S4' and 'S4')}} expected-error {{calling a private constructor of class 'S5'}} expected-error {{invalid operands to binary expression ('S5' and 'S5')}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(+ : h, k, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be reduction}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(+ : o) // expected-error {{no viable overloaded '='}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop private(i), reduction(+ : j), reduction(+ : q) // expected-error 2 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp parallel private(k) +#pragma omp taskloop reduction(+ : p), reduction(+ : p) // expected-error 2 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(+ : p), reduction(+ : p) // expected-error {{variable can appear only once in OpenMP 'reduction' clause}} expected-note {{previously referenced here}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop reduction(+ : r) // expected-error {{const-qualified list item cannot be reduction}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp parallel shared(i) +#pragma omp parallel reduction(min : i) +#pragma omp taskloop reduction(max : j) // expected-error {{argument of OpenMP clause 'reduction' must reference the same object in all threads}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp parallel private(fl) +#pragma omp taskloop reduction(+ : fl) +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp parallel reduction(* : fl) +#pragma omp taskloop reduction(+ : fl) +  for (int i = 0; i < 10; ++i) +    foo(); +  static int m; +#pragma omp taskloop reduction(+ : m) // OK +  for (int i = 0; i < 10; ++i) +    m++; +#pragma omp taskloop nogroup reduction(+ : m) // expected-error {{'reduction' clause cannot be used with 'nogroup' clause}} +  for (int i = 0; i < 10; ++i) +    m++; + +  return tmain(argc) + tmain(fl); // expected-note {{in instantiation of function template specialization 'tmain<int>' requested here}} expected-note {{in instantiation of function template specialization 'tmain<float>' requested here}} +} diff --git a/test/OpenMP/taskloop_simd_ast_print.cpp b/test/OpenMP/taskloop_simd_ast_print.cpp index 9bee8f7f93fd..8678b9122e29 100644 --- a/test/OpenMP/taskloop_simd_ast_print.cpp +++ b/test/OpenMP/taskloop_simd_ast_print.cpp @@ -21,7 +21,7 @@ T tmain(T argc) {  // CHECK-NEXT: for (int i = 0; i < 2; ++i)  // CHECK-NEXT: a = 2;  #pragma omp parallel -#pragma omp taskloop simd private(argc, b), firstprivate(c, d), lastprivate(d, f) collapse(N) shared(g) if (c) final(d) mergeable priority(f) simdlen(N) nogroup num_tasks(N) reduction(min:a) +#pragma omp taskloop simd private(argc, b), firstprivate(c, d), lastprivate(d, f) collapse(N) shared(g) if (c) final(d) mergeable priority(f) simdlen(N) nogroup num_tasks(N)    for (int i = 0; i < 2; ++i)      for (int j = 0; j < 2; ++j)        for (int j = 0; j < 2; ++j) @@ -34,7 +34,7 @@ T tmain(T argc) {            for (int j = 0; j < 2; ++j)              foo();    // CHECK-NEXT: #pragma omp parallel -  // CHECK-NEXT: #pragma omp taskloop simd private(argc,b) firstprivate(c,d) lastprivate(d,f) collapse(N) shared(g) if(c) final(d) mergeable priority(f) simdlen(N) nogroup num_tasks(N) reduction(min: a) +  // CHECK-NEXT: #pragma omp taskloop simd private(argc,b) firstprivate(c,d) lastprivate(d,f) collapse(N) shared(g) if(c) final(d) mergeable priority(f) simdlen(N) nogroup num_tasks(N)    // CHECK-NEXT: for (int i = 0; i < 2; ++i)    // CHECK-NEXT: for (int j = 0; j < 2; ++j)    // CHECK-NEXT: for (int j = 0; j < 2; ++j) @@ -54,8 +54,8 @@ int main(int argc, char **argv) {    int b = argc, c, d, e, f, g;    static int a;  // CHECK: static int a; -#pragma omp taskloop simd if(taskloop: a) default(none) shared(a) final(b) priority(5) safelen(8) linear(b), aligned(argv) nogroup num_tasks(argc) reduction(*: g) -  // CHECK-NEXT: #pragma omp taskloop simd if(taskloop: a) default(none) shared(a) final(b) priority(5) safelen(8) linear(b) aligned(argv) nogroup num_tasks(argc) reduction(*: g) +#pragma omp taskloop simd if(taskloop: a) default(none) shared(a) final(b) priority(5) safelen(8) linear(b), aligned(argv) num_tasks(argc) reduction(*: g) +  // CHECK-NEXT: #pragma omp taskloop simd if(taskloop: a) default(none) shared(a) final(b) priority(5) safelen(8) linear(b) aligned(argv) num_tasks(argc) reduction(*: g)    for (int i = 0; i < 2; ++i)      a = 2;  // CHECK-NEXT: for (int i = 0; i < 2; ++i) diff --git a/test/OpenMP/taskloop_simd_codegen.cpp b/test/OpenMP/taskloop_simd_codegen.cpp index 60ba5f22129b..48c6f479e9fa 100644 --- a/test/OpenMP/taskloop_simd_codegen.cpp +++ b/test/OpenMP/taskloop_simd_codegen.cpp @@ -8,6 +8,7 @@  // CHECK-LABEL: @main  int main(int argc, char **argv) {  // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(%ident_t* [[DEFLOC:@.+]]) +// CHECK: call void @__kmpc_taskgroup(%ident_t* [[DEFLOC]], i32 [[GTID]])  // CHECK: [[TASKV:%.+]] = call i8* @__kmpc_omp_task_alloc(%ident_t* [[DEFLOC]], i32 [[GTID]], i32 33, i64 72, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, [[TDP_TY:%.+]]*)* [[TASK1:@.+]] to i32 (i32, i8*)*))  // CHECK: [[TASK:%.+]] = bitcast i8* [[TASKV]] to [[TDP_TY]]*  // CHECK: [[TASK_DATA:%.+]] = getelementptr inbounds [[TDP_TY]], [[TDP_TY]]* [[TASK]], i32 0, i32 0 @@ -19,6 +20,7 @@ int main(int argc, char **argv) {  // CHECK: store i64 1, i64* [[ST]],  // CHECK: [[ST_VAL:%.+]] = load i64, i64* [[ST]],  // CHECK: call void @__kmpc_taskloop(%ident_t* [[DEFLOC]], i32 [[GTID]], i8* [[TASKV]], i32 1, i64* [[DOWN]], i64* [[UP]], i64 [[ST_VAL]], i32 0, i32 0, i64 0, i8* null) +// CHECK: call void @__kmpc_end_taskgroup(%ident_t* [[DEFLOC]], i32 [[GTID]])  #pragma omp taskloop simd priority(argc)    for (int i = 0; i < 10; ++i)      ; @@ -33,10 +35,11 @@ int main(int argc, char **argv) {  // CHECK: store i64 1, i64* [[ST]],  // CHECK: [[ST_VAL:%.+]] = load i64, i64* [[ST]],  // CHECK: [[GRAINSIZE:%.+]] = zext i32 %{{.+}} to i64 -// CHECK: call void @__kmpc_taskloop(%ident_t* [[DEFLOC]], i32 [[GTID]], i8* [[TASKV]], i32 1, i64* [[DOWN]], i64* [[UP]], i64 [[ST_VAL]], i32 1, i32 1, i64 [[GRAINSIZE]], i8* null) +// CHECK: call void @__kmpc_taskloop(%ident_t* [[DEFLOC]], i32 [[GTID]], i8* [[TASKV]], i32 1, i64* [[DOWN]], i64* [[UP]], i64 [[ST_VAL]], i32 0, i32 1, i64 [[GRAINSIZE]], i8* null)  #pragma omp taskloop simd nogroup grainsize(argc) simdlen(4)    for (int i = 0; i < 10; ++i)      ; +// CHECK: call void @__kmpc_taskgroup(%ident_t* [[DEFLOC]], i32 [[GTID]])  // CHECK: [[TASKV:%.+]] = call i8* @__kmpc_omp_task_alloc(%ident_t* [[DEFLOC]], i32 [[GTID]], i32 1, i64 72, i64 24, i32 (i32, i8*)* bitcast (i32 (i32, [[TDP_TY:%.+]]*)* [[TASK3:@.+]] to i32 (i32, i8*)*))  // CHECK: [[TASK:%.+]] = bitcast i8* [[TASKV]] to [[TDP_TY]]*  // CHECK: [[TASK_DATA:%.+]] = getelementptr inbounds [[TDP_TY]], [[TDP_TY]]* [[TASK]], i32 0, i32 0 @@ -50,6 +53,7 @@ int main(int argc, char **argv) {  // CHECK: store i64 1, i64* [[ST]],  // CHECK: [[ST_VAL:%.+]] = load i64, i64* [[ST]],  // CHECK: call void @__kmpc_taskloop(%ident_t* [[DEFLOC]], i32 [[GTID]], i8* [[TASKV]], i32 [[IF_INT]], i64* [[DOWN]], i64* [[UP]], i64 [[ST_VAL]], i32 0, i32 2, i64 4, i8* null) +// CHECK: call void @__kmpc_end_taskgroup(%ident_t* [[DEFLOC]], i32 [[GTID]])    int i;  #pragma omp taskloop simd if(argc) shared(argc, argv) collapse(2) num_tasks(4) safelen(32)    for (i = 0; i < argc; ++i) diff --git a/test/OpenMP/taskloop_simd_reduction_messages.cpp b/test/OpenMP/taskloop_simd_reduction_messages.cpp new file mode 100644 index 000000000000..f9739f708a28 --- /dev/null +++ b/test/OpenMP/taskloop_simd_reduction_messages.cpp @@ -0,0 +1,331 @@ +// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 150 -o - %s +// RUN: %clang_cc1 -verify -fopenmp -std=c++98 -ferror-limit 150 -o - %s +// RUN: %clang_cc1 -verify -fopenmp -std=c++11 -ferror-limit 150 -o - %s + +void foo() { +} + +bool foobool(int argc) { +  return argc; +} + +void foobar(int &ref) { +#pragma omp taskloop simd reduction(+:ref) +  for (int i = 0; i < 10; ++i) +    foo(); +} + +struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}} +extern S1 a; +class S2 { +  mutable int a; +  S2 &operator+(const S2 &arg) { return (*this); } // expected-note 3 {{implicitly declared private here}} + +public: +  S2() : a(0) {} +  S2(S2 &s2) : a(s2.a) {} +  static float S2s; // expected-note 2 {{static data member is predetermined as shared}} +  static const float S2sc; +}; +const float S2::S2sc = 0; // expected-note 2 {{'S2sc' defined here}} +S2 b;                     // expected-note 3 {{'b' defined here}} +const S2 ba[5];           // expected-note 2 {{'ba' defined here}} +class S3 { +  int a; + +public: +  int b; +  S3() : a(0) {} +  S3(const S3 &s3) : a(s3.a) {} +  S3 operator+(const S3 &arg1) { return arg1; } +}; +int operator+(const S3 &arg1, const S3 &arg2) { return 5; } +S3 c;               // expected-note 3 {{'c' defined here}} +const S3 ca[5];     // expected-note 2 {{'ca' defined here}} +extern const int f; // expected-note 4 {{'f' declared here}} +class S4 { +  int a; +  S4(); // expected-note {{implicitly declared private here}} +  S4(const S4 &s4); +  S4 &operator+(const S4 &arg) { return (*this); } + +public: +  S4(int v) : a(v) {} +}; +S4 &operator&=(S4 &arg1, S4 &arg2) { return arg1; } +class S5 { +  int a; +  S5() : a(0) {} // expected-note {{implicitly declared private here}} +  S5(const S5 &s5) : a(s5.a) {} +  S5 &operator+(const S5 &arg); + +public: +  S5(int v) : a(v) {} +}; +class S6 { // expected-note 3 {{candidate function (the implicit copy assignment operator) not viable: no known conversion from 'int' to 'const S6' for 1st argument}} +#if __cplusplus >= 201103L // C++11 or later +// expected-note@-2 3 {{candidate function (the implicit move assignment operator) not viable}} +#endif +  int a; + +public: +  S6() : a(6) {} +  operator int() { return 6; } +} o; + +struct S7 { +  int a: 32; +  S7() { +#pragma omp taskloop reduction(+:a) // expected-error {{expected addressable reduction item for the task-based directives}} +    for (int i = 0; i < 10; ++i) +      ++a; +  } +}; + +S3 h, k; +#pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}} + +template <class T>       // expected-note {{declared here}} +T tmain(T argc) { +  const T d = T();       // expected-note 4 {{'d' defined here}} +  const T da[5] = {T()}; // expected-note 2 {{'da' defined here}} +  T qa[5] = {T()}; +  T i; +  T &j = i;                        // expected-note 4 {{'j' defined here}} +  S3 &p = k;                       // expected-note 2 {{'p' defined here}} +  const T &r = da[(int)i];         // expected-note 2 {{'r' defined here}} +  T &q = qa[(int)i];               // expected-note 2 {{'q' defined here}} +  T fl; +#pragma omp taskloop simd reduction // expected-error {{expected '(' after 'reduction'}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction + // expected-error {{expected '(' after 'reduction'}} expected-warning {{extra tokens at the end of '#pragma omp taskloop simd' are ignored}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction( // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected ')'}} expected-note {{to match this '('}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(- // expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction() // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(*) // expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected expression}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(\) // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(& : argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{invalid operands to binary expression ('float' and 'float')}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(| : argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{invalid operands to binary expression ('float' and 'float')}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(|| : argc ? i : argc) // expected-error 2 {{expected variable name, array element or array section}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(foo : argc) //expected-error {{incorrect reduction identifier, expected one of '+', '-', '*', '&', '|', '^', '&&', '||', 'min' or 'max' or declare reduction for type 'float'}} expected-error {{incorrect reduction identifier, expected one of '+', '-', '*', '&', '|', '^', '&&', '||', 'min' or 'max' or declare reduction for type 'int'}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(&& : argc) +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(^ : T) // expected-error {{'T' does not refer to a value}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(+ : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 3 {{const-qualified list item cannot be reduction}} expected-error 2 {{'operator+' is a private member of 'S2'}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(min : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 4 {{arguments of OpenMP clause 'reduction' for 'min' or 'max' must be of arithmetic type}} expected-error 3 {{const-qualified list item cannot be reduction}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(max : h.b) // expected-error {{expected variable name, array element or array section}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(+ : ba) // expected-error {{const-qualified list item cannot be reduction}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(* : ca) // expected-error {{const-qualified list item cannot be reduction}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(- : da) // expected-error {{const-qualified list item cannot be reduction}} expected-error {{const-qualified list item cannot be reduction}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(^ : fl) // expected-error {{invalid operands to binary expression ('float' and 'float')}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(&& : S2::S2s) // expected-error {{shared variable cannot be reduction}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(&& : S2::S2sc) // expected-error {{const-qualified list item cannot be reduction}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(+ : h, k) // expected-error {{threadprivate or thread local variable cannot be reduction}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(+ : o) // expected-error 2 {{no viable overloaded '='}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd private(i), reduction(+ : j), reduction(+ : q) // expected-error 4 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp parallel private(k) +#pragma omp taskloop simd reduction(+ : p), reduction(+ : p) // expected-error 2 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(+ : p), reduction(+ : p) // expected-error 2 {{variable can appear only once in OpenMP 'reduction' clause}} expected-note 2 {{previously referenced here}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(+ : r) // expected-error 2 {{const-qualified list item cannot be reduction}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp parallel shared(i) +#pragma omp parallel reduction(min : i) +#pragma omp taskloop simd reduction(max : j) // expected-error 2 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp parallel private(fl) +#pragma omp taskloop simd reduction(+ : fl) +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp parallel reduction(* : fl) +#pragma omp taskloop simd reduction(+ : fl) +  for (int i = 0; i < 10; ++i) +    foo(); + +  return T(); +} + +namespace A { +double x; +#pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}} +} +namespace B { +using A::x; +} + +int main(int argc, char **argv) { +  const int d = 5;       // expected-note 2 {{'d' defined here}} +  const int da[5] = {0}; // expected-note {{'da' defined here}} +  int qa[5] = {0}; +  S4 e(4); +  S5 g(5); +  int i; +  int &j = i;                      // expected-note 2 {{'j' defined here}} +  S3 &p = k;                       // expected-note 2 {{'p' defined here}} +  const int &r = da[i];            // expected-note {{'r' defined here}} +  int &q = qa[i];                  // expected-note {{'q' defined here}} +  float fl; +#pragma omp taskloop simd reduction // expected-error {{expected '(' after 'reduction'}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction + // expected-error {{expected '(' after 'reduction'}} expected-warning {{extra tokens at the end of '#pragma omp taskloop simd' are ignored}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction( // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected ')'}} expected-note {{to match this '('}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(- // expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction() // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(*) // expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected expression}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(\) // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(foo : argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{incorrect reduction identifier, expected one of '+', '-', '*', '&', '|', '^', '&&', '||', 'min' or 'max'}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(| : argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(|| : argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name, array element or array section}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(~ : argc) // expected-error {{expected unqualified-id}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(&& : argc) +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(^ : S1) // expected-error {{'S1' does not refer to a value}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(+ : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 2 {{const-qualified list item cannot be reduction}} expected-error {{'operator+' is a private member of 'S2'}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(min : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 2 {{arguments of OpenMP clause 'reduction' for 'min' or 'max' must be of arithmetic type}} expected-error 2 {{const-qualified list item cannot be reduction}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(max : h.b) // expected-error {{expected variable name, array element or array section}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(+ : ba) // expected-error {{const-qualified list item cannot be reduction}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(* : ca) // expected-error {{const-qualified list item cannot be reduction}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(- : da) // expected-error {{const-qualified list item cannot be reduction}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(^ : fl) // expected-error {{invalid operands to binary expression ('float' and 'float')}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(&& : S2::S2s) // expected-error {{shared variable cannot be reduction}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(&& : S2::S2sc) // expected-error {{const-qualified list item cannot be reduction}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(& : e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{invalid operands to binary expression ('S4' and 'S4')}} expected-error {{calling a private constructor of class 'S5'}} expected-error {{invalid operands to binary expression ('S5' and 'S5')}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(+ : h, k, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be reduction}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(+ : o) // expected-error {{no viable overloaded '='}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd private(i), reduction(+ : j), reduction(+ : q) // expected-error 2 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp parallel private(k) +#pragma omp taskloop simd reduction(+ : p), reduction(+ : p) // expected-error 2 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(+ : p), reduction(+ : p) // expected-error {{variable can appear only once in OpenMP 'reduction' clause}} expected-note {{previously referenced here}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp taskloop simd reduction(+ : r) // expected-error {{const-qualified list item cannot be reduction}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp parallel shared(i) +#pragma omp parallel reduction(min : i) +#pragma omp taskloop simd reduction(max : j) // expected-error {{argument of OpenMP clause 'reduction' must reference the same object in all threads}} +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp parallel private(fl) +#pragma omp taskloop simd reduction(+ : fl) +  for (int i = 0; i < 10; ++i) +    foo(); +#pragma omp parallel reduction(* : fl) +#pragma omp taskloop simd reduction(+ : fl) +  for (int i = 0; i < 10; ++i) +    foo(); +  static int m; +#pragma omp taskloop simd reduction(+ : m) // OK +  for (int i = 0; i < 10; ++i) +    m++; +#pragma omp taskloop simd reduction(+ : m) nogroup // expected-error {{'reduction' clause cannot be used with 'nogroup' clause}} +  for (int i = 0; i < 10; ++i) +    m++; + +  return tmain(argc) + tmain(fl); // expected-note {{in instantiation of function template specialization 'tmain<int>' requested here}} expected-note {{in instantiation of function template specialization 'tmain<float>' requested here}} +} diff --git a/test/Preprocessor/init.c b/test/Preprocessor/init.c index 0bd9e9784599..0ee7edecb3c4 100644 --- a/test/Preprocessor/init.c +++ b/test/Preprocessor/init.c @@ -2185,13 +2185,13 @@  // ARMV6-CLOUDABI:#define __CloudABI__ 1  // ARMV6-CLOUDABI:#define __arm__ 1 -// RUN: %clang_cc1 -E -dM -ffreestanding -triple=arm-netbsd-eabi < /dev/null | FileCheck -match-full-lines -check-prefix ARM-NETBSD %s -// +// RUN: %clang -E -dM -ffreestanding -target arm-netbsd-eabi %s -o - | FileCheck -match-full-lines -check-prefix ARM-NETBSD %s +  // ARM-NETBSD-NOT:#define _LP64  // ARM-NETBSD:#define __APCS_32__ 1  // ARM-NETBSD-NOT:#define __ARMEB__ 1  // ARM-NETBSD:#define __ARMEL__ 1 -// ARM-NETBSD:#define __ARM_ARCH_4T__ 1 +// ARM-NETBSD:#define __ARM_ARCH_5TE__ 1  // ARM-NETBSD:#define __ARM_DWARF_EH__ 1  // ARM-NETBSD:#define __ARM_EABI__ 1  // ARM-NETBSD-NOT:#define __ARM_BIG_ENDIAN 1 @@ -2333,6 +2333,7 @@  // ARM-NETBSD:#define __SIZE_MAX__ 4294967295UL  // ARM-NETBSD:#define __SIZE_TYPE__ long unsigned int  // ARM-NETBSD:#define __SIZE_WIDTH__ 32 +// ARM-NETBSD:#define __SOFTFP__ 1  // ARM-NETBSD:#define __UINT16_C_SUFFIX__  // ARM-NETBSD:#define __UINT16_MAX__ 65535  // ARM-NETBSD:#define __UINT16_TYPE__ unsigned short @@ -2377,6 +2378,11 @@  // ARM-NETBSD:#define __arm 1  // ARM-NETBSD:#define __arm__ 1 +// RUN: %clang -E -dM -ffreestanding -target arm-netbsd-eabihf %s -o - | FileCheck -match-full-lines -check-prefix ARMHF-NETBSD %s +// ARMHF-NETBSD:#define __SIZE_WIDTH__ 32 +// ARMHF-NETBSD-NOT:#define __SOFTFP__ 1 +// ARMHF-NETBSD:#define __UINT16_C_SUFFIX__ +  // RUN: %clang_cc1 -E -dM -ffreestanding -triple=arm-none-eabi < /dev/null | FileCheck -match-full-lines -check-prefix ARM-NONE-EABI %s  // RUN: %clang_cc1 -E -dM -ffreestanding -triple=arm-none-eabihf < /dev/null | FileCheck -match-full-lines -check-prefix ARM-NONE-EABI %s  // RUN: %clang_cc1 -E -dM -ffreestanding -triple=aarch64-none-eabi < /dev/null | FileCheck -match-full-lines -check-prefix ARM-NONE-EABI %s diff --git a/test/Rewriter/objc-modern-metadata-visibility2.mm b/test/Rewriter/objc-modern-metadata-visibility2.mm new file mode 100644 index 000000000000..4e64ac4beb46 --- /dev/null +++ b/test/Rewriter/objc-modern-metadata-visibility2.mm @@ -0,0 +1,45 @@ +// REQUIRES: abi-breaking-checks +// NOTE: This test has been split from objc-modern-metadata-visibility.mm in +// order to test with -reverse-iterate as this flag is only present with +// ABI_BREAKING_CHECKS. + +// RUN: %clang_cc1 -E %s -o %t.mm -mllvm -reverse-iterate +// RUN: %clang_cc1 -x objective-c++ -fblocks -fms-extensions -rewrite-objc %t.mm -mllvm -reverse-iterate -o - | FileCheck %s +// rdar://11144048 + +@class NSString; + +@interface NSObject { +    Class isa; +} +@end + +@interface Sub : NSObject { +    int subIvar; +    NSString *nsstring; +@private +    id PrivateIvar; +} +@end + +@implementation Sub +- (id) MyNSString { return subIvar ? PrivateIvar : nsstring; } +@end + +@interface NSString @end +@implementation NSString @end + +// CHECK: __declspec(allocate(".objc_ivar$B")) extern "C" __declspec(dllimport) unsigned long OBJC_IVAR_$_Sub$subIvar; +// CHECK: __declspec(allocate(".objc_ivar$B")) extern "C" unsigned long OBJC_IVAR_$_Sub$PrivateIvar; +// CHECK: __declspec(allocate(".objc_ivar$B")) extern "C" __declspec(dllimport) unsigned long OBJC_IVAR_$_Sub$nsstring; +// CHECK: #pragma warning(disable:4273) +// CHECK: __declspec(allocate(".objc_ivar$B")) extern "C" __declspec(dllexport) unsigned long int OBJC_IVAR_$_Sub$subIvar +// CHECK: __declspec(allocate(".objc_ivar$B")) extern "C" __declspec(dllexport) unsigned long int OBJC_IVAR_$_Sub$nsstring +// CHECK: __declspec(allocate(".objc_ivar$B")) extern "C" unsigned long int OBJC_IVAR_$_Sub$PrivateIvar +// CHECK: extern "C" __declspec(dllimport) struct _class_t OBJC_METACLASS_$_NSObject; +// CHECK: extern "C" __declspec(dllexport) struct _class_t OBJC_METACLASS_$_Sub +// CHECK: extern "C" __declspec(dllimport) struct _class_t OBJC_CLASS_$_NSObject; +// CHECK: extern "C" __declspec(dllexport) struct _class_t OBJC_CLASS_$_Sub +// CHECK: extern "C" __declspec(dllexport) struct _class_t OBJC_CLASS_$_NSString; +// CHECK: extern "C" __declspec(dllexport) struct _class_t OBJC_METACLASS_$_NSString +// CHECK: extern "C" __declspec(dllexport) struct _class_t OBJC_CLASS_$_NSString diff --git a/test/Sema/address-packed.c b/test/Sema/address-packed.c index 2799e19c48f1..b0519bacd758 100644 --- a/test/Sema/address-packed.c +++ b/test/Sema/address-packed.c @@ -329,3 +329,12 @@ void g13(void) {    uint32_t *p32;    p32 = &a[0].x; // no-warning  } + +struct Invalid0 { +  void *x; +  struct fwd f; // expected-error {{incomplete type}} expected-note {{forward declaration}} +} __attribute__((packed)); + +void *g14(struct Invalid0 *ivl) { +  return &(ivl->x); +} diff --git a/test/Sema/attr-availability.c b/test/Sema/attr-availability.c index e105037c8ed0..1b8cbd256ce9 100644 --- a/test/Sema/attr-availability.c +++ b/test/Sema/attr-availability.c @@ -21,6 +21,9 @@ ATSFontGetPostScriptName(int flags) __attribute__((availability(macosx,introduce  extern void  PartiallyAvailable() __attribute__((availability(macosx,introduced=10.8))); +#ifdef WARN_PARTIAL +// expected-note@+2 2 {{marked partial here}} +#endif  enum __attribute__((availability(macosx,introduced=10.8))) PartialEnum {    kPartialEnumConstant,  }; @@ -35,11 +38,19 @@ void test_10095131() {    PartiallyAvailable();  } +#ifdef WARN_PARTIAL +// FIXME: This note should point to the declaration with the availability +// attribute. +// expected-note@+2 {{marked partial here}} +#endif  extern void PartiallyAvailable() ;  void with_redeclaration() { -  PartiallyAvailable();  // Don't warn. - -  // enums should never warn. +#ifdef WARN_PARTIAL +  // expected-warning@+4 {{'PartiallyAvailable' is only available on macOS 10.8 or newer}} expected-note@+4 {{__builtin_available}} +  // expected-warning@+4 {{'PartialEnum' is only available on macOS 10.8 or newer}} expected-note@+4 {{__builtin_available}} +  // expected-warning@+3 {{'kPartialEnumConstant' is only available on macOS 10.8 or newer}} expected-note@+3 {{__builtin_available}} +#endif +  PartiallyAvailable();    enum PartialEnum p = kPartialEnumConstant;  } @@ -86,13 +97,13 @@ enum Original {    OriginalUnavailable __attribute__((availability(macosx, unavailable))) // expected-note + {{'OriginalUnavailable' has been explicitly marked unavailable here}}  }; -enum AllDeprecated { -  AllDeprecatedCase, // expected-note + {{'AllDeprecatedCase' has been explicitly marked deprecated here}} +enum AllDeprecated { // expected-note + {{'AllDeprecated' has been explicitly marked deprecated here}} +  AllDeprecatedCase,    AllDeprecatedUnavailable __attribute__((availability(macosx, unavailable))) // expected-note + {{'AllDeprecatedUnavailable' has been explicitly marked unavailable here}}  } __attribute__((availability(macosx, deprecated=10.2))); -enum AllUnavailable { -  AllUnavailableCase, // expected-note + {{'AllUnavailableCase' has been explicitly marked unavailable here}} +enum AllUnavailable { // expected-note + {{'AllUnavailable' has been explicitly marked unavailable here}} +  AllUnavailableCase,  } __attribute__((availability(macosx, unavailable)));  enum User { diff --git a/test/Sema/attr-deprecated.c b/test/Sema/attr-deprecated.c index 89c06860fb4e..9eeef5aed57d 100644 --- a/test/Sema/attr-deprecated.c +++ b/test/Sema/attr-deprecated.c @@ -104,9 +104,9 @@ foo_dep test17, // expected-warning {{'foo_dep' is deprecated}}          test19;  // rdar://problem/8518751 -enum __attribute__((deprecated)) Test20 { // expected-note {{'Test20' has been explicitly marked deprecated here}} +enum __attribute__((deprecated)) Test20 { // expected-note 2 {{'Test20' has been explicitly marked deprecated here}}    test20_a __attribute__((deprecated)), // expected-note {{'test20_a' has been explicitly marked deprecated here}} -  test20_b // expected-note {{'test20_b' has been explicitly marked deprecated here}} +  test20_b  };  void test20() {    enum Test20 f; // expected-warning {{'Test20' is deprecated}} diff --git a/test/Sema/attr-unavailable-message.c b/test/Sema/attr-unavailable-message.c index 415cb2f079a2..70d5947086f9 100644 --- a/test/Sema/attr-unavailable-message.c +++ b/test/Sema/attr-unavailable-message.c @@ -36,13 +36,13 @@ void unavail(void) {  // rdar://10201690  enum foo { -    a = 1, // expected-note {{'a' has been explicitly marked deprecated here}} +    a = 1,      b __attribute__((deprecated())) = 2, // expected-note {{'b' has been explicitly marked deprecated here}}      c = 3 -}__attribute__((deprecated())); +}__attribute__((deprecated())); // expected-note {{'foo' has been explicitly marked deprecated here}} -enum fee { // expected-note {{'fee' has been explicitly marked unavailable here}} -    r = 1, // expected-note {{'r' has been explicitly marked unavailable here}} +enum fee { // expected-note 2 {{'fee' has been explicitly marked unavailable here}} +    r = 1,      s = 2,      t = 3  }__attribute__((unavailable())); diff --git a/test/Sema/loop-control.c b/test/Sema/loop-control.c index 6c33e8437bd0..1fc35d10218e 100644 --- a/test/Sema/loop-control.c +++ b/test/Sema/loop-control.c @@ -119,3 +119,51 @@ void pr8880_23(int x, int y) {      for ( ; ({ ++y; break; y;}); ++y) {} // expected-warning{{'break' is bound to loop, GCC binds it to switch}}    }  } + +void pr32648_1(int x, int y) { +  switch(x) { +  case 1: +    for ( ; ({ ++y; switch (y) { case 0: break; } y;}); ++y) {} // no warning +  } +} + +void pr32648_2(int x, int y) { +  while(x) { +    for ( ; ({ ++y; switch (y) { case 0: continue; } y;}); ++y) {}  // expected-warning {{'continue' is bound to current loop, GCC binds it to the enclosing loop}} +  } +} + +void pr32648_3(int x, int y) { +  switch(x) { +  case 1: +    for ( ; ({ ++y; for (; y; y++) { break; } y;}); ++y) {} // no warning +  } +} + +void pr32648_4(int x, int y) { +  switch(x) { +  case 1: +    for ( ; ({ ++y; for (({ break; }); y; y++) { } y;}); ++y) {} // expected-warning{{'break' is bound to loop, GCC binds it to switch}} +  } +} + +void pr32648_5(int x, int y) { +  switch(x) { +  case 1: +    for ( ; ({ ++y; while (({ break; y; })) {} y;}); ++y) {} // expected-warning{{'break' is bound to current loop, GCC binds it to the enclosing loop}} +  } +} + +void pr32648_6(int x, int y) { +  switch(x) { +  case 1: +    for ( ; ({ ++y; do {} while (({ break; y; })); y;}); ++y) {} // expected-warning{{'break' is bound to current loop, GCC binds it to the enclosing loop}} +  } +} + +void pr32648_7(int x, int y) { +  switch(x) { +  case 1: +    for ( ; ({ ++y; do { break; } while (y); y;}); ++y) {} // no warning +  } +} diff --git a/test/Sema/warn-cast-qual.c b/test/Sema/warn-cast-qual.c index dc11f5717ebe..a682cad75ed6 100644 --- a/test/Sema/warn-cast-qual.c +++ b/test/Sema/warn-cast-qual.c @@ -1,4 +1,5 @@  // RUN: %clang_cc1 -triple x86_64-unknown-unknown -fsyntax-only -Wcast-qual -verify %s +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -x c++ -fsyntax-only -Wcast-qual -verify %s  #include <stdint.h> @@ -26,4 +27,34 @@ void foo() {    const char **charptrptrc;    char **charptrptr = (char **)charptrptrc; // expected-warning {{cast from 'const char *' to 'char *' drops const qualifier}} + +  const char *constcharptr; +  char *charptr = (char *)constcharptr; // expected-warning {{cast from 'const char *' to 'char *' drops const qualifier}} +  const char *constcharptr2 = (char *)constcharptr; // expected-warning {{cast from 'const char *' to 'char *' drops const qualifier}} +  const char *charptr2 = (char *)charptr; // no warning +} + +void bar_0() { +  struct C { +    const int a; +    int b; +  }; + +  const struct C S = {0, 0}; + +  *(int *)(&S.a) = 0; // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}} +  *(int *)(&S.b) = 0; // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}} +} + +void bar_1() { +  struct C { +    const int a; +    int b; +  }; + +  struct C S = {0, 0}; +  S.b = 0; // no warning + +  *(int *)(&S.a) = 0; // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}} +  *(int *)(&S.b) = 0; // no warning  } diff --git a/test/Sema/warn-documentation.cpp b/test/Sema/warn-documentation.cpp index 0c92b2aa029f..ccf374ccd060 100644 --- a/test/Sema/warn-documentation.cpp +++ b/test/Sema/warn-documentation.cpp @@ -1186,7 +1186,7 @@ class Predicate  /// @brief A C++ wrapper class for providing threaded access to a value  /// of type T.  /// -/// A template specilization class. +/// A template specialization class.  //----------------------------------------------------------------------  template<> class Predicate<int, char>  { diff --git a/test/SemaCXX/amdgpu-sizeof-alignof.cpp b/test/SemaCXX/amdgpu-sizeof-alignof.cpp new file mode 100644 index 000000000000..97da71a1a3e2 --- /dev/null +++ b/test/SemaCXX/amdgpu-sizeof-alignof.cpp @@ -0,0 +1,47 @@ +// RUN: %clang_cc1 -triple amdgcn---amdgiz -std=c++11 -fsyntax-only -verify %s +// expected-no-diagnostics +typedef __SIZE_TYPE__ size_t; +typedef __PTRDIFF_TYPE__ ptrdiff_t; +typedef __INTPTR_TYPE__ intptr_t; +typedef __UINTPTR_TYPE__ uintptr_t; +typedef __attribute__((address_space(1))) void *global_ptr_t; +typedef __attribute__((address_space(2))) void *constant_ptr_t; +typedef __attribute__((address_space(3))) void *local_ptr_t; +typedef __attribute__((address_space(5))) void *private_ptr_t; + +void test() { +  static_assert(sizeof(size_t) == 8, "bad size"); +  static_assert(alignof(size_t) == 8, "bad alignment"); +  static_assert(sizeof(intptr_t) == 8, "bad size"); +  static_assert(alignof(intptr_t) == 8, "bad alignment"); +  static_assert(sizeof(uintptr_t) == 8, "bad size"); +  static_assert(alignof(uintptr_t) == 8, "bad alignment"); +  static_assert(sizeof(ptrdiff_t) == 8, "bad size"); +  static_assert(alignof(ptrdiff_t) == 8, "bad alignment"); + +  static_assert(sizeof(char) == 1, "bad size"); +  static_assert(alignof(char) == 1, "bad alignment"); +  static_assert(sizeof(short) == 2, "bad size"); +  static_assert(alignof(short) == 2, "bad alignment"); +  static_assert(sizeof(int) == 4, "bad size"); +  static_assert(alignof(int) == 4, "bad alignment"); +  static_assert(sizeof(long) == 8, "bad size"); +  static_assert(alignof(long) == 8, "bad alignment"); +  static_assert(sizeof(long long) == 8, "bad size"); +  static_assert(alignof(long long) == 8, "bad alignment"); +  static_assert(sizeof(float) == 4, "bad size"); +  static_assert(alignof(float) == 4, "bad alignment"); +  static_assert(sizeof(double) == 8, "bad size"); +  static_assert(alignof(double) == 8, "bad alignment"); + +  static_assert(sizeof(void*) == 8, "bad size"); +  static_assert(alignof(void*) == 8, "bad alignment"); +  static_assert(sizeof(global_ptr_t) == 8, "bad size"); +  static_assert(alignof(global_ptr_t) == 8, "bad alignment"); +  static_assert(sizeof(constant_ptr_t) == 8, "bad size"); +  static_assert(alignof(constant_ptr_t) == 8, "bad alignment"); +  static_assert(sizeof(local_ptr_t) == 4, "bad size"); +  static_assert(alignof(local_ptr_t) == 4, "bad alignment"); +  static_assert(sizeof(private_ptr_t) == 4, "bad size"); +  static_assert(alignof(private_ptr_t) == 4, "bad alignment"); +} diff --git a/test/SemaCXX/attr-deprecated.cpp b/test/SemaCXX/attr-deprecated.cpp index 1680c5c6760d..5ba55f0c23b5 100644 --- a/test/SemaCXX/attr-deprecated.cpp +++ b/test/SemaCXX/attr-deprecated.cpp @@ -199,8 +199,8 @@ namespace test5 {  // rdar://problem/8518751  namespace test6 { -  enum __attribute__((deprecated)) A { // expected-note {{'A' has been explicitly marked deprecated here}} -    a0 // expected-note {{'a0' has been explicitly marked deprecated here}} +  enum __attribute__((deprecated)) A { // expected-note 2 {{'A' has been explicitly marked deprecated here}} +    a0    };    void testA() {      A x; // expected-warning {{'A' is deprecated}} @@ -218,8 +218,8 @@ namespace test6 {    }    template <class T> struct C { -    enum __attribute__((deprecated)) Enum { // expected-note {{'Enum' has been explicitly marked deprecated here}} -      c0 // expected-note {{'c0' has been explicitly marked deprecated here}} +    enum __attribute__((deprecated)) Enum { // expected-note 2 {{'Enum' has been explicitly marked deprecated here}} +      c0      };    };    void testC() { diff --git a/test/SemaCXX/coroutines.cpp b/test/SemaCXX/coroutines.cpp index 4eedc2162f07..6394829f356a 100644 --- a/test/SemaCXX/coroutines.cpp +++ b/test/SemaCXX/coroutines.cpp @@ -22,8 +22,24 @@ void no_coroutine_traits() {  namespace std {  namespace experimental { -template <typename... T> -struct coroutine_traits; // expected-note {{declared here}} + +template <class... Args> +struct void_t_imp { +  using type = void; +}; +template <class... Args> +using void_t = typename void_t_imp<Args...>::type; + +template <class T, class = void> +struct traits_sfinae_base {}; + +template <class T> +struct traits_sfinae_base<T, void_t<typename T::promise_type>> { +  using promise_type = typename T::promise_type; +}; + +template <class Ret, class... Args> +struct coroutine_traits : public traits_sfinae_base<Ret> {};  }}  // namespace std::experimental  template<typename Promise> struct coro {}; @@ -50,8 +66,9 @@ struct suspend_never {    void await_resume() {}  }; -void no_specialization() { -  co_await a; // expected-error {{implicit instantiation of undefined template 'std::experimental::coroutine_traits<void>'}} +struct DummyVoidTag {}; +DummyVoidTag no_specialization() { // expected-error {{this function cannot be a coroutine: 'std::experimental::coroutine_traits<DummyVoidTag>' has no member named 'promise_type'}} +  co_await a;  }  template <typename... T> @@ -905,3 +922,243 @@ void test_dependent_param(T t, U) {    co_return 42;  }  template void test_dependent_param(NoCopy<0>, NoCopy<1>); // expected-note {{requested here}} + +namespace CoroHandleMemberFunctionTest { +struct CoroMemberTag {}; +struct BadCoroMemberTag {}; + +template <class T, class U> +constexpr bool IsSameV = false; +template <class T> +constexpr bool IsSameV<T, T> = true; + +template <class T> +struct TypeTest { +  template <class U> +  static constexpr bool IsSame = IsSameV<T, U>; + +  template <class... Args> +  static constexpr bool MatchesArgs = IsSameV<T, +                                              std::experimental::coroutine_traits<CoroMemberTag, Args...>>; +}; + +template <class T> +struct AwaitReturnsType { +  bool await_ready() const; +  void await_suspend(...) const; +  T await_resume() const; +}; + +template <class... CoroTraitsArgs> +struct CoroMemberPromise { +  using TraitsT = std::experimental::coroutine_traits<CoroTraitsArgs...>; +  using TypeTestT = TypeTest<TraitsT>; +  using AwaitTestT = AwaitReturnsType<TypeTestT>; + +  CoroMemberTag get_return_object(); +  suspend_always initial_suspend(); +  suspend_always final_suspend(); + +  AwaitTestT yield_value(int); + +  void return_void(); +  void unhandled_exception(); +}; + +} // namespace CoroHandleMemberFunctionTest + +template <class... Args> +struct ::std::experimental::coroutine_traits<CoroHandleMemberFunctionTest::CoroMemberTag, Args...> { +  using promise_type = CoroHandleMemberFunctionTest::CoroMemberPromise<CoroHandleMemberFunctionTest::CoroMemberTag, Args...>; +}; + +namespace CoroHandleMemberFunctionTest { +struct TestType { + +  CoroMemberTag test_qual() { +    auto TC = co_yield 0; +    static_assert(TC.MatchesArgs<TestType &>, ""); +    static_assert(!TC.MatchesArgs<TestType>, ""); +    static_assert(!TC.MatchesArgs<TestType *>, ""); +  } + +  CoroMemberTag test_sanity(int *) const { +    auto TC = co_yield 0; +    static_assert(TC.MatchesArgs<const TestType &>, ""); // expected-error {{static_assert failed}} +    static_assert(TC.MatchesArgs<const TestType &>, ""); // expected-error {{static_assert failed}} +    static_assert(TC.MatchesArgs<const TestType &, int *>, ""); +  } + +  CoroMemberTag test_qual(int *, const float &&, volatile void *volatile) const { +    auto TC = co_yield 0; +    static_assert(TC.MatchesArgs<const TestType &, int *, const float &&, volatile void *volatile>, ""); +  } + +  CoroMemberTag test_qual() const volatile { +    auto TC = co_yield 0; +    static_assert(TC.MatchesArgs<const volatile TestType &>, ""); +  } + +  CoroMemberTag test_ref_qual() & { +    auto TC = co_yield 0; +    static_assert(TC.MatchesArgs<TestType &>, ""); +  } +  CoroMemberTag test_ref_qual() const & { +    auto TC = co_yield 0; +    static_assert(TC.MatchesArgs<TestType const &>, ""); +  } +  CoroMemberTag test_ref_qual() && { +    auto TC = co_yield 0; +    static_assert(TC.MatchesArgs<TestType &&>, ""); +  } +  CoroMemberTag test_ref_qual(const char *&) const volatile && { +    auto TC = co_yield 0; +    static_assert(TC.MatchesArgs<TestType const volatile &&, const char *&>, ""); +  } + +  CoroMemberTag test_args(int) { +    auto TC = co_yield 0; +    static_assert(TC.MatchesArgs<TestType &, int>, ""); +  } +  CoroMemberTag test_args(int, long &, void *) const { +    auto TC = co_yield 0; +    static_assert(TC.MatchesArgs<TestType const &, int, long &, void *>, ""); +  } + +  template <class... Args> +  CoroMemberTag test_member_template(Args...) const && { +    auto TC = co_yield 0; +    static_assert(TC.template MatchesArgs<TestType const &&, Args...>, ""); +  } + +  static CoroMemberTag test_static() { +    auto TC = co_yield 0; +    static_assert(TC.MatchesArgs<>, ""); +    static_assert(!TC.MatchesArgs<TestType>, ""); +    static_assert(!TC.MatchesArgs<TestType &>, ""); +    static_assert(!TC.MatchesArgs<TestType *>, ""); +  } + +  static CoroMemberTag test_static(volatile void *const, char &&) { +    auto TC = co_yield 0; +    static_assert(TC.MatchesArgs<volatile void *const, char &&>, ""); +  } + +  template <class Dummy> +  static CoroMemberTag test_static_template(const char *volatile &, unsigned) { +    auto TC = co_yield 0; +    using TCT = decltype(TC); +    static_assert(TCT::MatchesArgs<const char *volatile &, unsigned>, ""); +    static_assert(!TCT::MatchesArgs<TestType &, const char *volatile &, unsigned>, ""); +  } + +  BadCoroMemberTag test_diagnostics() { +    // expected-error@-1 {{this function cannot be a coroutine: 'std::experimental::coroutine_traits<CoroHandleMemberFunctionTest::BadCoroMemberTag, CoroHandleMemberFunctionTest::TestType &>' has no member named 'promise_type'}} +    co_return; +  } +  BadCoroMemberTag test_diagnostics(int) const && { +    // expected-error@-1 {{this function cannot be a coroutine: 'std::experimental::coroutine_traits<CoroHandleMemberFunctionTest::BadCoroMemberTag, const CoroHandleMemberFunctionTest::TestType &&, int>' has no member named 'promise_type'}} +    co_return; +  } + +  static BadCoroMemberTag test_static_diagnostics(long *) { +    // expected-error@-1 {{this function cannot be a coroutine: 'std::experimental::coroutine_traits<CoroHandleMemberFunctionTest::BadCoroMemberTag, long *>' has no member named 'promise_type'}} +    co_return; +  } +}; + +template CoroMemberTag TestType::test_member_template(long, const char *) const &&; +template CoroMemberTag TestType::test_static_template<void>(const char *volatile &, unsigned); + +template <class... Args> +struct DepTestType { + +  CoroMemberTag test_sanity(int *) const { +    auto TC = co_yield 0; +    static_assert(TC.template MatchesArgs<const DepTestType &>, ""); // expected-error {{static_assert failed}} +    static_assert(TC.template MatchesArgs<>, ""); // expected-error {{static_assert failed}} +    static_assert(TC.template MatchesArgs<const DepTestType &, int *>, ""); +  } + +  CoroMemberTag test_qual() { +    auto TC = co_yield 0; +    static_assert(TC.template MatchesArgs<DepTestType &>, ""); +    static_assert(!TC.template MatchesArgs<DepTestType>, ""); +    static_assert(!TC.template MatchesArgs<DepTestType *>, ""); +  } + +  CoroMemberTag test_qual(int *, const float &&, volatile void *volatile) const { +    auto TC = co_yield 0; +    static_assert(TC.template MatchesArgs<const DepTestType &, int *, const float &&, volatile void *volatile>, ""); +  } + +  CoroMemberTag test_qual() const volatile { +    auto TC = co_yield 0; +    static_assert(TC.template MatchesArgs<const volatile DepTestType &>, ""); +  } + +  CoroMemberTag test_ref_qual() & { +    auto TC = co_yield 0; +    static_assert(TC.template MatchesArgs<DepTestType &>, ""); +  } +  CoroMemberTag test_ref_qual() const & { +    auto TC = co_yield 0; +    static_assert(TC.template MatchesArgs<DepTestType const &>, ""); +  } +  CoroMemberTag test_ref_qual() && { +    auto TC = co_yield 0; +    static_assert(TC.template MatchesArgs<DepTestType &&>, ""); +  } +  CoroMemberTag test_ref_qual(const char *&) const volatile && { +    auto TC = co_yield 0; +    static_assert(TC.template MatchesArgs<DepTestType const volatile &&, const char *&>, ""); +  } + +  CoroMemberTag test_args(int) { +    auto TC = co_yield 0; +    static_assert(TC.template MatchesArgs<DepTestType &, int>, ""); +  } +  CoroMemberTag test_args(int, long &, void *) const { +    auto TC = co_yield 0; +    static_assert(TC.template MatchesArgs<DepTestType const &, int, long &, void *>, ""); +  } + +  template <class... UArgs> +  CoroMemberTag test_member_template(UArgs...) const && { +    auto TC = co_yield 0; +    static_assert(TC.template MatchesArgs<DepTestType const &&, UArgs...>, ""); +  } + +  static CoroMemberTag test_static() { +    auto TC = co_yield 0; +    using TCT = decltype(TC); +    static_assert(TCT::MatchesArgs<>, ""); +    static_assert(!TCT::MatchesArgs<DepTestType>, ""); +    static_assert(!TCT::MatchesArgs<DepTestType &>, ""); +    static_assert(!TCT::MatchesArgs<DepTestType *>, ""); + +    // Ensure diagnostics are actually being generated here +    static_assert(TCT::MatchesArgs<int>, ""); // expected-error {{static_assert failed}} +  } + +  static CoroMemberTag test_static(volatile void *const, char &&) { +    auto TC = co_yield 0; +    using TCT = decltype(TC); +    static_assert(TCT::MatchesArgs<volatile void *const, char &&>, ""); +  } + +  template <class Dummy> +  static CoroMemberTag test_static_template(const char *volatile &, unsigned) { +    auto TC = co_yield 0; +    using TCT = decltype(TC); +    static_assert(TCT::MatchesArgs<const char *volatile &, unsigned>, ""); +    static_assert(!TCT::MatchesArgs<DepTestType &, const char *volatile &, unsigned>, ""); +  } +}; + +template struct DepTestType<int>; // expected-note {{requested here}} +template CoroMemberTag DepTestType<int>::test_member_template(long, const char *) const &&; + +template CoroMemberTag DepTestType<int>::test_static_template<void>(const char *volatile &, unsigned); + +} // namespace CoroHandleMemberFunctionTest diff --git a/test/SemaCXX/dllimport-memptr.cpp b/test/SemaCXX/dllimport-memptr.cpp new file mode 100644 index 000000000000..35bf5b8610b5 --- /dev/null +++ b/test/SemaCXX/dllimport-memptr.cpp @@ -0,0 +1,7 @@ +// RUN: %clang_cc1 -triple x86_64-windows-msvc -fms-extensions -verify -std=c++11 %s + +// expected-no-diagnostics + +struct __declspec(dllimport) Foo { int get_a(); }; +template <int (Foo::*Getter)()> struct HasValue { }; +HasValue<&Foo::get_a> hv; diff --git a/test/SemaCXX/modules-ts.cppm b/test/SemaCXX/modules-ts.cppm index 29122ec7dab5..2ea4958bffda 100644 --- a/test/SemaCXX/modules-ts.cppm +++ b/test/SemaCXX/modules-ts.cppm @@ -13,7 +13,13 @@ export module foo;  // expected-note@modules-ts.cppm:* {{loaded from}}  #endif -static int m; // ok, internal linkage, so no redefinition error +static int m; +#if TEST == 2 // FIXME: 'm' has internal linkage, so there should be no error here +// expected-error@-2 {{redefinition of '}} +// expected-note@-3 {{unguarded header; consider using #ifdef guards or #pragma once}} +// FIXME: We should drop the "header from" in this diagnostic. +// expected-note-re@modules-ts.cppm:1 {{'{{.*}}modules-ts.cppm' included multiple times, additional include site in header from module 'foo'}} +#endif  int n;  #if TEST >= 2  // expected-error@-2 {{redefinition of '}} diff --git a/test/SemaCXX/warn-cast-qual.cpp b/test/SemaCXX/warn-cast-qual.cpp new file mode 100644 index 000000000000..d1f0cc73a63d --- /dev/null +++ b/test/SemaCXX/warn-cast-qual.cpp @@ -0,0 +1,140 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -fsyntax-only -Wcast-qual -verify %s + +#include <stdint.h> + +// do *NOT* warn on const_cast<>() +// use clang-tidy's cppcoreguidelines-pro-type-const-cast for that. +void foo_ptr() { +  const char *const ptr = 0; +  char *t0 = const_cast<char *>(ptr); // no warning + +  volatile char *ptr2 = 0; +  char *t1 = const_cast<char *>(ptr2); // no warning + +  const volatile char *ptr3 = 0; +  char *t2 = const_cast<char *>(ptr3); // no warning +} + +void cstr() { +  void* p0 = (void*)(const void*)"txt"; // expected-warning {{cast from 'const void *' to 'void *' drops const qualifier}} +  void* p1 = (void*)"txt"; // FIXME +  char* p2 = (char*)"txt"; // expected-warning {{cast from 'const char *' to 'char *' drops const qualifier}} +} + +void foo_0() { +  const int a = 0; + +  const int &a0 = a;              // no warning +  const int &a1 = (const int &)a; // no warning + +  int &a2 = (int &)a;                      // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}} +  const int &a3 = (int &)a;                // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}} +  int &a4 = (int &)((const int &)a);       // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}} +  int &a5 = (int &)((int &)a);             // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}} +  const int &a6 = (int &)((int &)a);       // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}} +  const int &a7 = (int &)((const int &)a); // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}} +  const int &a8 = (const int &)((int &)a); // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}} +} + +void foo_1() { +  volatile int a = 0; + +  volatile int &a0 = a;                 // no warning +  volatile int &a1 = (volatile int &)a; // no warning + +  int &a2 = (int &)a;                            // expected-warning {{cast from 'volatile int' to 'int &' drops volatile qualifier}} +  volatile int &a3 = (int &)a;                   // expected-warning {{cast from 'volatile int' to 'int &' drops volatile qualifier}} +  int &a4 = (int &)((volatile int &)a);          // expected-warning {{cast from 'volatile int' to 'int &' drops volatile qualifier}} +  int &a5 = (int &)((int &)a);                   // expected-warning {{cast from 'volatile int' to 'int &' drops volatile qualifier}} +  volatile int &a6 = (int &)((int &)a);          // expected-warning {{cast from 'volatile int' to 'int &' drops volatile qualifier}} +  volatile int &a7 = (int &)((volatile int &)a); // expected-warning {{cast from 'volatile int' to 'int &' drops volatile qualifier}} +  volatile int &a8 = (volatile int &)((int &)a); // expected-warning {{cast from 'volatile int' to 'int &' drops volatile qualifier}} +} + +void foo_2() { +  const volatile int a = 0; + +  const volatile int &a0 = a;                       // no warning +  const volatile int &a1 = (const volatile int &)a; // no warning + +  int &a2 = (int &)a;                                        // expected-warning {{cast from 'const volatile int' to 'int &' drops const and volatile qualifiers}} +  const volatile int &a3 = (int &)a;                         // expected-warning {{cast from 'const volatile int' to 'int &' drops const and volatile qualifiers}} +  int &a4 = (int &)((const volatile int &)a);                // expected-warning {{cast from 'const volatile int' to 'int &' drops const and volatile qualifiers}} +  int &a5 = (int &)((int &)a);                               // expected-warning {{cast from 'const volatile int' to 'int &' drops const and volatile qualifiers}} +  const volatile int &a6 = (int &)((int &)a);                // expected-warning {{cast from 'const volatile int' to 'int &' drops const and volatile qualifiers}} +  const volatile int &a7 = (int &)((const volatile int &)a); // expected-warning {{cast from 'const volatile int' to 'int &' drops const and volatile qualifiers}} +  const volatile int &a8 = (const volatile int &)((int &)a); // expected-warning {{cast from 'const volatile int' to 'int &' drops const and volatile qualifiers}} +} + +void bar_0() { +  const int *_a = 0; +  const int **a = &_a; + +  int **a0 = (int **)((const int **)a); // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}} +  int **a1 = (int **)((int **)a);       // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}} + +  // const int **a2 = (int **)((int **)a); +  // const int **a3 = (int **)((const int **)a); + +  const int **a4 = (const int **)((int **)a);        // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}} expected-warning {{cast from 'int **' to 'const int **' must have all intermediate pointers const qualified to be safe}} +  const int **a5 = (const int **)((const int **)a); // no warning +} + +void bar_1() { +  const int *_a = 0; +  const int *&a = _a; + +  int *&a0 = (int *&)((const int *&)a); // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}} +  int *&a1 = (int *&)((int *&)a);       // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}} + +  // const int *&a2 = (int *&)((int *&)a); +  // const int *&a3 = (int *&)((const int *&)a); + +  const int *&a4 = (const int *&)((int *&)a);        // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}} expected-warning {{cast from 'int *' to 'const int *&' must have all intermediate pointers const qualified to be safe}} +  const int *&a5 = (const int *&)((const int *&)a); // no warning +} + +void baz_0() { +  struct C { +    void A() {} +    void B() const {} +  }; + +  const C S; +  S.B(); + +  ((C &)S).B(); // expected-warning {{cast from 'const C' to 'C &' drops const qualifier}} +  ((C &)S).A(); // expected-warning {{cast from 'const C' to 'C &' drops const qualifier}} + +  ((C *)&S)->B(); // expected-warning {{cast from 'const C *' to 'C *' drops const qualifier}} +  ((C *)&S)->A(); // expected-warning {{cast from 'const C *' to 'C *' drops const qualifier}} +} + +void baz_1() { +  struct C { +    const int a; +    int b; + +    C() : a(0) {} +  }; + +  { +    C S; +    S.b = 0; + +    (int &)(S.a) = 0; // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}} +    (int &)(S.b) = 0; // no warning + +    *(int *)(&S.a) = 0; // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}} +    *(int *)(&S.b) = 0; // no warning +  } +  { +    const C S; + +    (int &)(S.a) = 0; // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}} +    (int &)(S.b) = 0; // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}} + +    *(int *)(&S.a) = 0; // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}} +    *(int *)(&S.b) = 0; // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}} +  } +} diff --git a/test/SemaCXX/warn-loop-analysis.cpp b/test/SemaCXX/warn-loop-analysis.cpp index 25ec7a7862ed..2934003848a2 100644 --- a/test/SemaCXX/warn-loop-analysis.cpp +++ b/test/SemaCXX/warn-loop-analysis.cpp @@ -202,6 +202,12 @@ void test7() {      if (true) continue;      i--;    } + +  // But do warn if the continue is in a nested loop. +  for (;;i--) { // expected-note{{decremented here}} +    for (int j = 0; j < 10; ++j) continue; +    i--; // expected-warning{{decremented both}} +  }  }  struct iterator { @@ -259,6 +265,12 @@ void test8() {      if (true) continue;      i--;    } + +  // But do warn if the continue is in a nested loop. +  for (;;i--) { // expected-note{{decremented here}} +    for (int j = 0; j < 10; ++j) continue; +    i--; // expected-warning{{decremented both}} +  }  }  int f(int); diff --git a/test/SemaCXX/warn-throw-out-noexcept-func.cpp b/test/SemaCXX/warn-throw-out-noexcept-func.cpp index fc2919a1e327..67ffbd93940a 100644 --- a/test/SemaCXX/warn-throw-out-noexcept-func.cpp +++ b/test/SemaCXX/warn-throw-out-noexcept-func.cpp @@ -2,8 +2,8 @@  struct A_ShouldDiag {    ~A_ShouldDiag(); // implicitly noexcept(true)  }; -A_ShouldDiag::~A_ShouldDiag() { // expected-note {{destructor or deallocator has a (possibly implicit) non-throwing excepton specification}} -  throw 1; // expected-warning {{has a non-throwing exception specification but can still throw, resulting in unexpected program termination}} +A_ShouldDiag::~A_ShouldDiag() { // expected-note {{destructor has a implicit non-throwing exception specification}} +  throw 1; // expected-warning {{has a non-throwing exception specification but can still throw}}  }  struct B_ShouldDiag {    int i; @@ -11,7 +11,7 @@ struct B_ShouldDiag {  };  struct R_ShouldDiag : A_ShouldDiag {    B_ShouldDiag b; -  ~R_ShouldDiag() {     // expected-note  {{destructor or deallocator has a}} +  ~R_ShouldDiag() { // expected-note  {{destructor has a implicit non-throwing exception specification}}      throw 1; // expected-warning {{has a non-throwing exception specification but}}    }  }; @@ -30,18 +30,18 @@ struct N_ShouldDiag {    ~N_ShouldDiag(); //implicitly noexcept(true)  }; -N_ShouldDiag::~N_ShouldDiag() {  // expected-note  {{destructor or deallocator has a}} +N_ShouldDiag::~N_ShouldDiag() { // expected-note  {{destructor has a implicit non-throwing exception specification}}    throw 1; // expected-warning {{has a non-throwing exception specification but}}  }  struct X_ShouldDiag {    B_ShouldDiag b; -  ~X_ShouldDiag() noexcept { // expected-note  {{destructor or deallocator has a}} -    throw 1;      // expected-warning {{has a non-throwing exception specification but}} +  ~X_ShouldDiag() noexcept { // expected-note  {{destructor has a non-throwing exception}} +    throw 1; // expected-warning {{has a non-throwing exception specification but}}    }  };  struct Y_ShouldDiag : A_ShouldDiag { -  ~Y_ShouldDiag() noexcept(true) { // expected-note  {{destructor or deallocator has a}} -    throw 1;            // expected-warning {{has a non-throwing exception specification but}} +  ~Y_ShouldDiag() noexcept(true) { // expected-note  {{destructor has a non-throwing exception specification}} +    throw 1; // expected-warning {{has a non-throwing exception specification but}}    }  };  struct C_ShouldNotDiag { @@ -54,7 +54,7 @@ struct D_ShouldNotDiag {      throw 1;    }  }; -struct E_ShouldNotDiag  { +struct E_ShouldNotDiag {    C_ShouldNotDiag c;    ~E_ShouldNotDiag(); //implicitly noexcept(false)  }; @@ -68,7 +68,7 @@ class A1_ShouldDiag {    T b;  public: -  ~A1_ShouldDiag() {    // expected-note  {{destructor or deallocator has a}} +  ~A1_ShouldDiag() { // expected-note  {{destructor has a implicit non-throwing exception specification}}      throw 1; // expected-warning {{has a non-throwing exception specification but}}    }  }; @@ -81,19 +81,19 @@ template <typename T>  struct R1_ShouldDiag : A1_ShouldDiag<T> //expected-note {{in instantiation of member function}}  {    B1_ShouldDiag<T> b; -  ~R1_ShouldDiag() {    // expected-note  {{destructor or deallocator has a}} +  ~R1_ShouldDiag() { // expected-note  {{destructor has a implicit non-throwing exception specification}}      throw 1; // expected-warning {{has a non-throwing exception specification but}}    }  };  template <typename T>  struct S1_ShouldDiag : A1_ShouldDiag<T> {    B1_ShouldDiag<T> b; -  ~S1_ShouldDiag() noexcept { // expected-note  {{destructor or deallocator has a}} -    throw 1;       // expected-warning {{has a non-throwing exception specification but}} +  ~S1_ShouldDiag() noexcept { // expected-note  {{destructor has a non-throwing exception specification}} +    throw 1; // expected-warning {{has a non-throwing exception specification but}}    }  }; -void operator delete(void *ptr) noexcept { // expected-note  {{destructor or deallocator has a}} -  throw 1;                                 // expected-warning {{has a non-throwing exception specification but}} +void operator delete(void *ptr) noexcept { // expected-note  {{deallocator has a non-throwing exception specification}} +  throw 1; // expected-warning {{has a non-throwing exception specification but}}  }  struct except_fun {    static const bool i = false; @@ -109,18 +109,18 @@ struct dependent_warn {  };  template <typename T>  struct dependent_warn_noexcept { -  ~dependent_warn_noexcept() noexcept(T::i) { // expected-note  {{destructor or deallocator has a}} -    throw 1;                                  // expected-warning {{has a non-throwing exception specification but}} +  ~dependent_warn_noexcept() noexcept(T::i) { // expected-note  {{destructor has a non-throwing exception specification}} +    throw 1; // expected-warning {{has a non-throwing exception specification but}}    }  };  template <typename T>  struct dependent_warn_both { -  ~dependent_warn_both() noexcept(T::i) { // expected-note  {{destructor or deallocator has a}} -    throw 1;                              // expected-warning {{has a non-throwing exception specification but}} +  ~dependent_warn_both() noexcept(T::i) { // expected-note  {{destructor has a non-throwing exception specification}} +    throw 1; // expected-warning {{has a non-throwing exception specification but}}    }  }; -void foo() noexcept { //expected-note {{non-throwing function declare here}} -  throw 1;            // expected-warning {{has a non-throwing exception specification but}} +void foo() noexcept { //expected-note {{function declared non-throwing here}} +  throw 1; // expected-warning {{has a non-throwing exception specification but}}  }  struct Throws {    ~Throws() noexcept(false); @@ -128,14 +128,14 @@ struct Throws {  struct ShouldDiagnose {    Throws T; -  ~ShouldDiagnose() noexcept { //expected-note {{destructor or deallocator has a}} +  ~ShouldDiagnose() noexcept { //expected-note {{destructor has a non-throwing exception specification}}      throw; // expected-warning {{has a non-throwing exception specification but}}    }  };  struct ShouldNotDiagnose {    Throws T; -  ~ShouldNotDiagnose() {  -    throw;  +  ~ShouldNotDiagnose() { +    throw;    }  }; @@ -158,21 +158,21 @@ void g_ShouldNotDiag() noexcept {    }  } -void h_ShouldDiag() noexcept { //expected-note {{non-throwing function declare here}} +void h_ShouldDiag() noexcept { //expected-note {{function declared non-throwing here}}    try {      throw 12; // expected-warning {{has a non-throwing exception specification but}}    } catch (const char *) {    }  } -void i_ShouldDiag() noexcept { //expected-note {{non-throwing function declare here}} +void i_ShouldDiag() noexcept { //expected-note {{function declared non-throwing here}}    try {      throw 12;    } catch (int) {      throw; // expected-warning {{has a non-throwing exception specification but}}    }  } -void j_ShouldDiag() noexcept { //expected-note {{non-throwing function declare here}} +void j_ShouldDiag() noexcept { //expected-note {{function declared non-throwing here}}    try {      throw 12;    } catch (int) { @@ -180,7 +180,7 @@ void j_ShouldDiag() noexcept { //expected-note {{non-throwing function declare h    }  } -void k_ShouldDiag() noexcept { //expected-note {{non-throwing function declare here}} +void k_ShouldDiag() noexcept { //expected-note {{function declared non-throwing here}}    try {      throw 12;    } catch (...) { @@ -188,7 +188,7 @@ void k_ShouldDiag() noexcept { //expected-note {{non-throwing function declare h    }  } -void loo_ShouldDiag(int i) noexcept { //expected-note {{non-throwing function declare here}} +void loo_ShouldDiag(int i) noexcept { //expected-note {{function declared non-throwing here}}    if (i)      try {        throw 12; @@ -203,13 +203,13 @@ void loo1_ShouldNotDiag() noexcept {      throw 12;  } -void loo2_ShouldDiag() noexcept { //expected-note {{non-throwing function declare here}} +void loo2_ShouldDiag() noexcept { //expected-note {{function declared non-throwing here}}    if (1)      throw 12; // expected-warning {{has a non-throwing exception specification but}}  }  struct S {}; -void l_ShouldDiag() noexcept { //expected-note {{non-throwing function declare here}} +void l_ShouldDiag() noexcept { //expected-note {{function declared non-throwing here}}    try {      throw S{}; //expected-warning {{has a non-throwing exception specification but}}    } catch (S *s) { @@ -222,7 +222,6 @@ void m_ShouldNotDiag() noexcept {      throw s;    } catch (S s) {    } -  }  void n_ShouldNotDiag() noexcept {    try { @@ -231,7 +230,7 @@ void n_ShouldNotDiag() noexcept {    } catch (const S &s) {    }  } -void o_ShouldDiag() noexcept { //expected-note {{non-throwing function declare here}} +void o_ShouldDiag() noexcept { //expected-note {{function declared non-throwing here}}    try {      throw; //expected-warning {{has a non-throwing exception specification but}}    } catch (...) { @@ -239,7 +238,7 @@ void o_ShouldDiag() noexcept { //expected-note {{non-throwing function declare h  }  #define NOEXCEPT noexcept -void with_macro() NOEXCEPT { //expected-note {{non-throwing function declare here}} +void with_macro() NOEXCEPT { //expected-note {{function declared non-throwing here}}    throw 1; // expected-warning {{has a non-throwing exception specification but}}  } @@ -248,8 +247,8 @@ void with_try_block() try {  } catch (...) {  } -void with_try_block1() noexcept try { //expected-note {{non-throwing function declare here}} -  throw 2;  // expected-warning {{has a non-throwing exception specification but}} +void with_try_block1() noexcept try { //expected-note {{function declared non-throwing here}} +  throw 2; // expected-warning {{has a non-throwing exception specification but}}  } catch (char *) {  } @@ -272,20 +271,20 @@ void goodPointer() noexcept {      throw &d;    } catch (B *) {}  } -void badPlain() noexcept { // expected-note {{non-throwing function declare here}} +void badPlain() noexcept { //expected-note {{function declared non-throwing here}}    try { -    throw B(); // expected-warning {{'badPlain' has a non-throwing exception specification but can still throw, resulting in unexpected program termination}} +    throw B(); // expected-warning {{'badPlain' has a non-throwing exception specification but can still throw}}    } catch (D) {}  } -void badReference() noexcept { // expected-note {{non-throwing function declare here}} +void badReference() noexcept { //expected-note {{function declared non-throwing here}}    try { -    throw B(); // expected-warning {{'badReference' has a non-throwing exception specification but can still throw, resulting in unexpected program termination}} +    throw B(); // expected-warning {{'badReference' has a non-throwing exception specification but can still throw}}    } catch (D &) {}  } -void badPointer() noexcept { // expected-note {{non-throwing function declare here}} +void badPointer() noexcept { //expected-note {{function declared non-throwing here}}    B b;    try { -    throw &b; // expected-warning {{'badPointer' has a non-throwing exception specification but can still throw, resulting in unexpected program termination}} +    throw &b; // expected-warning {{'badPointer' has a non-throwing exception specification but can still throw}}    } catch (D *) {}  }  } diff --git a/test/SemaObjC/attr-availability.m b/test/SemaObjC/attr-availability.m index 02b7c5c81491..1245ac7409b8 100644 --- a/test/SemaObjC/attr-availability.m +++ b/test/SemaObjC/attr-availability.m @@ -13,7 +13,7 @@  @interface A <P>  - (void)method __attribute__((availability(macosx,introduced=10.1,deprecated=10.2))); // expected-note {{'method' has been explicitly marked deprecated here}}  #if defined(WARN_PARTIAL) -  // expected-note@+2 {{'partialMethod' has been explicitly marked partial here}} +  // expected-note@+2 2 {{'partialMethod' has been explicitly marked partial here}}  #endif  - (void)partialMethod __attribute__((availability(macosx,introduced=10.8))); @@ -66,7 +66,10 @@ void f(A *a, B *b) {  @end  void f_after_redecl(A *a, B *b) { -  [a partialMethod]; // no warning +#ifdef WARN_PARTIAL +  // expected-warning@+2{{'partialMethod' is only available on macOS 10.8 or newer}} expected-note@+2 {{@available}} +#endif +  [a partialMethod];    [b partialMethod]; // no warning    [a partial_proto_method]; // no warning    [b partial_proto_method]; // no warning @@ -133,6 +136,10 @@ id NSNibOwner, topNibObjects;  @end  @interface PartialI <PartialProt> +#ifdef WARN_PARTIAL +// expected-note@+3{{marked partial here}} +// expected-note@+3{{marked partial here}} +#endif  - (void)partialMethod __attribute__((availability(macosx,introduced=10.8)));  + (void)partialMethod __attribute__((availability(macosx,introduced=10.8)));  @end @@ -160,14 +167,20 @@ id NSNibOwner, topNibObjects;  @end  void partialfun(PartialI* a) { -  [a partialMethod]; // no warning +#ifdef WARN_PARTIAL +  // expected-warning@+2 {{'partialMethod' is only available on macOS 10.8 or newer}} expected-note@+2{{@available}} +#endif +  [a partialMethod];    [a ipartialMethod1]; // no warning  #if defined(WARN_PARTIAL)    // expected-warning@+2 {{'ipartialMethod2' is only available on macOS 10.8 or newer}} expected-note@+2 {{enclose 'ipartialMethod2' in an @available check to silence this warning}}  #endif    [a ipartialMethod2];    [a ppartialMethod]; // no warning -  [PartialI partialMethod]; // no warning +#ifdef WARN_PARTIAL +  // expected-warning@+2 {{'partialMethod' is only available on macOS 10.8 or newer}} expected-note@+2 {{@available}} +#endif +  [PartialI partialMethod];    [PartialI ipartialMethod1]; // no warning  #if defined(WARN_PARTIAL)    // expected-warning@+2 {{'ipartialMethod2' is only available on macOS 10.8 or newer}} expected-note@+2 {{enclose 'ipartialMethod2' in an @available check to silence this warning}} @@ -177,20 +190,23 @@ void partialfun(PartialI* a) {  }  #if defined(WARN_PARTIAL) -  // expected-note@+2 {{'PartialI2' has been explicitly marked partial here}} +  // expected-note@+2 2 {{'PartialI2' has been explicitly marked partial here}}  #endif  __attribute__((availability(macosx, introduced = 10.8))) @interface PartialI2  @end  #if defined(WARN_PARTIAL) -  // expected-warning@+2 {{'PartialI2' is partial: introduced in macOS 10.8}} expected-note@+2 {{explicitly redeclare 'PartialI2' to silence this warning}} +// expected-warning@+2 {{'PartialI2' is partial: introduced in macOS 10.8}} expected-note@+2 {{annotate 'partialinter1' with an availability attribute to silence}}  #endif  void partialinter1(PartialI2* p) {  }  @class PartialI2; -void partialinter2(PartialI2* p) { // no warning +#ifdef WARN_PARTIAL +// expected-warning@+2 {{'PartialI2' is partial: introduced in macOS 10.8}} expected-note@+2 {{annotate 'partialinter2' with an availability attribute to silence}} +#endif +void partialinter2(PartialI2* p) {  } diff --git a/test/SemaObjC/default-synthesize-3.m b/test/SemaObjC/default-synthesize-3.m index fe2b35f61523..9a05408aa060 100644 --- a/test/SemaObjC/default-synthesize-3.m +++ b/test/SemaObjC/default-synthesize-3.m @@ -173,13 +173,13 @@ typedef NSObject<Fooing> FooObject;  @end  @implementation Okay // expected-warning {{auto property synthesis will not synthesize property 'muahahaha' declared in protocol 'Fooing'}} expected-warning {{auto property synthesis will not synthesize property 'hoho' declared in protocol 'SubFooling'}} -@end +@end // expected-note 2 {{add a '@synthesize' directive}}  @interface Fail : FooObject  @end  @implementation Fail // expected-warning {{auto property synthesis will not synthesize property 'muahahaha' declared in protocol 'Fooing'}} expected-warning {{auto property synthesis will not synthesize property 'hoho' declared in protocol 'SubFooling'}} -@end +@end // expected-note 2 {{add a '@synthesize' directive}}  // rdar://16089191  @class NSURL; diff --git a/test/SemaObjC/default-synthesize.m b/test/SemaObjC/default-synthesize.m index 3f0ae0261daf..61ce9317c519 100644 --- a/test/SemaObjC/default-synthesize.m +++ b/test/SemaObjC/default-synthesize.m @@ -137,7 +137,7 @@  @end  @implementation MyClass // expected-warning {{auto property synthesis will not synthesize property 'requiredString' declared in protocol 'MyProtocol'}} -@end +@end // expected-note {{add a '@synthesize' directive}}  // rdar://18152478  @protocol NSObject @end diff --git a/test/SemaObjC/forward-protocol-incomplete-impl-warn.m b/test/SemaObjC/forward-protocol-incomplete-impl-warn.m index c235e32316a9..583bb4dd891d 100644 --- a/test/SemaObjC/forward-protocol-incomplete-impl-warn.m +++ b/test/SemaObjC/forward-protocol-incomplete-impl-warn.m @@ -17,4 +17,4 @@  @implementation IBImageCatalogDocument // expected-warning {{auto property synthesis will not synthesize property 'Prop' declared in protocol 'DVTInvalidation'}} \  				       // expected-warning {{method 'invalidate' in protocol 'DVTInvalidation' not implemented}} -@end +@end // expected-note {{add a '@synthesize' directive}} diff --git a/test/SemaObjC/objc-container-subscripting-1.m b/test/SemaObjC/objc-container-subscripting-1.m index a58a7c3bda81..b5ed5a68dd84 100644 --- a/test/SemaObjC/objc-container-subscripting-1.m +++ b/test/SemaObjC/objc-container-subscripting-1.m @@ -16,8 +16,7 @@ id oldObject = array[10]; // expected-warning {{instance method '-objectAtIndexe  array[10] = 0; // expected-warning {{instance method '-setObject:atIndexedSubscript:' not found (return type defaults to 'id')}}  id<P> p_array; -oldObject = p_array[10]; // expected-warning {{instance method '-objectAtIndexedSubscript:' not found (return type defaults to 'id')}} +oldObject = p_array[10]; // expected-error {{expected method to read array element not found on object of type 'id<P>'}} -p_array[10] = 0; // expected-warning {{instance method '-setObject:atIndexedSubscript:' not found (return type defaults to 'id')}} +p_array[10] = 0; // expected-error {{expected method to write array element not found on object of type 'id<P>'}}  } - diff --git a/test/SemaObjC/objc-container-subscripting-2.m b/test/SemaObjC/objc-container-subscripting-2.m index 62320fcebb77..6e7ee7c40e58 100644 --- a/test/SemaObjC/objc-container-subscripting-2.m +++ b/test/SemaObjC/objc-container-subscripting-2.m @@ -28,3 +28,22 @@ void test_unused() {    dict[array]; // expected-warning {{container access result unused - container access should not be used for side effects}}  } +void testQualifiedId(id<P> qualifiedId) { +  id object = qualifiedId[10];   // expected-error {{expected method to read array element not found on object of type 'id<P>'}} +  qualifiedId[10] = qualifiedId; // expected-error {{expected method to write array element not found on object of type 'id<P>'}} +} + +void testUnqualifiedId(id unqualId) { +  id object = unqualId[10]; +  unqualId[10] = object; +} + +@protocol Subscriptable +- (id)objectAtIndexedSubscript:(size_t)index; +- (void)setObject:(id)object atIndexedSubscript:(size_t)index; +@end + +void testValidQualifiedId(id<Subscriptable> qualifiedId) { +  id object = qualifiedId[10]; +  qualifiedId[10] = object; +} diff --git a/test/SemaObjC/unguarded-availability-new.m b/test/SemaObjC/unguarded-availability-new.m index 33baedebc279..9c44b164d541 100644 --- a/test/SemaObjC/unguarded-availability-new.m +++ b/test/SemaObjC/unguarded-availability-new.m @@ -96,16 +96,16 @@ typedef int AVAILABLE_NEXT new_int;  FUNC_AVAILABLE new_int x;  #ifndef NO_WARNING  #ifdef MAC -  // expected-warning@-3 {{'new_int' is partial: introduced in macOS 10.14}} expected-note@-3 {{explicitly redeclare 'new_int' to silence this warning}} +  // expected-warning@-3 {{'new_int' is partial: introduced in macOS 10.14}} expected-note@-3 {{annotate 'x' with an availability attribute to silence}}  #endif  #ifdef IOS -  // expected-warning@-6 {{'new_int' is partial: introduced in iOS 12}} expected-note@-6 {{explicitly redeclare 'new_int' to silence this warning}} +  // expected-warning@-6 {{'new_int' is partial: introduced in iOS 12}} expected-note@-6 {{annotate 'x' with an availability attribute to silence}}  #endif  #ifdef TVOS -  // expected-warning@-9 {{'new_int' is partial: introduced in tvOS 13}} expected-note@-9 {{explicitly redeclare 'new_int' to silence this warning}} +  // expected-warning@-9 {{'new_int' is partial: introduced in tvOS 13}} expected-note@-9 {{annotate 'x' with an availability attribute to silence}}  #endif  #ifdef WATCHOS -  // expected-warning@-12 {{'new_int' is partial: introduced in watchOS 5}} expected-note@-12 {{explicitly redeclare 'new_int' to silence this warning}} +  // expected-warning@-12 {{'new_int' is partial: introduced in watchOS 5}} expected-note@-12 {{annotate 'x' with an availability attribute to silence}}  #endif  #endif diff --git a/test/SemaObjC/unguarded-availability.m b/test/SemaObjC/unguarded-availability.m index 5febee038e3c..139b79158afe 100644 --- a/test/SemaObjC/unguarded-availability.m +++ b/test/SemaObjC/unguarded-availability.m @@ -5,6 +5,8 @@  #define AVAILABLE_10_11 __attribute__((availability(macos, introduced = 10.11)))  #define AVAILABLE_10_12 __attribute__((availability(macos, introduced = 10.12))) +typedef int AVAILABLE_10_12 new_int; // expected-note + {{marked partial here}} +  int func_10_11() AVAILABLE_10_11; // expected-note 4 {{'func_10_11' has been explicitly marked partial here}}  #ifdef OBJCPP @@ -70,9 +72,9 @@ void use_typedef() {  }  __attribute__((objc_root_class)) -AVAILABLE_10_11 @interface Class_10_11 { +AVAILABLE_10_11 @interface Class_10_11 { // expected-note{{annotate 'Class_10_11' with an availability attribute to silence}}    int_10_11 foo; -  int_10_12 bar; // expected-warning {{'int_10_12' is partial: introduced in macOS 10.12}} expected-note{{redeclare}} +  int_10_12 bar; // expected-warning {{'int_10_12' is partial: introduced in macOS 10.12}}  }  - (void)method1;  - (void)method2; @@ -125,7 +127,7 @@ void test_blocks() {    };  } -void test_params(int_10_12 x); // expected-warning {{'int_10_12' is partial: introduced in macOS 10.12}} expected-note{{redeclare}} +void test_params(int_10_12 x); // expected-warning {{'int_10_12' is partial: introduced in macOS 10.12}} expected-note{{annotate 'test_params' with an availability attribute to silence}}  void test_params2(int_10_12 x) AVAILABLE_10_12; // no warn @@ -234,3 +236,54 @@ void functionInFunction() {  }  #endif + +struct InStruct { // expected-note{{annotate 'InStruct' with an availability attribute to silence}} +  new_int mem; // expected-warning{{'new_int' is partial}} + +  struct { new_int mem; } anon; // expected-warning{{'new_int' is partial}} expected-note{{annotate anonymous struct with an availability attribute}} +}; + +#ifdef OBJCPP +static constexpr int AVAILABLE_10_12 SomeConstexprValue = 2; // expected-note{{marked partial here}} +typedef enum { // expected-note{{annotate anonymous enum with an availability attribute}} +  SomeValue = SomeConstexprValue // expected-warning{{'SomeConstexprValue' is partial}}  +} SomeEnum; +#endif + +@interface InInterface +-(new_int)meth; // expected-warning{{'new_int' is partial}} expected-note{{annotate 'meth' with an availability attribute}} +@end + +@interface Proper // expected-note{{annotate 'Proper' with an availability attribute}} +@property (class) new_int x; // expected-warning{{'new_int' is partial}} +@end + +void with_local_struct() { +  struct local { // expected-note{{annotate 'local' with an availability attribute}} +    new_int x; // expected-warning{{'new_int' is partial}} +  }; +} + +// rdar://33156429: +// Avoid the warning on protocol requirements. + +AVAILABLE_10_12 +@protocol NewProtocol // expected-note {{'NewProtocol' has been explicitly marked partial here}} +@end + +@protocol ProtocolWithNewProtocolRequirement <NewProtocol> // expected-note {{annotate 'ProtocolWithNewProtocolRequirement' with an availability attribute to silence}} + +@property(copy) id<NewProtocol> prop; // expected-warning {{'NewProtocol' is partial: introduced in macOS 10.12}} + +@end + +@interface BaseClass +@end + +@interface ClassWithNewProtocolRequirement : BaseClass <NewProtocol> + +@end + +@interface BaseClass (CategoryWithNewProtocolRequirement) <NewProtocol> + +@end diff --git a/test/SemaOpenCL/cl20-device-side-enqueue.cl b/test/SemaOpenCL/cl20-device-side-enqueue.cl index bafbe447ee28..3f6527afeadc 100644 --- a/test/SemaOpenCL/cl20-device-side-enqueue.cl +++ b/test/SemaOpenCL/cl20-device-side-enqueue.cl @@ -19,19 +19,19 @@ kernel void enqueue_kernel_tests() {      return 0;    }); -  enqueue_kernel(vptr, flags, ndrange, ^(void) { // expected-error{{illegal call to enqueue_kernel, expected 'queue_t' argument type}} +  enqueue_kernel(vptr, flags, ndrange, ^(void) { // expected-error{{illegal call to 'enqueue_kernel', expected 'queue_t' argument type}}      return 0;    }); -  enqueue_kernel(default_queue, vptr, ndrange, ^(void) { // expected-error{{illegal call to enqueue_kernel, expected 'kernel_enqueue_flags_t' (i.e. uint) argument type}} +  enqueue_kernel(default_queue, vptr, ndrange, ^(void) { // expected-error{{illegal call to 'enqueue_kernel', expected 'kernel_enqueue_flags_t' (i.e. uint) argument type}}      return 0;    }); -  enqueue_kernel(default_queue, flags, vptr, ^(void) { // expected-error{{illegal call to enqueue_kernel, expected 'ndrange_t' argument type}} +  enqueue_kernel(default_queue, flags, vptr, ^(void) { // expected-error{{illegal call to 'enqueue_kernel', expected 'ndrange_t' argument type}}      return 0;    }); -  enqueue_kernel(default_queue, flags, ndrange, vptr); // expected-error{{illegal call to enqueue_kernel, expected block argument}} +  enqueue_kernel(default_queue, flags, ndrange, vptr); // expected-error{{illegal call to 'enqueue_kernel', expected block argument}}    enqueue_kernel(default_queue, flags, ndrange, ^(int i) { // expected-error{{blocks with parameters are not accepted in this prototype of enqueue_kernel call}}      return 0; @@ -46,21 +46,21 @@ kernel void enqueue_kernel_tests() {                                                             return 0;                                                           }); -  enqueue_kernel(default_queue, flags, ndrange, vptr, &event_wait_list, &evt, ^(void) { // expected-error{{illegal call to enqueue_kernel, expected integer argument type}} +  enqueue_kernel(default_queue, flags, ndrange, vptr, &event_wait_list, &evt, ^(void) { // expected-error{{illegal call to 'enqueue_kernel', expected integer argument type}}      return 0;    }); -  enqueue_kernel(default_queue, flags, ndrange, 1, vptr, &evt, ^(void) // expected-error{{illegal call to enqueue_kernel, expected 'clk_event_t *' argument type}} +  enqueue_kernel(default_queue, flags, ndrange, 1, vptr, &evt, ^(void) // expected-error{{illegal call to 'enqueue_kernel', expected 'clk_event_t *' argument type}}                                                                 {                                                                   return 0;                                                                 }); -  enqueue_kernel(default_queue, flags, ndrange, 1, &event_wait_list, vptr, ^(void) // expected-error{{illegal call to enqueue_kernel, expected 'clk_event_t *' argument type}} +  enqueue_kernel(default_queue, flags, ndrange, 1, &event_wait_list, vptr, ^(void) // expected-error{{illegal call to 'enqueue_kernel', expected 'clk_event_t *' argument type}}                                                                             {                                                                               return 0;                                                                             }); -  enqueue_kernel(default_queue, flags, ndrange, 1, &event_wait_list, &evt, vptr); // expected-error{{illegal call to enqueue_kernel, expected block argument}} +  enqueue_kernel(default_queue, flags, ndrange, 1, &event_wait_list, &evt, vptr); // expected-error{{illegal call to 'enqueue_kernel', expected block argument}}    // Testing the third overload type    enqueue_kernel(default_queue, flags, ndrange, diff --git a/test/SemaOpenCL/images.cl b/test/SemaOpenCL/images.cl index f963de4e1359..9d6092c8c916 100644 --- a/test/SemaOpenCL/images.cl +++ b/test/SemaOpenCL/images.cl @@ -1,9 +1,32 @@ -// RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only +// RUN: %clang_cc1 %s -cl-std=CL2.0 -verify -pedantic -fsyntax-only -void img2d_ro(__read_only image2d_t img) {} // expected-note{{passing argument to parameter 'img' here}} expected-note{{passing argument to parameter 'img' here}} +void img2d_ro(read_only image2d_t); // expected-note 3{{passing argument to parameter here}} +void img2d_wo(write_only image2d_t); // expected-note 2{{passing argument to parameter here}} +void img2d_rw(read_write image2d_t); // expected-note 2{{passing argument to parameter here}} +void img2d_default(image2d_t); // expected-note 2{{passing argument to parameter here}} -void imgage_access_test(image2d_t img2dro, write_only image2d_t img2dwo, image3d_t img3dro) { -  img2d_ro(img2dro); -  img2d_ro(img2dwo); // expected-error{{passing '__write_only image2d_t' to parameter of incompatible type '__read_only image2d_t'}} +void imgage_access_test(image2d_t img2dro, image3d_t img3dro) { +  img2d_ro(img2dro); // read_only = read_only    img2d_ro(img3dro); // expected-error{{passing '__read_only image3d_t' to parameter of incompatible type '__read_only image2d_t'}}  } + +kernel void read_only_access_test(read_only image2d_t img) { +  img2d_ro(img); // read_only = read_only +  img2d_wo(img); // expected-error {{passing '__read_only image2d_t' to parameter of incompatible type '__write_only image2d_t'}} +  img2d_rw(img); // expected-error {{passing '__read_only image2d_t' to parameter of incompatible type '__read_write image2d_t'}} +  img2d_default(img); // read_only = read_only +} + +kernel void write_only_access_test(write_only image2d_t img) { +  img2d_ro(img); // expected-error {{passing '__write_only image2d_t' to parameter of incompatible type '__read_only image2d_t'}} +  img2d_wo(img); // write_only = write_only +  img2d_rw(img); // expected-error {{passing '__write_only image2d_t' to parameter of incompatible type '__read_write image2d_t'}} +  img2d_default(img); // expected-error {{passing '__write_only image2d_t' to parameter of incompatible type '__read_only image2d_t'}} +} + +kernel void read_write_access_test(read_write image2d_t img) { +  img2d_ro(img);  // expected-error {{passing '__read_write image2d_t' to parameter of incompatible type '__read_only image2d_t'}} +  img2d_wo(img); // expected-error {{passing '__read_write image2d_t' to parameter of incompatible type '__write_only image2d_t'}} +  img2d_rw(img); //read_write = read_write +  img2d_default(img); // expected-error {{passing '__read_write image2d_t' to parameter of incompatible type '__read_only image2d_t'}} +} diff --git a/test/SemaTemplate/constexpr-instantiate.cpp b/test/SemaTemplate/constexpr-instantiate.cpp index dfb8a07d3b7d..31dbdb617a6a 100644 --- a/test/SemaTemplate/constexpr-instantiate.cpp +++ b/test/SemaTemplate/constexpr-instantiate.cpp @@ -191,7 +191,7 @@ namespace Unevaluated {        static constexpr bool f() { return sizeof(T) < U::size; }        template<typename U> -      static typename enable_if<f<U>(), void>::type g() {} // expected-note {{disabled by 'enable_if'}} +      static typename enable_if<f<U>(), void>::type g() {} // expected-note {{requirement 'f<Unevaluated::PR13423::U>()' was not satisfied}}      };      struct U { static constexpr int size = 2; }; diff --git a/test/SemaTemplate/overload-candidates.cpp b/test/SemaTemplate/overload-candidates.cpp index c0abb5b17488..de998d74f9af 100644 --- a/test/SemaTemplate/overload-candidates.cpp +++ b/test/SemaTemplate/overload-candidates.cpp @@ -47,7 +47,7 @@ namespace boost {    template<bool, typename = void> struct enable_if {};    template<typename T> struct enable_if<true, T> { typedef T type; };  } -template<typename T> typename boost::enable_if<sizeof(T) == 4, int>::type if_size_4(); // expected-note{{candidate template ignored: disabled by 'enable_if' [with T = char]}} +template<typename T> typename boost::enable_if<sizeof(T) == 4, int>::type if_size_4(); // expected-note{{candidate template ignored: requirement 'sizeof(char) == 4' was not satisfied [with T = char]}}  int k = if_size_4<char>(); // expected-error{{no matching function}}  namespace llvm { @@ -61,7 +61,7 @@ void test_if_int() {  }  template<typename T> struct NonTemplateFunction { -  typename boost::enable_if<sizeof(T) == 4, int>::type f(); // expected-error{{no type named 'type' in 'boost::enable_if<false, int>'; 'enable_if' cannot be used to disable this declaration}} +  typename boost::enable_if<sizeof(T) == 4, int>::type f(); // expected-error{{failed requirement 'sizeof(char) == 4'; 'enable_if' cannot be used to disable this declaration}}  };  NonTemplateFunction<char> NTFC; // expected-note{{here}} @@ -100,7 +100,7 @@ namespace PR15673 {  #if __cplusplus <= 199711L    // expected-warning@-2 {{default template arguments for a function template are a C++11 extension}}  #endif -  // expected-note@-4 {{candidate template ignored: disabled by 'enable_if' [with T = int]}} +  // expected-note@+1 {{candidate template ignored: requirement 'a_trait<int>::value' was not satisfied [with T = int]}}    void foo() {}    void bar() { foo<int>(); } // expected-error {{no matching function for call to 'foo'}} @@ -128,7 +128,7 @@ namespace PR15673 {  #if __cplusplus <= 199711L    // expected-warning@-2 {{alias declarations are a C++11 extension}}  #endif -  // expected-note@-4 {{candidate template ignored: disabled by 'enable_if' [with T = int]}} +  // expected-note@+7 {{candidate template ignored: requirement 'some_trait<int>::value' was not satisfied [with T = int]}}    template<typename T,             typename Requires = unicorns<T> > @@ -137,4 +137,30 @@ namespace PR15673 {  #endif    void wibble() {}    void wobble() { wibble<int>(); } // expected-error {{no matching function for call to 'wibble'}} + +  template<typename T> +  struct some_passing_trait : std::true_type {}; + +#if __cplusplus <= 199711L +  // expected-warning@+4 {{default template arguments for a function template are a C++11 extension}} +  // expected-warning@+4 {{default template arguments for a function template are a C++11 extension}} +#endif +  template<typename T, +           int n = 42, +           typename std::enable_if<n == 43 || (some_passing_trait<T>::value && some_trait<T>::value), int>::type = 0> +  void almost_rangesv3(); // expected-note{{candidate template ignored: requirement '42 == 43 || (some_passing_trait<int>::value && some_trait<int>::value)' was not satisfied}} +  void test_almost_rangesv3() { almost_rangesv3<int>(); } // expected-error{{no matching function for call to 'almost_rangesv3'}} + +  #define CONCEPT_REQUIRES_(...)                                        \ +    int x = 42,                                                         \ +    typename std::enable_if<(x == 43) || (__VA_ARGS__)>::type = 0 + +#if __cplusplus <= 199711L +  // expected-warning@+4 {{default template arguments for a function template are a C++11 extension}} +  // expected-warning@+3 {{default template arguments for a function template are a C++11 extension}} +#endif +  template<typename T, +           CONCEPT_REQUIRES_(some_passing_trait<T>::value && some_trait<T>::value)> +  void rangesv3(); // expected-note{{candidate template ignored: requirement 'some_trait<int>::value' was not satisfied [with T = int, x = 42]}} +  void test_rangesv3() { rangesv3<int>(); } // expected-error{{no matching function for call to 'rangesv3'}}  } diff --git a/test/Unit/lit.cfg b/test/Unit/lit.cfg index 39fad0099ceb..90eb2ac604a5 100644 --- a/test/Unit/lit.cfg +++ b/test/Unit/lit.cfg @@ -4,6 +4,7 @@  import os  import platform +import subprocess  import lit.formats  import lit.util @@ -65,8 +66,8 @@ if config.test_exec_root is None:          lit_config.fatal('No site specific configuration available!')      # Get the source and object roots. -    llvm_src_root = lit.util.capture(['llvm-config', '--src-root']).strip() -    llvm_obj_root = lit.util.capture(['llvm-config', '--obj-root']).strip() +    llvm_src_root = subprocess.check_output(['llvm-config', '--src-root']).strip() +    llvm_obj_root = subprocess.check_output(['llvm-config', '--obj-root']).strip()      clang_src_root = os.path.join(llvm_src_root, "tools", "clang")      clang_obj_root = os.path.join(llvm_obj_root, "tools", "clang") diff --git a/test/lit.cfg b/test/lit.cfg index e72eca6bd397..28026578299b 100644 --- a/test/lit.cfg +++ b/test/lit.cfg @@ -148,8 +148,8 @@ if config.test_exec_root is None:          lit_config.fatal('No site specific configuration available!')      # Get the source and object roots. -    llvm_src_root = lit.util.capture(['llvm-config', '--src-root']).strip() -    llvm_obj_root = lit.util.capture(['llvm-config', '--obj-root']).strip() +    llvm_src_root = subprocess.check_output(['llvm-config', '--src-root']).strip() +    llvm_obj_root = subprocess.check_output(['llvm-config', '--obj-root']).strip()      clang_src_root = os.path.join(llvm_src_root, "tools", "clang")      clang_obj_root = os.path.join(llvm_obj_root, "tools", "clang")  | 
