File: simd_shuffle_xor.ll

package info (click to toggle)
intel-graphics-compiler 1.0.12504.6-1%2Bdeb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 83,912 kB
  • sloc: cpp: 910,147; lisp: 202,655; ansic: 15,197; python: 4,025; yacc: 2,241; lex: 1,570; pascal: 244; sh: 104; makefile: 25
file content (74 lines) | stat: -rw-r--r-- 3,059 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
;=========================== begin_copyright_notice ============================
;
; Copyright (C) 2017-2022 Intel Corporation
;
; SPDX-License-Identifier: MIT
;
;============================ end_copyright_notice =============================

; RUN: igc_opt -igc-custom-safe-opt -S %s -o %t.ll
; RUN: FileCheck %s --input-file=%t.ll

declare i16 @llvm.genx.GenISA.simdLaneId()
declare i32 @llvm.genx.GenISA.WaveShuffleIndex.i32(i32, i32, i32)
declare double @llvm.genx.GenISA.WaveShuffleIndex.f64(double, i32, i32)

; Change the call in simple case
define void @test_transformation_simple(i32 %x) nounwind {
entry:
  %simdLaneId = call i16 @llvm.genx.GenISA.simdLaneId()
  %xor = xor i16 %simdLaneId, 1
  %xor.i = zext i16 %xor to i32
  %simdShuffle = call i32 @llvm.genx.GenISA.WaveShuffleIndex.i32(i32 %x, i32 %xor.i, i32 0)
  ret void
}
; CHECK-LABEL: @test_transformation_simple
; CHECK: call i32 @llvm.genx.GenISA.simdShuffleXor{{.*}}(i32 %x, i32 1)


; Change the call in double case too
define void @test_transformation_double(double %x) nounwind {
entry:
  %simdLaneId = call i16 @llvm.genx.GenISA.simdLaneId()
  %xor = xor i16 %simdLaneId, 15
  %xor.i = zext i16 %xor to i32
  %simdShuffle = call double @llvm.genx.GenISA.WaveShuffleIndex.f64(double %x, i32 %xor.i, i32 0)
  ret void
}
; CHECK-LABEL: @test_transformation_double
; CHECK: call double @llvm.genx.GenISA.simdShuffleXor{{.*}}(double %x, i32 15)


; Change both calls when the value is splitted into high and low parts
define void @test_transformation_splitted(i64 %x) nounwind {
entry:
  %vec = bitcast i64 %x to <2 x i32>
  %scalar1 = extractelement <2 x i32> %vec, i32 0
  %scalar2 = extractelement <2 x i32> %vec, i32 1
  %simdLaneId16 = call i16 @llvm.genx.GenISA.simdLaneId()
  %xor = xor i16 %simdLaneId16, 8
  %xor.i = zext i16 %xor to i32
  %simdShuffle = call i32 @llvm.genx.GenISA.WaveShuffleIndex.i32(i32 %scalar1, i32 %xor.i, i32 0)
  %simdShuffle2 = call i32 @llvm.genx.GenISA.WaveShuffleIndex.i32(i32 %scalar2, i32 %xor.i, i32 0)
  %assembled.vect = insertelement <2 x i32> undef, i32 %simdShuffle, i32 0
  %assembled.vect2 = insertelement <2 x i32> %assembled.vect, i32 %simdShuffle2, i32 1
  ret void
}
; CHECK-LABEL: @test_transformation_splitted
; CHECK: [[I1:%[a-zA-Z0-9.]+]] = call i32 @llvm.genx.GenISA.simdShuffleXor{{.*}}(i32 %scalar1, i32 8)
; CHECK: [[I2:%[a-zA-Z0-9.]+]] = call i32 @llvm.genx.GenISA.simdShuffleXor{{.*}}(i32 %scalar2, i32 8)
; CHECK: [[RES:%[a-zA-Z0-9.]+]] = insertelement <2 x i32> undef, i32 [[I1]], i32 0
; CHECK: insertelement <2 x i32> [[RES]], i32 [[I2]], i32 1


; Do not change the call if xor is not constant
define void @test_no_constant(i32 %x, i16 %xor_value) nounwind {
entry:
  %simdLaneId = call i16 @llvm.genx.GenISA.simdLaneId()
  %xor = xor i16 %simdLaneId, %xor_value
  %xor.i = zext i16 %xor to i32
  %simdShuffle = call i32 @llvm.genx.GenISA.WaveShuffleIndex.i32(i32 %x, i32 %xor.i, i32 0)
  ret void
}
; CHECK-LABEL: @test_no_constant
; CHECK: call i32 @llvm.genx.GenISA.WaveShuffleIndex.{{.*}}(i32 %x, i32 %xor.i, i32 0)