mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-15 04:30:12 +00:00
35b114fe18
Previously, the hint mechanism relied on clean up passes to remove redundant metadata, which still showed up if running opt at low levels of optimization. That also has shown that multiple nodes of the same type, but with different values could still coexist, even if temporary, and cause confusion if the next pass got the wrong value. This patch makes sure that, if metadata already exists in a loop, the hint mechanism will never append a new node, but always replace the existing one. It also enhances the algorithm to cope with more metadata types in the future by just adding a new type, not a lot of code. Re-applying again due to MSVC 2013 being minimum requirement, and this patch having C++11 that MSVC 2012 didn't support. Fixes PR20655. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@216870 91177308-0d34-0410-b5e6-96231b3b80d8
31 lines
1.2 KiB
LLVM
31 lines
1.2 KiB
LLVM
; RUN: opt < %s -loop-vectorize -S 2>&1 | FileCheck %s
|
|
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
|
target triple = "x86_64-unknown-linux-gnu"
|
|
|
|
; This test makes sure we don't duplicate the loop vectorizer's metadata
|
|
; while marking them as already vectorized (by setting width = 1), even
|
|
; at lower optimization levels, where no extra cleanup is done
|
|
|
|
define void @_Z3fooPf(float* %a) {
|
|
entry:
|
|
br label %for.body
|
|
|
|
for.body: ; preds = %for.body, %entry
|
|
%indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
|
|
%arrayidx = getelementptr inbounds float* %a, i64 %indvars.iv
|
|
%p = load float* %arrayidx, align 4
|
|
%mul = fmul float %p, 2.000000e+00
|
|
store float %mul, float* %arrayidx, align 4
|
|
%indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
|
|
%exitcond = icmp eq i64 %indvars.iv.next, 1024
|
|
br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !0
|
|
|
|
for.end: ; preds = %for.body
|
|
ret void
|
|
}
|
|
|
|
!0 = metadata !{metadata !0, metadata !1}
|
|
!1 = metadata !{metadata !"llvm.loop.vectorize.width", i32 4}
|
|
; CHECK-NOT: !{metadata !"llvm.loop.vectorize.width", i32 4}
|
|
; CHECK: !{metadata !"llvm.loop.interleave.count", i32 1}
|