mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-01 16:33:37 +01:00
028d6e153e
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). llvm-svn: 154735
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*>
|
|
}
|
|
|