1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 18:54:02 +01:00
llvm-mirror/test/Transforms/MergeFunc/shufflevector.ll
Nikita Popov 6f50f7841e [MergeFuncs] Don't merge shufflevectors with different masks
When the shufflevector mask operand was converted into special
instruction data, the FunctionComparator was not updated to
account for this. As such, MergeFuncs will happily merge
shufflevectors with different masks.

This fixes https://bugs.llvm.org/show_bug.cgi?id=45773.

Differential Revision: https://reviews.llvm.org/D79261
2020-05-02 10:21:14 +02:00

41 lines
1.5 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -S -mergefunc < %s | FileCheck %s
define internal <2 x i32> @test1(<2 x i32> %v1, <2 x i32> %v2) {
; CHECK-LABEL: @test1(
; CHECK-NEXT: [[X:%.*]] = shufflevector <2 x i32> [[V1:%.*]], <2 x i32> [[V2:%.*]], <2 x i32> <i32 0, i32 1>
; CHECK-NEXT: ret <2 x i32> [[X]]
;
%x = shufflevector <2 x i32> %v1, <2 x i32> %v2, <2 x i32> <i32 0, i32 1>
ret <2 x i32> %x
}
; Same mask as test1.
define internal <2 x i32> @test2(<2 x i32> %v1, <2 x i32> %v2) {
%x = shufflevector <2 x i32> %v1, <2 x i32> %v2, <2 x i32> <i32 0, i32 1>
ret <2 x i32> %x
}
; Different mask than test1, don't merge.
define internal <2 x i32> @test3(<2 x i32> %v1, <2 x i32> %v2) {
; CHECK-LABEL: @test3(
; CHECK-NEXT: [[X:%.*]] = shufflevector <2 x i32> [[V1:%.*]], <2 x i32> [[V2:%.*]], <2 x i32> <i32 1, i32 0>
; CHECK-NEXT: ret <2 x i32> [[X]]
;
%x = shufflevector <2 x i32> %v1, <2 x i32> %v2, <2 x i32> <i32 1, i32 0>
ret <2 x i32> %x
}
define void @caller(<2 x i32> %v1, <2 x i32> %v2) {
; CHECK-LABEL: @caller(
; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i32> @test1(<2 x i32> [[V1:%.*]], <2 x i32> [[V2:%.*]])
; CHECK-NEXT: [[TMP2:%.*]] = call <2 x i32> @test1(<2 x i32> [[V1]], <2 x i32> [[V2]])
; CHECK-NEXT: [[TMP3:%.*]] = call <2 x i32> @test3(<2 x i32> [[V1]], <2 x i32> [[V2]])
; CHECK-NEXT: ret void
;
call <2 x i32> @test1(<2 x i32> %v1, <2 x i32> %v2)
call <2 x i32> @test2(<2 x i32> %v1, <2 x i32> %v2)
call <2 x i32> @test3(<2 x i32> %v1, <2 x i32> %v2)
ret void
}