mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
ca63c287ad
The swap removal pass looks to remove swaps when a loaded value is swapped, some number of lane-insensitive operations are performed and then the value is swapped again and stored. However, in a situation where we load the value, swap it and then store it without swapping again, the pass erroneously removes the single swap. The reason is that both checks in the same equivalence class: - load feeds a swap - swap feeds a store pass. However, there is no check that the two swaps are actually a single swap. This patch just fixes that. Differential revision: https://reviews.llvm.org/D84785
20 lines
711 B
LLVM
20 lines
711 B
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc -verify-machineinstrs -O3 -mcpu=pwr8 \
|
|
; RUN: -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s
|
|
define dso_local void @test(i64* %Src, i64* nocapture %Tgt) local_unnamed_addr {
|
|
; CHECK-LABEL: test:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: lxvd2x 0, 0, 3
|
|
; CHECK-NEXT: xxswapd 0, 0
|
|
; CHECK-NEXT: stxvd2x 0, 0, 4
|
|
; CHECK-NEXT: blr
|
|
entry:
|
|
%0 = bitcast i64* %Src to i8*
|
|
%1 = tail call <2 x double> @llvm.ppc.vsx.lxvd2x.be(i8* %0) #2
|
|
%2 = bitcast i64* %Tgt to <2 x double>*
|
|
store <2 x double> %1, <2 x double>* %2, align 1
|
|
ret void
|
|
}
|
|
|
|
declare <2 x double> @llvm.ppc.vsx.lxvd2x.be(i8*) #1
|