[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / PowerPC / addze.ll
blob212da8b4990e8b2f57bdee9f2a873004e7c1e034
1 ; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-unknown \
2 ; RUN:  -ppc-asm-full-reg-names -mcpu=pwr9 < %s  | FileCheck %s
3 ; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-unknown \
4 ; RUN:  -ppc-asm-full-reg-names -mcpu=pwr9 < %s  | FileCheck %s
6 define i64 @addze1(i64 %X, i64 %Z) {
7 ; CHECK-LABEL: addze1:
8 ; CHECK: # %bb.0:
9 ; CHECK-NEXT: addic [[REG1:r[0-9]+]], [[REG1]], -1
10 ; CHECK-NEXT: addze [[REG2:r[0-9]+]], [[REG2]]
11 ; CHECK-NEXT: blr
12   %cmp = icmp ne i64 %Z, 0
13   %conv1 = zext i1 %cmp to i64
14   %add = add nsw i64 %conv1, %X
15   ret i64 %add
18 define i64 @addze2(i64 %X, i64 %Z) {
19 ; CHECK-LABEL: addze2:
20 ; CHECK: # %bb.0:
21 ; CHECK-NEXT: subfic [[REG1:r[0-9]+]], [[REG1]], 0
22 ; CHECK-NEXT: addze  [[REG2:r[0-9]+]], [[REG2]]
23 ; CHECK-NEXT: blr
24   %cmp = icmp eq i64 %Z, 0
25   %conv1 = zext i1 %cmp to i64
26   %add = add nsw i64 %conv1, %X
27   ret i64 %add
30 define i64 @addze3(i64 %X, i64 %Z) {
31 ; CHECK-LABEL: addze3:
32 ; CHECK: # %bb.0:
33 ; CHECK-NEXT: addi  [[REG1:r[0-9]+]], [[REG1]], -32768
34 ; CHECK-NEXT: addic [[REG1]], [[REG1]], -1
35 ; CHECK-NEXT: addze [[REG2:r[0-9]+]], [[REG2]]
36 ; CHECK-NEXT: blr
37   %cmp = icmp ne i64 %Z, 32768
38   %conv1 = zext i1 %cmp to i64
39   %add = add nsw i64 %conv1, %X
40   ret i64 %add
43 define i64 @addze4(i64 %X, i64 %Z) {
44 ; CHECK-LABEL: addze4:
45 ; CHECK: # %bb.0:
46 ; CHECK-NEXT: addi   [[REG1:r[0-9]+]], [[REG1]], -32768
47 ; CHECK-NEXT: subfic [[REG1]], [[REG1]], 0
48 ; CHECK-NEXT: addze  [[REG2:r[0-9]+]], [[REG2]]
49 ; CHECK-NEXT: blr
50   %cmp = icmp eq i64 %Z, 32768
51   %conv1 = zext i1 %cmp to i64
52   %add = add nsw i64 %conv1, %X
53   ret i64 %add
56 define i64 @addze5(i64 %X, i64 %Z) {
57 ; CHECK-LABEL: addze5:
58 ; CHECK: # %bb.0:
59 ; CHECK-NEXT: addi  [[REG1:r[0-9]+]], [[REG1]], 32767
60 ; CHECK-NEXT: addic [[REG1]], [[REG1]], -1
61 ; CHECK-NEXT: addze [[REG2:r[0-9]+]], [[REG2]]
62 ; CHECK-NEXT: blr
63   %cmp = icmp ne i64 %Z, -32767
64   %conv1 = zext i1 %cmp to i64
65   %add = add nsw i64 %conv1, %X
66   ret i64 %add
69 define i64 @addze6(i64 %X, i64 %Z) {
70 ; CHECK-LABEL: addze6:
71 ; CHECK: # %bb.0:
72 ; CHECK-NEXT: addi   [[REG1:r[0-9]+]], [[REG1]], 32767
73 ; CHECK-NEXT: subfic [[REG1]], [[REG1]], 0
74 ; CHECK-NEXT: addze  [[REG2:r[0-9]+]], [[REG2]]
75 ; CHECK-NEXT: blr
76   %cmp = icmp eq i64 %Z, -32767
77   %conv1 = zext i1 %cmp to i64
78   %add = add nsw i64 %conv1, %X
79   ret i64 %add
82 ; element is out of range
83 define i64 @test1(i64 %X, i64 %Z) {
84 ; CHECK-LABEL: test1:
85 ; CHECK: # %bb.0:
86 ; CHECK-NEXT: li    [[REG1:r[0-9]+]], -32768
87 ; CHECK-NEXT: xor   [[REG2:r[0-9]+]], [[REG2]], [[REG1]]
88 ; CHECK-NEXT: addic [[REG1]], [[REG2]], -1
89 ; CHECK-NEXT: subfe [[REG2]], [[REG1]], [[REG2]]
90 ; CHECK-NEXT: add   [[REG3:r[0-9]+]], [[REG2]], [[REG3]]
91 ; CHECK-NEXT: blr
92   %cmp = icmp ne i64 %Z, -32768
93   %conv1 = zext i1 %cmp to i64
94   %add = add nsw i64 %conv1, %X
95   ret i64 %add
98 define i64 @test2(i64 %X, i64 %Z) {
99 ; CHECK-LABEL: test2:
100 ; CHECK: # %bb.0:
101 ; CHECK-NEXT: li     [[REG1:r[0-9]+]], -32768
102 ; CHECK-NEXT: xor    [[REG2:r[0-9]+]], [[REG2]], [[REG1]]
103 ; CHECK-NEXT: cntlzd [[REG2]], [[REG2]]
104 ; CHECK-NEXT: rldicl [[REG2]], [[REG2]], 58, 63
105 ; CHECK-NEXT: add    [[REG3:r[0-9]+]], [[REG2]], [[REG3]]
106 ; CHECK-NEXT: blr
107   %cmp = icmp eq i64 %Z, -32768
108   %conv1 = zext i1 %cmp to i64
109   %add = add nsw i64 %conv1, %X
110   ret i64 %add
113 define i64 @test3(i64 %X, i64 %Z) {
114 ; CHECK-LABEL: test3:
115 ; CHECK: # %bb.0:
116 ; CHECK-NEXT: li    [[REG1:r[0-9]+]], 0
117 ; CHECK-NEXT: ori   [[REG1]], [[REG1]], 32769
118 ; CHECK-NEXT: xor   [[REG2:r[0-9]+]], [[REG2]], [[REG1]]
119 ; CHECK-NEXT: addic [[REG1]], [[REG2]], -1
120 ; CHECK-NEXT: subfe [[REG2]], [[REG1]], [[REG2]]
121 ; CHECK-NEXT: add   [[REG3:r[0-9]+]], [[REG2]], [[REG3]]
122 ; CHECK-NEXT: blr
123   %cmp = icmp ne i64 %Z, 32769
124   %conv1 = zext i1 %cmp to i64
125   %add = add nsw i64 %conv1, %X
126   ret i64 %add
129 define i64 @test4(i64 %X, i64 %Z) {
130 ; CHECK-LABEL: test4:
131 ; CHECK: # %bb.0:
132 ; CHECK-NEXT: li     [[REG1:r[0-9]+]], 0
133 ; CHECK-NEXT: ori    [[REG1]], [[REG1]], 32769
134 ; CHECK-NEXT: xor    [[REG2:r[0-9]+]], [[REG2]], [[REG1]]
135 ; CHECK-NEXT: cntlzd [[REG2]], [[REG2]]
136 ; CHECK-NEXT: rldicl [[REG2]], [[REG2]], 58, 63
137 ; CHECK-NEXT: add    [[REG3:r[0-9]+]], [[REG2]], [[REG3]]
138 ; CHECK-NEXT: blr
139   %cmp = icmp eq i64 %Z, 32769
140   %conv1 = zext i1 %cmp to i64
141   %add = add nsw i64 %conv1, %X
142   ret i64 %add
145 ; comparison of two registers
146 define i64 @test5(i64 %X, i64 %Y, i64 %Z) {
147 ; CHECK-LABEL: test5:
148 ; CHECK: # %bb.0:
149 ; CHECK-NEXT: xor   [[REG2:r[0-9]+]], [[REG2]], [[REG1:r[0-9]+]]
150 ; CHECK-NEXT: addic [[REG1]], [[REG2]], -1
151 ; CHECK-NEXT: subfe [[REG2]], [[REG1]], [[REG2]]
152 ; CHECK-NEXT: add   [[REG3:r[0-9]+]], [[REG2]], [[REG3]]
153 ; CHECK-NEXT: blr
154   %cmp = icmp ne i64 %Y, %Z
155   %conv1 = zext i1 %cmp to i64
156   %add = add nsw i64 %conv1, %X
157   ret i64 %add
160 define i64 @test6(i64 %X, i64 %Y, i64 %Z) {
161 ; CHECK-LABEL: test6:
162 ; CHECK: # %bb.0:
163 ; CHECK-NEXT: xor    [[REG2:r[0-9]+]], [[REG2]], [[REG1:r[0-9]+]]
164 ; CHECK-NEXT: cntlzd [[REG2]], [[REG2]]
165 ; CHECK-NEXT: rldicl [[REG2]], [[REG2]], 58, 63
166 ; CHECK-NEXT: add    [[REG3:r[0-9]+]], [[REG2]], [[REG3]]
167 ; CHECK-NEXT: blr
168   %cmp = icmp eq i64 %Y, %Z
169   %conv1 = zext i1 %cmp to i64
170   %add = add nsw i64 %conv1, %X
171   ret i64 %add