File: binary.ll

package info (click to toggle)
intel-graphics-compiler 1.0.17791.18-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 102,312 kB
  • sloc: cpp: 935,343; lisp: 286,143; ansic: 16,196; python: 3,279; yacc: 2,487; lex: 1,642; pascal: 300; sh: 174; makefile: 27
file content (153 lines) | stat: -rw-r--r-- 5,143 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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
;=========================== begin_copyright_notice ============================
;
; Copyright (C) 2022-2024 Intel Corporation
;
; SPDX-License-Identifier: MIT
;
;============================ end_copyright_notice =============================


; REQUIRES: llvm-14-plus
; RUN: igc_opt --opaque-pointers -debugify --igc-gen-specific-pattern -check-debugify -S < %s 2>&1 | FileCheck %s
; ------------------------------------------------
; GenSpecificPattern:
; ------------------------------------------------

; Debug-info related check
; CHECK-NOT: WARNING
; CHECK: CheckModuleDebugify: PASS

define void @test_add(i64 %src1) {
; CHECK-LABEL: @test_add(
; CHECK:    [[TMP1:%[A-z0-9.]*]] = add i64 %src1, 57
; CHECK:    [[TMP2:%[A-z0-9.]*]] = bitcast i64 [[TMP1]] to <2 x i32>
; CHECK:    [[TMP3:%[A-z0-9.]*]] = extractelement <2 x i32> [[TMP2]], i32 0
; CHECK:    [[TMP4:%[A-z0-9.]*]] = insertelement <2 x i32> <i32 0, i32 undef>, i32 [[TMP3]], i32 1
; CHECK:    [[TMP5:%[A-z0-9.]*]] = bitcast <2 x i32> [[TMP4]] to i64
; CHECK:    call void @use.i64(i64 [[TMP5]])
; CHECK:    ret void

  %1 = add i64 %src1, 42
  %2 = add i64 %1, 15
  %3 = shl i64 %2, 32
  call void @use.i64(i64 %3)
  ret void
}

define void @test_trunc_hi(i64 %src1) {
; CHECK-LABEL: @test_trunc_hi(
; CHECK:    [[TMP1:%[A-z0-9.]*]] = trunc i64 %src1 to i32
; CHECK:    [[TMP2:%[A-z0-9.]*]] = bitcast i32 [[TMP1]] to <2 x i16>
; CHECK:    [[TMP3:%[A-z0-9.]*]] = extractelement <2 x i16> [[TMP2]], i32 0
; CHECK:    [[TMP4:%[A-z0-9.]*]] = sext i16 [[TMP3]] to i32
; CHECK:    call void @use.i32(i32 [[TMP4]])
; CHECK:    ret void

  %1 = trunc i64 %src1 to i32
  %2 = shl i32 %1, 16
  %3 = ashr i32 %2, 16
  call void @use.i32(i32 %3)
  ret void
}

define void @test_trunc_low(i64 %src1) {
; CHECK-LABEL: @test_trunc_low(
; CHECK:    [[TMP1:%[A-z0-9.]*]] = trunc i64 %src1 to i32
; CHECK:    [[TMP2:%[A-z0-9.]*]] = bitcast i32 [[TMP1]] to <2 x i16>
; CHECK:    [[TMP3:%[A-z0-9.]*]] = extractelement <2 x i16> [[TMP2]], i32 1
; CHECK:    [[TMP4:%[A-z0-9.]*]] = sext i16 [[TMP3]] to i32
; CHECK:    call void @use.i32(i32 [[TMP4]])
; CHECK:    ret void

  %1 = trunc i64 %src1 to i32
  %2 = ashr i32 %1, 16
  call void @use.i32(i32 %2)
  ret void
}

define void @test_and32(double %src1) {
; CHECK-LABEL: @test_and32(
; CHECK:    [[TMP1:%[A-z0-9.]*]] = bitcast double %src1 to <2 x i32>
; CHECK:    [[TMP2:%[A-z0-9.]*]] = extractelement <2 x i32> [[TMP1]], i32 1
; CHECK:    [[TMP3:%[A-z0-9.]*]] = and i32 [[TMP2]], 2147483647
; CHECK:    call void @use.i32(i32 [[TMP3]])
; CHECK:    ret void

  %1 = fsub double -0.000000e+00, %src1
  %2 = bitcast double %1 to <2 x i32>
  %3 = extractelement <2 x i32> %2, i32 1
  %4 = and i32 %3, 2147483647
  call void @use.i32(i32 %4)
  ret void
}

define void @test_and64(double %src1) {
; CHECK-LABEL: @test_and64(
; CHECK:    [[TMP1:%[A-z0-9.]*]] = fsub double -0.000000e+00, [[SRC1:%[A-z0-9.]*]]
; CHECK:    [[TMP2:%[A-z0-9.]*]] = bitcast double [[TMP1]] to i64
; CHECK:    [[TMP3:%[A-z0-9.]*]] = bitcast double [[SRC1]] to i64
; CHECK:    [[TMP4:%[A-z0-9.]*]] = and i64 [[TMP3]], 9223372032559808512
; CHECK:    call void @use.i64(i64 [[TMP4]])
; CHECK:    [[TMP5:%[A-z0-9.]*]] = bitcast i64 [[TMP2]] to <2 x i32>
; CHECK:    [[TMP6:%[A-z0-9.]*]] = extractelement <2 x i32> [[TMP5]], i32 1
; CHECK:    [[TMP7:%[A-z0-9.]*]] = insertelement <2 x i32> <i32 0, i32 undef>, i32 [[TMP6]], i32 1
; CHECK:    [[TMP8:%[A-z0-9.]*]] = bitcast <2 x i32> [[TMP7]] to i64
; CHECK:    call void @use.i64(i64 [[TMP8]])
; CHECK:    ret void

  %1 = fsub double -0.000000e+00, %src1
  %2 = bitcast double %1 to i64
  %3 = and i64 %2, 9223372032559808512
  call void @use.i64(i64 %3)
  %4 = and i64 %2, -4294967296
  call void @use.i64(i64 %4)
  ret void
}

define void @test_simple_mul_pow2(i32 %arg) {
  %1 = mul i32 %arg, 16
  call void @use.i32(i32 %1)
  ret void
}
; CHECK-LABEL: @test_simple_mul_pow2(i32 %arg
; CHECK:       %[[SHL:.+]] = shl i32 %arg, 4
; CHECK:       call void @use.i32(i32 %[[SHL]])
; CHECK:       ret void

define void @test_mul_neg_pow2_with_adds(i32 %arg0, i32 %arg1, i32 %arg2) {
entry:
; COM: The mul itself + simple use
  %0 = mul i32 %arg0, -1024
  call void @use.i32(i32 %0)
  br label %.add1
.add1:
; COM: mul + addend
  %1 = add i32 %0, %arg1
  call void @use.i32(i32 %1)
  br label %.add2
.add2:
; COM: addend + mul
  %2 = add i32 %arg2, %0
  call void @use.i32(i32 %2)
  ret void
}
; CHECK-LABEL: @test_mul_neg_pow2_with_adds(i32 %arg0, i32 %arg1, i32 %arg2
; COM: The mul itself + simple use
; CHECK:     entry:
; CHECK:       %[[SHL:.+]] = shl i32 %arg0, 10
; CHECK:       %[[NEG:.+]] = sub i32 0, %[[SHL]]
; CHECK:       call void @use.i32(i32 %[[NEG]])
; CHECK:     br label %.add1
; COM: mul + addend -> addend - shl
; CHECK:     .add1:
; CHECK:       %[[SUB1:.+]] = sub i32 %arg1, %[[SHL]]
; CHECK:       call void @use.i32(i32 %[[SUB1]])
; CHECK:       br label %.add2
; COM: addend + mul -> addend - shl
; CHECK:     .add2:
; CHECK:       %[[SUB2:.+]] = sub i32 %arg2, %[[SHL]]
; CHECK:       call void @use.i32(i32 %[[SUB2]])
; CHECK:       ret void

declare void @use.i64(i64)
declare void @use.i32(i32)