Skip to content

Commit 2d67d84

Browse files
committed
[EVM] Expand SELECT into arithmetic operations
1 parent 3e9e231 commit 2d67d84

File tree

3 files changed

+57
-65
lines changed

3 files changed

+57
-65
lines changed

llvm/lib/Target/EVM/EVMISelLowering.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -921,8 +921,18 @@ SDValue EVMTargetLowering::combineSELECT(SDNode *N,
921921

922922
if (SDValue V = tryFoldSelectIntoOp(N, DAG, TrueV, FalseV, /*Swapped=*/false))
923923
return V;
924+
924925
// NOLINTNEXTLINE(readability-suspicious-call-argument)
925-
return tryFoldSelectIntoOp(N, DAG, FalseV, TrueV, /*Swapped=*/true);
926+
if (SDValue V = tryFoldSelectIntoOp(N, DAG, FalseV, TrueV, /*Swapped=*/true))
927+
return V;
928+
929+
// Expand SELECT to arithmetical operations:
930+
SDValue CondZExt = DAG.getNode(ISD::ZERO_EXTEND, DL, VT, freeze(CondV));
931+
SDValue Mul = DAG.getNode(ISD::MUL, DL, VT, freeze(TrueV), CondZExt);
932+
SDValue Sub = DAG.getNode(ISD::SUB, DL, VT, DAG.getConstant(1, DL, MVT::i256),
933+
CondZExt);
934+
SDValue Mul2 = DAG.getNode(ISD::MUL, DL, VT, freeze(FalseV), Sub);
935+
return DAG.getNode(ISD::ADD, DL, VT, Mul, Mul2);
926936
}
927937

