mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-23 17:29:19 +00:00
DAGCombine may choose to rewrite graphs where two loads feed a select into graphs where a select of two addresses feed a load. While it sanity checks the loads to make sure they are broadly equivalent it currently just uses the alignment restriction of the left node. In cases where the right node has stronger alignment requiresment this may lead to bad codegen, such as generating an aligned load where an unaligned load is required. This patch makes the combine generate a load with an alignment that is the same as whichever is more restrictive of the two alignments. Tests included. rdar://17762530 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@214322 91177308-0d34-0410-b5e6-96231b3b80d8
36 lines
1.0 KiB
LLVM
36 lines
1.0 KiB
LLVM
; RUN: llc -mcpu=core2 -mattr=+64bit,+sse2 < %s | FileCheck %s
|
|
|
|
; DAGCombine may choose to rewrite 2 loads feeding a select as a select of
|
|
; addresses feeding a load. This test ensures that when it does that it creates
|
|
; a load with alignment equivalent to the most restrictive source load.
|
|
|
|
declare void @sink(<2 x double>)
|
|
|
|
define void @test1(i1 %cmp) align 2 {
|
|
%1 = alloca <2 x double>, align 16
|
|
%2 = alloca <2 x double>, align 8
|
|
|
|
%val = load <2 x double>* %1, align 16
|
|
%val2 = load <2 x double>* %2, align 8
|
|
%val3 = select i1 %cmp, <2 x double> %val, <2 x double> %val2
|
|
call void @sink(<2 x double> %val3)
|
|
ret void
|
|
; CHECK: test1
|
|
; CHECK: movups
|
|
; CHECK: ret
|
|
}
|
|
|
|
define void @test2(i1 %cmp) align 2 {
|
|
%1 = alloca <2 x double>, align 16
|
|
%2 = alloca <2 x double>, align 8
|
|
|
|
%val = load <2 x double>* %1, align 16
|
|
%val2 = load <2 x double>* %2, align 16
|
|
%val3 = select i1 %cmp, <2 x double> %val, <2 x double> %val2
|
|
call void @sink(<2 x double> %val3)
|
|
ret void
|
|
; CHECK: test2
|
|
; CHECK: movaps
|
|
; CHECK: ret
|
|
}
|