| ; REQUIRES: aarch64-registered-target |
| ; REQUIRES: default_triple |
| |
| ;; There shouldn't be a default -mtune. |
| ; RUN: opt < %s -passes=loop-vectorize -S -mtriple=aarch64 | FileCheck %s --check-prefixes=CHECK-NOTUNE |
| |
| ; RUN: opt < %s -passes=loop-vectorize -S -mtriple=aarch64 -mtune=generic | FileCheck %s --check-prefixes=CHECK-TUNE-GENERIC |
| ; RUN: opt < %s -passes=loop-vectorize -S -mtriple=aarch64 -mtune=apple-m5 | FileCheck %s --check-prefixes=CHECK-TUNE-APPLE-M5 |
| |
| ;; Check interaction between mcpu and mtune. |
| ; RUN: opt < %s -passes=loop-vectorize -S -mtriple=aarch64 -mcpu=apple-m5 | FileCheck %s --check-prefixes=CHECK-TUNE-APPLE-M5 |
| ; RUN: opt < %s -passes=loop-vectorize -S -mtriple=aarch64 -mcpu=apple-m5 -mtune=generic | FileCheck %s --check-prefixes=CHECK-TUNE-GENERIC |
| |
| ;; Test -mtune=help |
| ; RUN: opt -mtriple=aarch64 -mtune=help 2>&1 | FileCheck %s --check-prefixes=CHECK-TUNE-HELP,CHECK-TUNE-HELP-NO-OPTIMIZE |
| ; RUN: opt -mtriple=aarch64 -mtune=help -o %t.s 2>&1 | FileCheck %s --check-prefixes=CHECK-TUNE-HELP,CHECK-TUNE-HELP-NO-OPTIMIZE |
| ; RUN: opt < %s -mtriple=aarch64 -mtune=help 2>&1 | FileCheck %s --check-prefixes=CHECK-TUNE-HELP,CHECK-TUNE-HELP-NO-OPTIMIZE |
| ; RUN: opt < %s -mtriple=aarch64 -mtune=help -o %t.s 2>&1 | FileCheck %s --check-prefixes=CHECK-TUNE-HELP,CHECK-TUNE-HELP-NO-OPTIMIZE |
| |
| ;; Using default triple for -mtune=help |
| ; RUN: opt -mtune=help 2>&1 | FileCheck %s --check-prefixes=CHECK-TUNE-HELP,CHECK-TUNE-HELP-NO-OPTIMIZE |
| ; RUN: opt < %s -mtune=help 2>&1 | FileCheck %s --check-prefixes=CHECK-TUNE-HELP,CHECK-TUNE-HELP-NO-OPTIMIZE |
| |
| ; CHECK-TUNE-HELP: Available CPUs for this target: |
| ; CHECK-TUNE-HELP: Available features for this target: |
| |
| ;; To check we dont optimize the file |
| ; CHECK-TUNE-HELP-NO-OPTIMIZE-NOT: loop: |
| |
| ;; A test case that depends on `FeatureMaxInterleaveFactor4` tuning feature, to enable -mtune verification |
| ;; through codegen effects. Taken from: llvm/test/Transforms/LoopVectorize/max-interleave-factor-debug.ll |
| define void @loop(ptr noalias %src, ptr noalias %dst, i64 %n) { |
| ; CHECK-NOTUNE-LABEL: define void @loop( |
| ; CHECK-NOTUNE: [[VECTOR_BODY:.*]]: |
| ; CHECK-NOTUNE: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr |
| ; CHECK-NOTUNE-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x i32>, ptr |
| ; CHECK-NOTUNE: store <4 x i32> [[WIDE_LOAD]], ptr |
| ; CHECK-NOTUNE-NEXT: store <4 x i32> [[WIDE_LOAD1]], ptr |
| ; CHECK-NOTUNE-NEXT: [[INDEX_NEXT:%.*]] = add nuw i64 [[INDEX:%.*]], 8 |
| ; |
| ; CHECK-TUNE-GENERIC-LABEL: define void @loop( |
| ; CHECK-TUNE-GENERIC: [[VECTOR_BODY:.*]]: |
| ; CHECK-TUNE-GENERIC: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr |
| ; CHECK-TUNE-GENERIC-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x i32>, ptr |
| ; CHECK-TUNE-GENERIC: store <4 x i32> [[WIDE_LOAD]], ptr |
| ; CHECK-TUNE-GENERIC-NEXT: store <4 x i32> [[WIDE_LOAD1]], ptr |
| ; CHECK-TUNE-GENERIC-NEXT: [[INDEX_NEXT:%.*]] = add nuw i64 [[INDEX:%.*]], 8 |
| ; |
| ; CHECK-TUNE-APPLE-M5-LABEL: define void @loop( |
| ; CHECK-TUNE-APPLE-M5: [[VECTOR_BODY:.*]]: |
| ; CHECK-TUNE-APPLE-M5: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr |
| ; CHECK-TUNE-APPLE-M5-NEXT: [[WIDE_LOAD2:%.*]] = load <4 x i32>, ptr |
| ; CHECK-TUNE-APPLE-M5-NEXT: [[WIDE_LOAD3:%.*]] = load <4 x i32>, ptr |
| ; CHECK-TUNE-APPLE-M5-NEXT: [[WIDE_LOAD4:%.*]] = load <4 x i32>, ptr |
| ; CHECK-TUNE-APPLE-M5: store <4 x i32> [[WIDE_LOAD]], ptr |
| ; CHECK-TUNE-APPLE-M5-NEXT: store <4 x i32> [[WIDE_LOAD2]], ptr |
| ; CHECK-TUNE-APPLE-M5-NEXT: store <4 x i32> [[WIDE_LOAD3]], ptr |
| ; CHECK-TUNE-APPLE-M5-NEXT: store <4 x i32> [[WIDE_LOAD4]], ptr |
| ; CHECK-TUNE-APPLE-M5-NEXT: [[INDEX_NEXT:%.*]] = add nuw i64 [[INDEX:%.*]], 16 |
| entry: |
| br label %loop |
| |
| loop: |
| %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] |
| %p = getelementptr i32, ptr %src, i64 %iv |
| %v = load i32, ptr %p, align 4 |
| %q = getelementptr i32, ptr %dst, i64 %iv |
| store i32 %v, ptr %q, align 4 |
| %iv.next = add nuw nsw i64 %iv, 1 |
| %cond = icmp ne i64 %iv.next, %n |
| br i1 %cond, label %loop, label %exit |
| |
| exit: |
| ret void |
| } |