928938
SDValue EVMTargetLowering::PerformDAGCombine(SDNode *N,

llvm/test/CodeGen/EVM/select-normalize.ll

Lines changed: 40 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -11,25 +11,22 @@ define i256 @select_and(i256 %a0, i256 %a1, i256 %a2, i256 %a3, i256 %a4, i256 %
1111
; CHECK-NEXT: SWAP3
1212
; CHECK-NEXT: SWAP1
1313
; CHECK-NEXT: SWAP2
14+
; CHECK-NEXT: SWAP5
15+
; CHECK-NEXT: SWAP4
16+
; CHECK-NEXT: SWAP5
1417
; CHECK-NEXT: LT
1518
; CHECK-NEXT: SWAP2
1619
; CHECK-NEXT: LT
1720
; CHECK-NEXT: AND
18-
; CHECK-NEXT: ISZERO
19-
; CHECK-NEXT: PUSH4 @.BB0_2
20-
; CHECK-NEXT: JUMPI
21-
; CHECK-NEXT: ; %bb.1:
22-
; CHECK-NEXT: SWAP2
2321
; CHECK-NEXT: SWAP1
24-
; CHECK-NEXT: POP
25-
; CHECK-NEXT: PUSH4 @.BB0_3
26-
; CHECK-NEXT: JUMP
27-
; CHECK-NEXT: .BB0_2:
28-
; CHECK-NEXT: JUMPDEST
29-
; CHECK-NEXT: POP
22+
; CHECK-NEXT: DUP2
23+
; CHECK-NEXT: PUSH1 0x1
24+
; CHECK-NEXT: SUB
25+
; CHECK-NEXT: MUL
26+
; CHECK-NEXT: SWAP2
27+
; CHECK-NEXT: MUL
28+
; CHECK-NEXT: ADD
3029
; CHECK-NEXT: SWAP1
31-
; CHECK-NEXT: .BB0_3:
32-
; CHECK-NEXT: JUMPDEST
3330
; CHECK-NEXT: JUMP
3431
%cmp1 = icmp ult i256 %a0, %a1
3532
%cmp2 = icmp ult i256 %a2, %a3
@@ -45,25 +42,22 @@ define i256 @select_or(i256 %a0, i256 %a1, i256 %a2, i256 %a3, i256 %a4, i256 %a
4542
; CHECK-NEXT: SWAP3
4643
; CHECK-NEXT: SWAP1
4744
; CHECK-NEXT: SWAP2
45+
; CHECK-NEXT: SWAP5
46+
; CHECK-NEXT: SWAP4
47+
; CHECK-NEXT: SWAP5
4848
; CHECK-NEXT: LT
4949
; CHECK-NEXT: SWAP2
5050
; CHECK-NEXT: LT
5151
; CHECK-NEXT: OR
52-
; CHECK-NEXT: ISZERO
53-
; CHECK-NEXT: PUSH4 @.BB1_2
54-
; CHECK-NEXT: JUMPI
55-
; CHECK-NEXT: ; %bb.1:
56-
; CHECK-NEXT: SWAP2
5752
; CHECK-NEXT: SWAP1
58-
; CHECK-NEXT: POP
59-
; CHECK-NEXT: PUSH4 @.BB1_3
60-
; CHECK-NEXT: JUMP
61-
; CHECK-NEXT: .BB1_2:
62-
; CHECK-NEXT: JUMPDEST
63-
; CHECK-NEXT: POP
53+
; CHECK-NEXT: DUP2
54+
; CHECK-NEXT: PUSH1 0x1
55+
; CHECK-NEXT: SUB
56+
; CHECK-NEXT: MUL
57+
; CHECK-NEXT: SWAP2
58+
; CHECK-NEXT: MUL
59+
; CHECK-NEXT: ADD
6460
; CHECK-NEXT: SWAP1
65-
; CHECK-NEXT: .BB1_3:
66-
; CHECK-NEXT: JUMPDEST
6761
; CHECK-NEXT: JUMP
6862
%cmp1 = icmp ult i256 %a0, %a1
6963
%cmp2 = icmp ult i256 %a2, %a3
@@ -78,23 +72,20 @@ define i256 @select_select_to_and(i1 %cond1, i1 %cond2, i256 %a, i256 %b) {
7872
; CHECK-NEXT: JUMPDEST
7973
; CHECK-NEXT: PUSH1 0x1
8074
; CHECK-NEXT: SWAP2
75+
; CHECK-NEXT: SWAP4
76+
; CHECK-NEXT: SWAP3
77+
; CHECK-NEXT: SWAP4
8178
; CHECK-NEXT: AND
8279
; CHECK-NEXT: AND
83-
; CHECK-NEXT: ISZERO
84-
; CHECK-NEXT: PUSH4 @.BB2_2
85-
; CHECK-NEXT: JUMPI
86-
; CHECK-NEXT: ; %bb.1:
87-
; CHECK-NEXT: SWAP2
8880
; CHECK-NEXT: SWAP1
89-
; CHECK-NEXT: POP
90-
; CHECK-NEXT: PUSH4 @.BB2_3
91-
; CHECK-NEXT: JUMP
92-
; CHECK-NEXT: .BB2_2:
93-
; CHECK-NEXT: JUMPDEST
94-
; CHECK-NEXT: POP
81+
; CHECK-NEXT: PUSH1 0x1
82+
; CHECK-NEXT: DUP3
83+
; CHECK-NEXT: XOR
84+
; CHECK-NEXT: MUL
85+
; CHECK-NEXT: SWAP2
86+
; CHECK-NEXT: MUL
87+
; CHECK-NEXT: ADD
9588
; CHECK-NEXT: SWAP1
96-
; CHECK-NEXT: .BB2_3:
97-
; CHECK-NEXT: JUMPDEST
9889
; CHECK-NEXT: JUMP
9990
%select1 = select i1 %cond1, i256 %a, i256 %b
10091
%select2 = select i1 %cond2, i256 %select1, i256 %b
@@ -107,23 +98,20 @@ define i256 @select_select_to_or(i1 %cond1, i1 %cond2, i256 %a, i256 %b) {
10798
; CHECK-NEXT: JUMPDEST
10899
; CHECK-NEXT: PUSH1 0x1
109100
; CHECK-NEXT: SWAP2
101+
; CHECK-NEXT: SWAP4
102+
; CHECK-NEXT: SWAP3
103+
; CHECK-NEXT: SWAP4
110104
; CHECK-NEXT: OR
111105
; CHECK-NEXT: AND
112-
; CHECK-NEXT: ISZERO
113-
; CHECK-NEXT: PUSH4 @.BB3_2
114-
; CHECK-NEXT: JUMPI
115-
; CHECK-NEXT: ; %bb.1:
116-
; CHECK-NEXT: SWAP2
117106
; CHECK-NEXT: SWAP1
118-
; CHECK-NEXT: POP
119-
; CHECK-NEXT: PUSH4 @.BB3_3
120-
; CHECK-NEXT: JUMP
121-
; CHECK-NEXT: .BB3_2:
122-
; CHECK-NEXT: JUMPDEST
123-
; CHECK-NEXT: POP
107+
; CHECK-NEXT: PUSH1 0x1
108+
; CHECK-NEXT: DUP3
109+
; CHECK-NEXT: XOR
110+
; CHECK-NEXT: MUL
111+
; CHECK-NEXT: SWAP2
112+
; CHECK-NEXT: MUL
113+
; CHECK-NEXT: ADD
124114
; CHECK-NEXT: SWAP1
125-
; CHECK-NEXT: .BB3_3:
126-
; CHECK-NEXT: JUMPDEST
127115
; CHECK-NEXT: JUMP
128116
%select1 = select i1 %cond1, i256 %a, i256 %b
129117
%select2 = select i1 %cond2, i256 %a, i256 %select1

llvm/test/CodeGen/EVM/select.ll

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,14 @@ define i256 @select(i256 %v1, i256 %v2, i256 %v3, i256 %v4) {
1212
; CHECK-NEXT: SWAP1
1313
; CHECK-NEXT: SWAP3
1414
; CHECK-NEXT: EQ
15-
; CHECK-NEXT: PUSH4 @.BB0_2
16-
; CHECK-NEXT: JUMPI
17-
; CHECK-NEXT: ; %bb.1:
15+
; CHECK-NEXT: DUP1
16+
; CHECK-NEXT: SWAP3
17+
; CHECK-NEXT: MUL
1818
; CHECK-NEXT: SWAP2
19+
; CHECK-NEXT: ISZERO
20+
; CHECK-NEXT: MUL
21+
; CHECK-NEXT: ADD
1922
; CHECK-NEXT: SWAP1
20-
; CHECK-NEXT: POP
21-
; CHECK-NEXT: PUSH4 @.BB0_3
22-
; CHECK-NEXT: JUMP
23-
; CHECK-NEXT: .BB0_2:
24-
; CHECK-NEXT: JUMPDEST
25-
; CHECK-NEXT: POP
26-
; CHECK-NEXT: SWAP1
27-
; CHECK-NEXT: .BB0_3:
28-
; CHECK-NEXT: JUMPDEST
2923
; CHECK-NEXT: JUMP
3024

3125
%1 = icmp ne i256 %v3, %v4

0 commit comments

Comments
 (0)