mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-29 06:30:39 +00:00
bba23ed672
When vectorizing pointer types it is important to realize that potential pairs cannot be connected via the address pointer argument of a load or store. This is because even after vectorization, the address is still a scalar because the address of the higher half of the pair is implicit from the address of the lower half (it need not be, and should not be, explicitly computed). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@154735 91177308-0d34-0410-b5e6-96231b3b80d8
24 lines
916 B
LLVM
24 lines
916 B
LLVM
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
|
|
; RUN: opt < %s -bb-vectorize -bb-vectorize-req-chain-depth=2 -instcombine -gvn -S | FileCheck %s
|
|
|
|
; Make sure that things (specifically getelementptr) are not connected to loads
|
|
; and stores via the address operand (which would be bad because the address
|
|
; is really a scalar even after vectorization)
|
|
define i64 @test2(i64 %a) nounwind uwtable readonly {
|
|
entry:
|
|
%a1 = inttoptr i64 %a to i64*
|
|
%a2 = getelementptr i64* %a1, i64 1
|
|
%a3 = getelementptr i64* %a1, i64 2
|
|
%v2 = load i64* %a2, align 8
|
|
%v3 = load i64* %a3, align 8
|
|
%v2a = add i64 %v2, 5
|
|
%v3a = add i64 %v3, 7
|
|
store i64 %v2a, i64* %a2, align 8
|
|
store i64 %v3a, i64* %a3, align 8
|
|
%r = add i64 %v2, %v3
|
|
ret i64 %r
|
|
; CHECK: @test2
|
|
; CHECK-NOT: getelementptr <2 x i64*>
|
|
}
|
|
|