File: apint-select.ll

package info (click to toggle)
llvm-toolchain-6.0 1:6.0-1~bpo9+1
  • links: PTS, VCS
  • area: main
  • in suites: stretch-backports
  • size: 594,652 kB
  • sloc: cpp: 3,044,500; ansic: 595,051; asm: 271,890; python: 128,923; objc: 106,554; sh: 21,854; lisp: 10,191; pascal: 6,094; ml: 5,544; perl: 5,265; makefile: 2,214; cs: 2,027; xml: 686; php: 212; csh: 117
file content (144 lines) | stat: -rw-r--r-- 3,783 bytes parent folder | download | duplicates (4)
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
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt < %s -instcombine -S | FileCheck %s

; No selects should remain.

define i41 @zext(i1 %C) {
; CHECK-LABEL: @zext(
; CHECK-NEXT:    [[V:%.*]] = zext i1 %C to i41
; CHECK-NEXT:    ret i41 [[V]]
;
  %V = select i1 %C, i41 1, i41 0
  ret i41 %V
}

define i41 @sext(i1 %C) {
; CHECK-LABEL: @sext(
; CHECK-NEXT:    [[V:%.*]] = sext i1 %C to i41
; CHECK-NEXT:    ret i41 [[V]]
;
  %V = select i1 %C, i41 -1, i41 0
  ret i41 %V
}

define i999 @not_zext(i1 %C) {
; CHECK-LABEL: @not_zext(
; CHECK-NEXT:    [[NOT_C:%.*]] = xor i1 %C, true
; CHECK-NEXT:    [[V:%.*]] = zext i1 [[NOT_C]] to i999
; CHECK-NEXT:    ret i999 [[V]]
;
  %V = select i1 %C, i999 0, i999 1
  ret i999 %V
}

define i999 @not_sext(i1 %C) {
; CHECK-LABEL: @not_sext(
; CHECK-NEXT:    [[NOT_C:%.*]] = xor i1 %C, true
; CHECK-NEXT:    [[V:%.*]] = sext i1 [[NOT_C]] to i999
; CHECK-NEXT:    ret i999 [[V]]
;
  %V = select i1 %C, i999 0, i999 -1
  ret i999 %V
}

; Vector selects of vector splat constants match APInt too.

define <2 x i41> @zext_vec(<2 x i1> %C) {
; CHECK-LABEL: @zext_vec(
; CHECK-NEXT:    [[V:%.*]] = zext <2 x i1> %C to <2 x i41>
; CHECK-NEXT:    ret <2 x i41> [[V]]
;
  %V = select <2 x i1> %C, <2 x i41> <i41 1, i41 1>, <2 x i41> <i41 0, i41 0>
  ret <2 x i41> %V
}

define <2 x i32> @sext_vec(<2 x i1> %C) {
; CHECK-LABEL: @sext_vec(
; CHECK-NEXT:    [[V:%.*]] = sext <2 x i1> %C to <2 x i32>
; CHECK-NEXT:    ret <2 x i32> [[V]]
;
  %V = select <2 x i1> %C, <2 x i32> <i32 -1, i32 -1>, <2 x i32> <i32 0, i32 0>
  ret <2 x i32> %V
}

define <2 x i999> @not_zext_vec(<2 x i1> %C) {
; CHECK-LABEL: @not_zext_vec(
; CHECK-NEXT:    [[NOT_C:%.*]] = xor <2 x i1> %C, <i1 true, i1 true>
; CHECK-NEXT:    [[V:%.*]] = zext <2 x i1> [[NOT_C]] to <2 x i999>
; CHECK-NEXT:    ret <2 x i999> [[V]]
;
  %V = select <2 x i1> %C, <2 x i999> <i999 0, i999 0>, <2 x i999> <i999 1, i999 1>
  ret <2 x i999> %V
}

define <2 x i64> @not_sext_vec(<2 x i1> %C) {
; CHECK-LABEL: @not_sext_vec(
; CHECK-NEXT:    [[NOT_C:%.*]] = xor <2 x i1> %C, <i1 true, i1 true>
; CHECK-NEXT:    [[V:%.*]] = sext <2 x i1> [[NOT_C]] to <2 x i64>
; CHECK-NEXT:    ret <2 x i64> [[V]]
;
  %V = select <2 x i1> %C, <2 x i64> <i64 0, i64 0>, <2 x i64> <i64 -1, i64 -1>
  ret <2 x i64> %V
}

; But don't touch this - we would need 3 instructions to extend and splat the scalar select condition.

define <2 x i32> @scalar_select_of_vectors(i1 %c) {
; CHECK-LABEL: @scalar_select_of_vectors(
; CHECK-NEXT:    [[V:%.*]] = select i1 %c, <2 x i32> <i32 1, i32 1>, <2 x i32> zeroinitializer
; CHECK-NEXT:    ret <2 x i32> [[V]]
;
  %V = select i1 %c, <2 x i32> <i32 1, i32 1>, <2 x i32> zeroinitializer
  ret <2 x i32> %V
}

;; (x <s 0) ? -1 : 0 -> ashr x, 31

define i41 @test3(i41 %X) {
; CHECK-LABEL: @test3(
; CHECK-NEXT:    [[X_LOBIT:%.*]] = ashr i41 %X, 40
; CHECK-NEXT:    ret i41 [[X_LOBIT]]
;
  %t = icmp slt i41 %X, 0
  %V = select i1 %t, i41 -1, i41 0
  ret i41 %V
}

;; (x <s 0) ? -1 : 0 -> ashr x, 31

define i1023 @test4(i1023 %X) {
; CHECK-LABEL: @test4(
; CHECK-NEXT:    [[X_LOBIT:%.*]] = ashr i1023 %X, 1022
; CHECK-NEXT:    ret i1023 [[X_LOBIT]]
;
  %t = icmp slt i1023 %X, 0
  %V = select i1 %t, i1023 -1, i1023 0
  ret i1023 %V
}

;; ((X & 27) ? 27 : 0)

define i41 @test5(i41 %X) {
; CHECK-LABEL: @test5(
; CHECK-NEXT:    [[Y:%.*]] = and i41 %X, 32
; CHECK-NEXT:    ret i41 [[Y]]
;
  %Y = and i41 %X, 32
  %t = icmp ne i41 %Y, 0
  %V = select i1 %t, i41 32, i41 0
  ret i41 %V
}

;; ((X & 27) ? 27 : 0)

define i1023 @test6(i1023 %X) {
; CHECK-LABEL: @test6(
; CHECK-NEXT:    [[Y:%.*]] = and i1023 %X, 64
; CHECK-NEXT:    ret i1023 [[Y]]
;
  %Y = and i1023 %X, 64
  %t = icmp ne i1023 %Y, 0
  %V = select i1 %t, i1023 64, i1023 0
  ret i1023 %V
}