Skip to content

Commit 3e56988

Browse files
committed
[RISCV][GISel] Lower G_UADDE, G_UADDO, G_USUBE, and G_USUBO
RISC-V doesn't have flag registers, we need to implement these with add/sub and compares. Remove the untested legalization for the signed versions. We can add it back when we write tests. Reviewed By: nitinjohnraj Differential Revision: https://reviews.llvm.org/D157772
1 parent 9be33de commit 3e56988

File tree

7 files changed

+155
-105
lines changed

7 files changed

+155
-105
lines changed

llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST) {
2424
const LLT XLenLLT = LLT::scalar(XLen);
2525
const LLT DoubleXLenLLT = LLT::scalar(2 * XLen);
2626
const LLT p0 = LLT::pointer(0, XLen);
27+
const LLT s1 = LLT::scalar(1);
2728

2829
using namespace TargetOpcode;
2930

@@ -33,11 +34,8 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST) {
3334
.clampScalar(0, XLenLLT, XLenLLT);
3435

3536
getActionDefinitionsBuilder(
36-
{G_UADDE, G_UADDO, G_USUBE, G_USUBO, G_SADDE, G_SADDO, G_SSUBE, G_SSUBO})
37-
.legalFor({{XLenLLT, XLenLLT}})
38-
.clampScalar(0, XLenLLT, XLenLLT)
39-
.clampScalar(1, XLenLLT, XLenLLT)
40-
.widenScalarToNextPow2(0);
37+
{G_UADDE, G_UADDO, G_USUBE, G_USUBO})
38+
.lowerFor({{XLenLLT, s1}});
4139

4240
getActionDefinitionsBuilder({G_ASHR, G_LSHR, G_SHL})
4341
.legalFor({{XLenLLT, XLenLLT}})

llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-add.mir

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -87,12 +87,14 @@ body: |
8787
; CHECK-NEXT: %xhi:_(s32) = COPY $x11
8888
; CHECK-NEXT: %ylo:_(s32) = COPY $x12
8989
; CHECK-NEXT: %yhi:_(s32) = COPY $x13
90-
; CHECK-NEXT: [[UADDO:%[0-9]+]]:_(s32), [[UADDO1:%[0-9]+]]:_(s32) = G_UADDO %xlo, %ylo
90+
; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD %xlo, %ylo
91+
; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[ADD]](s32), %ylo
92+
; CHECK-NEXT: [[ADD1:%[0-9]+]]:_(s32) = G_ADD %xhi, %yhi
9193
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
92-
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[UADDO1]], [[C]]
93-
; CHECK-NEXT: [[UADDE:%[0-9]+]]:_(s32), [[UADDE1:%[0-9]+]]:_(s32) = G_UADDE %xhi, %yhi, [[AND]]
94-
; CHECK-NEXT: $x10 = COPY [[UADDO]](s32)
95-
; CHECK-NEXT: $x11 = COPY [[UADDE]](s32)
94+
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[ICMP]], [[C]]
95+
; CHECK-NEXT: [[ADD2:%[0-9]+]]:_(s32) = G_ADD [[ADD1]], [[AND]]
96+
; CHECK-NEXT: $x10 = COPY [[ADD]](s32)
97+
; CHECK-NEXT: $x11 = COPY [[ADD2]](s32)
9698
; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11
9799
%xlo:_(s32) = COPY $x10
98100
%xhi:_(s32) = COPY $x11
@@ -119,12 +121,14 @@ body: |
119121
; CHECK-NEXT: %hi1:_(s32) = COPY $x11
120122
; CHECK-NEXT: %lo2:_(s32) = COPY $x12
121123
; CHECK-NEXT: %hi2:_(s32) = COPY $x13
122-
; CHECK-NEXT: [[UADDO:%[0-9]+]]:_(s32), [[UADDO1:%[0-9]+]]:_(s32) = G_UADDO %lo1, %lo2
124+
; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD %lo1, %lo2
125+
; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[ADD]](s32), %lo2
126+
; CHECK-NEXT: [[ADD1:%[0-9]+]]:_(s32) = G_ADD %hi1, %hi2
123127
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
124-
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[UADDO1]], [[C]]
125-
; CHECK-NEXT: [[UADDE:%[0-9]+]]:_(s32), [[UADDE1:%[0-9]+]]:_(s32) = G_UADDE %hi1, %hi2, [[AND]]
126-
; CHECK-NEXT: $x10 = COPY [[UADDO]](s32)
127-
; CHECK-NEXT: $x11 = COPY [[UADDE]](s32)
128+
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[ICMP]], [[C]]
129+
; CHECK-NEXT: [[ADD2:%[0-9]+]]:_(s32) = G_ADD [[ADD1]], [[AND]]
130+
; CHECK-NEXT: $x10 = COPY [[ADD]](s32)
131+
; CHECK-NEXT: $x11 = COPY [[ADD2]](s32)
128132
; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11
129133
%lo1:_(s32) = COPY $x10
130134
%hi1:_(s32) = COPY $x11
@@ -150,16 +154,24 @@ body: |
150154
; CHECK-NEXT: %lo2:_(s32) = COPY $x13
151155
; CHECK-NEXT: %mid2:_(s32) = COPY $x14
152156
; CHECK-NEXT: %hi2:_(s32) = COPY $x15
153-
; CHECK-NEXT: [[UADDO:%[0-9]+]]:_(s32), [[UADDO1:%[0-9]+]]:_(s32) = G_UADDO %lo1, %lo2
157+
; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD %lo1, %lo2
158+
; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[ADD]](s32), %lo2
159+
; CHECK-NEXT: [[ADD1:%[0-9]+]]:_(s32) = G_ADD %mid1, %mid2
160+
; CHECK-NEXT: [[ICMP1:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[ADD1]](s32), %mid1
154161
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
155-
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[UADDO1]], [[C]]
156-
; CHECK-NEXT: [[UADDE:%[0-9]+]]:_(s32), [[UADDE1:%[0-9]+]]:_(s32) = G_UADDE %mid1, %mid2, [[AND]]
157-
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
158-
; CHECK-NEXT: [[AND1:%[0-9]+]]:_(s32) = G_AND [[UADDE1]], [[C1]]
159-
; CHECK-NEXT: [[UADDE2:%[0-9]+]]:_(s32), [[UADDE3:%[0-9]+]]:_(s32) = G_UADDE %hi1, %hi2, [[AND1]]
160-
; CHECK-NEXT: $x10 = COPY [[UADDO]](s32)
161-
; CHECK-NEXT: $x11 = COPY [[UADDE]](s32)
162-
; CHECK-NEXT: $x12 = COPY [[UADDE2]](s32)
162+
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[ICMP]], [[C]]
163+
; CHECK-NEXT: [[ADD2:%[0-9]+]]:_(s32) = G_ADD [[ADD1]], [[AND]]
164+
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
165+
; CHECK-NEXT: [[ICMP2:%[0-9]+]]:_(s32) = G_ICMP intpred(eq), [[ADD2]](s32), [[C1]]
166+
; CHECK-NEXT: [[AND1:%[0-9]+]]:_(s32) = G_AND [[ICMP2]], [[ICMP]]
167+
; CHECK-NEXT: [[OR:%[0-9]+]]:_(s32) = G_OR [[ICMP1]], [[AND1]]
168+
; CHECK-NEXT: [[ADD3:%[0-9]+]]:_(s32) = G_ADD %hi1, %hi2
169+
; CHECK-NEXT: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
170+
; CHECK-NEXT: [[AND2:%[0-9]+]]:_(s32) = G_AND [[OR]], [[C2]]
171+
; CHECK-NEXT: [[ADD4:%[0-9]+]]:_(s32) = G_ADD [[ADD3]], [[AND2]]
172+
; CHECK-NEXT: $x10 = COPY [[ADD]](s32)
173+
; CHECK-NEXT: $x11 = COPY [[ADD2]](s32)
174+
; CHECK-NEXT: $x12 = COPY [[ADD4]](s32)
163175
; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11, implicit $x12
164176
%lo1:_(s32) = COPY $x10
165177
%mid1:_(s32) = COPY $x11

llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-mul-ext.mir

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -160,26 +160,28 @@ body: |
160160
; CHECK-NEXT: [[MUL1:%[0-9]+]]:_(s32) = G_MUL %mid1, %lo2
161161
; CHECK-NEXT: [[MUL2:%[0-9]+]]:_(s32) = G_MUL %lo1, %mid2
162162
; CHECK-NEXT: [[UMULH:%[0-9]+]]:_(s32) = G_UMULH %lo1, %lo2
163-
; CHECK-NEXT: [[UADDO:%[0-9]+]]:_(s32), [[UADDO1:%[0-9]+]]:_(s32) = G_UADDO [[MUL1]], [[MUL2]]
163+
; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[MUL1]], [[MUL2]]
164+
; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[ADD]](s32), [[MUL2]]
164165
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
165-
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[UADDO1]], [[C]]
166-
; CHECK-NEXT: [[UADDO2:%[0-9]+]]:_(s32), [[UADDO3:%[0-9]+]]:_(s32) = G_UADDO [[UADDO]], [[UMULH]]
166+
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[ICMP]], [[C]]
167+
; CHECK-NEXT: [[ADD1:%[0-9]+]]:_(s32) = G_ADD [[ADD]], [[UMULH]]
168+
; CHECK-NEXT: [[ICMP1:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[ADD1]](s32), [[UMULH]]
167169
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
168-
; CHECK-NEXT: [[AND1:%[0-9]+]]:_(s32) = G_AND [[UADDO3]], [[C1]]
169-
; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[AND]], [[AND1]]
170+
; CHECK-NEXT: [[AND1:%[0-9]+]]:_(s32) = G_AND [[ICMP1]], [[C1]]
171+
; CHECK-NEXT: [[ADD2:%[0-9]+]]:_(s32) = G_ADD [[AND]], [[AND1]]
170172
; CHECK-NEXT: [[MUL3:%[0-9]+]]:_(s32) = G_MUL %hi1, %lo2
171173
; CHECK-NEXT: [[MUL4:%[0-9]+]]:_(s32) = G_MUL %mid1, %mid2
172174
; CHECK-NEXT: [[MUL5:%[0-9]+]]:_(s32) = G_MUL %lo1, %hi2
173175
; CHECK-NEXT: [[UMULH1:%[0-9]+]]:_(s32) = G_UMULH %mid1, %lo2
174176
; CHECK-NEXT: [[UMULH2:%[0-9]+]]:_(s32) = G_UMULH %lo1, %mid2
175-
; CHECK-NEXT: [[UADDO4:%[0-9]+]]:_(s32), [[UADDO5:%[0-9]+]]:_(s32) = G_UADDO [[MUL3]], [[MUL4]]
176-
; CHECK-NEXT: [[UADDO6:%[0-9]+]]:_(s32), [[UADDO7:%[0-9]+]]:_(s32) = G_UADDO [[UADDO4]], [[MUL5]]
177-
; CHECK-NEXT: [[UADDO8:%[0-9]+]]:_(s32), [[UADDO9:%[0-9]+]]:_(s32) = G_UADDO [[UADDO6]], [[UMULH1]]
178-
; CHECK-NEXT: [[UADDO10:%[0-9]+]]:_(s32), [[UADDO11:%[0-9]+]]:_(s32) = G_UADDO [[UADDO8]], [[UMULH2]]
179-
; CHECK-NEXT: [[UADDO12:%[0-9]+]]:_(s32), [[UADDO13:%[0-9]+]]:_(s32) = G_UADDO [[UADDO10]], [[ADD]]
177+
; CHECK-NEXT: [[ADD3:%[0-9]+]]:_(s32) = G_ADD [[MUL3]], [[MUL4]]
178+
; CHECK-NEXT: [[ADD4:%[0-9]+]]:_(s32) = G_ADD [[ADD3]], [[MUL5]]
179+
; CHECK-NEXT: [[ADD5:%[0-9]+]]:_(s32) = G_ADD [[ADD4]], [[UMULH1]]
180+
; CHECK-NEXT: [[ADD6:%[0-9]+]]:_(s32) = G_ADD [[ADD5]], [[UMULH2]]
181+
; CHECK-NEXT: [[ADD7:%[0-9]+]]:_(s32) = G_ADD [[ADD6]], [[ADD2]]
180182
; CHECK-NEXT: $x10 = COPY [[MUL]](s32)
181-
; CHECK-NEXT: $x11 = COPY [[UADDO2]](s32)
182-
; CHECK-NEXT: $x12 = COPY [[UADDO12]](s32)
183+
; CHECK-NEXT: $x11 = COPY [[ADD1]](s32)
184+
; CHECK-NEXT: $x12 = COPY [[ADD7]](s32)
183185
; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11, implicit $x12
184186
%lo1:_(s32) = COPY $x10
185187
%mid1:_(s32) = COPY $x11

llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv32/legalize-sub.mir

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -87,12 +87,14 @@ body: |
8787
; CHECK-NEXT: %xhi:_(s32) = COPY $x11
8888
; CHECK-NEXT: %ylo:_(s32) = COPY $x12
8989
; CHECK-NEXT: %yhi:_(s32) = COPY $x13
90-
; CHECK-NEXT: [[USUBO:%[0-9]+]]:_(s32), [[USUBO1:%[0-9]+]]:_(s32) = G_USUBO %xlo, %ylo
90+
; CHECK-NEXT: [[SUB:%[0-9]+]]:_(s32) = G_SUB %xlo, %ylo
91+
; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), %xlo(s32), %ylo
92+
; CHECK-NEXT: [[SUB1:%[0-9]+]]:_(s32) = G_SUB %xhi, %yhi
9193
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
92-
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[USUBO1]], [[C]]
93-
; CHECK-NEXT: [[USUBE:%[0-9]+]]:_(s32), [[USUBE1:%[0-9]+]]:_(s32) = G_USUBE %xhi, %yhi, [[AND]]
94-
; CHECK-NEXT: $x10 = COPY [[USUBO]](s32)
95-
; CHECK-NEXT: $x11 = COPY [[USUBE]](s32)
94+
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[ICMP]], [[C]]
95+
; CHECK-NEXT: [[SUB2:%[0-9]+]]:_(s32) = G_SUB [[SUB1]], [[AND]]
96+
; CHECK-NEXT: $x10 = COPY [[SUB]](s32)
97+
; CHECK-NEXT: $x11 = COPY [[SUB2]](s32)
9698
; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11
9799
%xlo:_(s32) = COPY $x10
98100
%xhi:_(s32) = COPY $x11
@@ -119,12 +121,14 @@ body: |
119121
; CHECK-NEXT: %hi1:_(s32) = COPY $x11
120122
; CHECK-NEXT: %lo2:_(s32) = COPY $x12
121123
; CHECK-NEXT: %hi2:_(s32) = COPY $x13
122-
; CHECK-NEXT: [[USUBO:%[0-9]+]]:_(s32), [[USUBO1:%[0-9]+]]:_(s32) = G_USUBO %lo1, %lo2
124+
; CHECK-NEXT: [[SUB:%[0-9]+]]:_(s32) = G_SUB %lo1, %lo2
125+
; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), %lo1(s32), %lo2
126+
; CHECK-NEXT: [[SUB1:%[0-9]+]]:_(s32) = G_SUB %hi1, %hi2
123127
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
124-
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[USUBO1]], [[C]]
125-
; CHECK-NEXT: [[USUBE:%[0-9]+]]:_(s32), [[USUBE1:%[0-9]+]]:_(s32) = G_USUBE %hi1, %hi2, [[AND]]
126-
; CHECK-NEXT: $x10 = COPY [[USUBO]](s32)
127-
; CHECK-NEXT: $x11 = COPY [[USUBE]](s32)
128+
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[ICMP]], [[C]]
129+
; CHECK-NEXT: [[SUB2:%[0-9]+]]:_(s32) = G_SUB [[SUB1]], [[AND]]
130+
; CHECK-NEXT: $x10 = COPY [[SUB]](s32)
131+
; CHECK-NEXT: $x11 = COPY [[SUB2]](s32)
128132
; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11
129133
%lo1:_(s32) = COPY $x10
130134
%hi1:_(s32) = COPY $x11
@@ -150,16 +154,24 @@ body: |
150154
; CHECK-NEXT: %lo2:_(s32) = COPY $x13
151155
; CHECK-NEXT: %mid2:_(s32) = COPY $x14
152156
; CHECK-NEXT: %hi2:_(s32) = COPY $x15
153-
; CHECK-NEXT: [[USUBO:%[0-9]+]]:_(s32), [[USUBO1:%[0-9]+]]:_(s32) = G_USUBO %lo1, %lo2
157+
; CHECK-NEXT: [[SUB:%[0-9]+]]:_(s32) = G_SUB %lo1, %lo2
158+
; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), %lo1(s32), %lo2
159+
; CHECK-NEXT: [[SUB1:%[0-9]+]]:_(s32) = G_SUB %mid1, %mid2
160+
; CHECK-NEXT: [[ICMP1:%[0-9]+]]:_(s32) = G_ICMP intpred(ugt), [[SUB1]](s32), %mid1
154161
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
155-
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[USUBO1]], [[C]]
156-
; CHECK-NEXT: [[USUBE:%[0-9]+]]:_(s32), [[USUBE1:%[0-9]+]]:_(s32) = G_USUBE %mid1, %mid2, [[AND]]
157-
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
158-
; CHECK-NEXT: [[AND1:%[0-9]+]]:_(s32) = G_AND [[USUBE1]], [[C1]]
159-
; CHECK-NEXT: [[USUBE2:%[0-9]+]]:_(s32), [[USUBE3:%[0-9]+]]:_(s32) = G_USUBE %hi1, %hi2, [[AND1]]
160-
; CHECK-NEXT: $x10 = COPY [[USUBO]](s32)
161-
; CHECK-NEXT: $x11 = COPY [[USUBE]](s32)
162-
; CHECK-NEXT: $x12 = COPY [[USUBE2]](s32)
162+
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[ICMP]], [[C]]
163+
; CHECK-NEXT: [[SUB2:%[0-9]+]]:_(s32) = G_SUB [[SUB1]], [[AND]]
164+
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
165+
; CHECK-NEXT: [[ICMP2:%[0-9]+]]:_(s32) = G_ICMP intpred(eq), [[SUB1]](s32), [[C1]]
166+
; CHECK-NEXT: [[AND1:%[0-9]+]]:_(s32) = G_AND [[ICMP2]], [[ICMP]]
167+
; CHECK-NEXT: [[OR:%[0-9]+]]:_(s32) = G_OR [[ICMP1]], [[AND1]]
168+
; CHECK-NEXT: [[SUB3:%[0-9]+]]:_(s32) = G_SUB %hi1, %hi2
169+
; CHECK-NEXT: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
170+
; CHECK-NEXT: [[AND2:%[0-9]+]]:_(s32) = G_AND [[OR]], [[C2]]
171+
; CHECK-NEXT: [[SUB4:%[0-9]+]]:_(s32) = G_SUB [[SUB3]], [[AND2]]
172+
; CHECK-NEXT: $x10 = COPY [[SUB]](s32)
173+
; CHECK-NEXT: $x11 = COPY [[SUB2]](s32)
174+
; CHECK-NEXT: $x12 = COPY [[SUB4]](s32)
163175
; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11, implicit $x12
164176
%lo1:_(s32) = COPY $x10
165177
%mid1:_(s32) = COPY $x11

llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-add.mir

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -107,12 +107,14 @@ body: |
107107
; CHECK-NEXT: %x01:_(s64) = COPY $x11
108108
; CHECK-NEXT: %y00:_(s64) = COPY $x12
109109
; CHECK-NEXT: %y01:_(s64) = COPY $x13
110-
; CHECK-NEXT: [[UADDO:%[0-9]+]]:_(s64), [[UADDO1:%[0-9]+]]:_(s64) = G_UADDO %x00, %y00
110+
; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD %x00, %y00
111+
; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s64) = G_ICMP intpred(ult), [[ADD]](s64), %y00
112+
; CHECK-NEXT: [[ADD1:%[0-9]+]]:_(s64) = G_ADD %x01, %y01
111113
; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
112-
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[UADDO1]], [[C]]
113-
; CHECK-NEXT: [[UADDE:%[0-9]+]]:_(s64), [[UADDE1:%[0-9]+]]:_(s64) = G_UADDE %x01, %y01, [[AND]]
114-
; CHECK-NEXT: $x10 = COPY [[UADDO]](s64)
115-
; CHECK-NEXT: $x11 = COPY [[UADDE]](s64)
114+
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[ICMP]], [[C]]
115+
; CHECK-NEXT: [[ADD2:%[0-9]+]]:_(s64) = G_ADD [[ADD1]], [[AND]]
116+
; CHECK-NEXT: $x10 = COPY [[ADD]](s64)
117+
; CHECK-NEXT: $x11 = COPY [[ADD2]](s64)
116118
; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11
117119
%x00:_(s64) = COPY $x10
118120
%x01:_(s64) = COPY $x11
@@ -139,12 +141,14 @@ body: |
139141
; CHECK-NEXT: %hi1:_(s64) = COPY $x11
140142
; CHECK-NEXT: %lo2:_(s64) = COPY $x12
141143
; CHECK-NEXT: %hi2:_(s64) = COPY $x13
142-
; CHECK-NEXT: [[UADDO:%[0-9]+]]:_(s64), [[UADDO1:%[0-9]+]]:_(s64) = G_UADDO %lo1, %lo2
144+
; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD %lo1, %lo2
145+
; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s64) = G_ICMP intpred(ult), [[ADD]](s64), %lo2
146+
; CHECK-NEXT: [[ADD1:%[0-9]+]]:_(s64) = G_ADD %hi1, %hi2
143147
; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
144-
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[UADDO1]], [[C]]
145-
; CHECK-NEXT: [[UADDE:%[0-9]+]]:_(s64), [[UADDE1:%[0-9]+]]:_(s64) = G_UADDE %hi1, %hi2, [[AND]]
146-
; CHECK-NEXT: $x10 = COPY [[UADDO]](s64)
147-
; CHECK-NEXT: $x11 = COPY [[UADDE]](s64)
148+
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[ICMP]], [[C]]
149+
; CHECK-NEXT: [[ADD2:%[0-9]+]]:_(s64) = G_ADD [[ADD1]], [[AND]]
150+
; CHECK-NEXT: $x10 = COPY [[ADD]](s64)
151+
; CHECK-NEXT: $x11 = COPY [[ADD2]](s64)
148152
; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11
149153
%lo1:_(s64) = COPY $x10
150154
%hi1:_(s64) = COPY $x11
@@ -170,16 +174,24 @@ body: |
170174
; CHECK-NEXT: %lo2:_(s64) = COPY $x13
171175
; CHECK-NEXT: %mid2:_(s64) = COPY $x14
172176
; CHECK-NEXT: %hi2:_(s64) = COPY $x15
173-
; CHECK-NEXT: [[UADDO:%[0-9]+]]:_(s64), [[UADDO1:%[0-9]+]]:_(s64) = G_UADDO %lo1, %lo2
177+
; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD %lo1, %lo2
178+
; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s64) = G_ICMP intpred(ult), [[ADD]](s64), %lo2
179+
; CHECK-NEXT: [[ADD1:%[0-9]+]]:_(s64) = G_ADD %mid1, %mid2
180+
; CHECK-NEXT: [[ICMP1:%[0-9]+]]:_(s64) = G_ICMP intpred(ult), [[ADD1]](s64), %mid1
174181
; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
175-
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[UADDO1]], [[C]]
176-
; CHECK-NEXT: [[UADDE:%[0-9]+]]:_(s64), [[UADDE1:%[0-9]+]]:_(s64) = G_UADDE %mid1, %mid2, [[AND]]
177-
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
178-
; CHECK-NEXT: [[AND1:%[0-9]+]]:_(s64) = G_AND [[UADDE1]], [[C1]]
179-
; CHECK-NEXT: [[UADDE2:%[0-9]+]]:_(s64), [[UADDE3:%[0-9]+]]:_(s64) = G_UADDE %hi1, %hi2, [[AND1]]
180-
; CHECK-NEXT: $x10 = COPY [[UADDO]](s64)
181-
; CHECK-NEXT: $x11 = COPY [[UADDE]](s64)
182-
; CHECK-NEXT: $x12 = COPY [[UADDE2]](s64)
182+
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[ICMP]], [[C]]
183+
; CHECK-NEXT: [[ADD2:%[0-9]+]]:_(s64) = G_ADD [[ADD1]], [[AND]]
184+
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
185+
; CHECK-NEXT: [[ICMP2:%[0-9]+]]:_(s64) = G_ICMP intpred(eq), [[ADD2]](s64), [[C1]]
186+
; CHECK-NEXT: [[AND1:%[0-9]+]]:_(s64) = G_AND [[ICMP2]], [[ICMP]]
187+
; CHECK-NEXT: [[OR:%[0-9]+]]:_(s64) = G_OR [[ICMP1]], [[AND1]]
188+
; CHECK-NEXT: [[ADD3:%[0-9]+]]:_(s64) = G_ADD %hi1, %hi2
189+
; CHECK-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
190+
; CHECK-NEXT: [[AND2:%[0-9]+]]:_(s64) = G_AND [[OR]], [[C2]]
191+
; CHECK-NEXT: [[ADD4:%[0-9]+]]:_(s64) = G_ADD [[ADD3]], [[AND2]]
192+
; CHECK-NEXT: $x10 = COPY [[ADD]](s64)
193+
; CHECK-NEXT: $x11 = COPY [[ADD2]](s64)
194+
; CHECK-NEXT: $x12 = COPY [[ADD4]](s64)
183195
; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11, implicit $x12
184196
%lo1:_(s64) = COPY $x10
185197
%mid1:_(s64) = COPY $x11

llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rv64/legalize-mul-ext.mir

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -180,26 +180,28 @@ body: |
180180
; CHECK-NEXT: [[MUL1:%[0-9]+]]:_(s64) = G_MUL %mid1, %lo2
181181
; CHECK-NEXT: [[MUL2:%[0-9]+]]:_(s64) = G_MUL %lo1, %mid2
182182
; CHECK-NEXT: [[UMULH:%[0-9]+]]:_(s64) = G_UMULH %lo1, %lo2
183-
; CHECK-NEXT: [[UADDO:%[0-9]+]]:_(s64), [[UADDO1:%[0-9]+]]:_(s64) = G_UADDO [[MUL1]], [[MUL2]]
183+
; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[MUL1]], [[MUL2]]
184+
; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s64) = G_ICMP intpred(ult), [[ADD]](s64), [[MUL2]]
184185
; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
185-
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[UADDO1]], [[C]]
186-
; CHECK-NEXT: [[UADDO2:%[0-9]+]]:_(s64), [[UADDO3:%[0-9]+]]:_(s64) = G_UADDO [[UADDO]], [[UMULH]]
186+
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[ICMP]], [[C]]
187+
; CHECK-NEXT: [[ADD1:%[0-9]+]]:_(s64) = G_ADD [[ADD]], [[UMULH]]
188+
; CHECK-NEXT: [[ICMP1:%[0-9]+]]:_(s64) = G_ICMP intpred(ult), [[ADD1]](s64), [[UMULH]]
187189
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
188-
; CHECK-NEXT: [[AND1:%[0-9]+]]:_(s64) = G_AND [[UADDO3]], [[C1]]
189-
; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[AND]], [[AND1]]
190+
; CHECK-NEXT: [[AND1:%[0-9]+]]:_(s64) = G_AND [[ICMP1]], [[C1]]
191+
; CHECK-NEXT: [[ADD2:%[0-9]+]]:_(s64) = G_ADD [[AND]], [[AND1]]
190192
; CHECK-NEXT: [[MUL3:%[0-9]+]]:_(s64) = G_MUL %hi1, %lo2
191193
; CHECK-NEXT: [[MUL4:%[0-9]+]]:_(s64) = G_MUL %mid1, %mid2
192194
; CHECK-NEXT: [[MUL5:%[0-9]+]]:_(s64) = G_MUL %lo1, %hi2
193195
; CHECK-NEXT: [[UMULH1:%[0-9]+]]:_(s64) = G_UMULH %mid1, %lo2
194196
; CHECK-NEXT: [[UMULH2:%[0-9]+]]:_(s64) = G_UMULH %lo1, %mid2
195-
; CHECK-NEXT: [[UADDO4:%[0-9]+]]:_(s64), [[UADDO5:%[0-9]+]]:_(s64) = G_UADDO [[MUL3]], [[MUL4]]
196-
; CHECK-NEXT: [[UADDO6:%[0-9]+]]:_(s64), [[UADDO7:%[0-9]+]]:_(s64) = G_UADDO [[UADDO4]], [[MUL5]]
197-
; CHECK-NEXT: [[UADDO8:%[0-9]+]]:_(s64), [[UADDO9:%[0-9]+]]:_(s64) = G_UADDO [[UADDO6]], [[UMULH1]]
198-
; CHECK-NEXT: [[UADDO10:%[0-9]+]]:_(s64), [[UADDO11:%[0-9]+]]:_(s64) = G_UADDO [[UADDO8]], [[UMULH2]]
199-
; CHECK-NEXT: [[UADDO12:%[0-9]+]]:_(s64), [[UADDO13:%[0-9]+]]:_(s64) = G_UADDO [[UADDO10]], [[ADD]]
197+
; CHECK-NEXT: [[ADD3:%[0-9]+]]:_(s64) = G_ADD [[MUL3]], [[MUL4]]
198+
; CHECK-NEXT: [[ADD4:%[0-9]+]]:_(s64) = G_ADD [[ADD3]], [[MUL5]]
199+
; CHECK-NEXT: [[ADD5:%[0-9]+]]:_(s64) = G_ADD [[ADD4]], [[UMULH1]]
200+
; CHECK-NEXT: [[ADD6:%[0-9]+]]:_(s64) = G_ADD [[ADD5]], [[UMULH2]]
201+
; CHECK-NEXT: [[ADD7:%[0-9]+]]:_(s64) = G_ADD [[ADD6]], [[ADD2]]
200202
; CHECK-NEXT: $x10 = COPY [[MUL]](s64)
201-
; CHECK-NEXT: $x11 = COPY [[UADDO2]](s64)
202-
; CHECK-NEXT: $x12 = COPY [[UADDO12]](s64)
203+
; CHECK-NEXT: $x11 = COPY [[ADD1]](s64)
204+
; CHECK-NEXT: $x12 = COPY [[ADD7]](s64)
203205
; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11, implicit $x12
204206
%lo1:_(s64) = COPY $x10
205207
%mid1:_(s64) = COPY $x11

0 commit comments

Comments
 (0)