Skip to content

Commit 1bcc500

Browse files
committed
[DAGCombine] Add basic optimizations for FREEZE in SelDag
Summary: This patch is the first effort to adding basic optimizations for FREEZE in SelDag. Reviewers: spatel, lebedev.ri Reviewed By: spatel Subscribers: xbolva00, hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D76707
1 parent 819e540 commit 1bcc500

File tree

6 files changed

+58
-42
lines changed

6 files changed

+58
-42
lines changed

llvm/include/llvm/CodeGen/SelectionDAG.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1224,6 +1224,9 @@ class SelectionDAG {
12241224
SDValue getAddrSpaceCast(const SDLoc &dl, EVT VT, SDValue Ptr, unsigned SrcAS,
12251225
unsigned DestAS);
12261226

1227+
/// Return a freeze using the SDLoc of the value operand.
1228+
SDValue getFreeze(SDValue V);
1229+
12271230
/// Return the specified value casted to
12281231
/// the target's desired shift amount type.
12291232
SDValue getShiftAmountOperand(EVT LHSTy, SDValue Op);

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,7 @@ namespace {
436436
SDValue visitZERO_EXTEND_VECTOR_INREG(SDNode *N);
437437
SDValue visitTRUNCATE(SDNode *N);
438438
SDValue visitBITCAST(SDNode *N);
439+
SDValue visitFREEZE(SDNode *N);
439440
SDValue visitBUILD_PAIR(SDNode *N);
440441
SDValue visitFADD(SDNode *N);
441442
SDValue visitFSUB(SDNode *N);
@@ -1622,6 +1623,7 @@ SDValue DAGCombiner::visit(SDNode *N) {
16221623
case ISD::LIFETIME_END: return visitLIFETIME_END(N);
16231624
case ISD::FP_TO_FP16: return visitFP_TO_FP16(N);
16241625
case ISD::FP16_TO_FP: return visitFP16_TO_FP(N);
1626+
case ISD::FREEZE: return visitFREEZE(N);
16251627
case ISD::VECREDUCE_FADD:
16261628
case ISD::VECREDUCE_FMUL:
16271629
case ISD::VECREDUCE_ADD:
@@ -11576,6 +11578,20 @@ SDValue DAGCombiner::visitBUILD_PAIR(SDNode *N) {
1157611578
return CombineConsecutiveLoads(N, VT);
1157711579
}
1157811580

11581+
SDValue DAGCombiner::visitFREEZE(SDNode *N) {
11582+
SDValue N0 = N->getOperand(0);
11583+
11584+
// (freeze (freeze x)) -> (freeze x)
11585+
if (N0.getOpcode() == ISD::FREEZE)
11586+
return N0;
11587+
11588+
// If the input is a constant, return it.
11589+
if (isa<ConstantSDNode>(N0) || isa<ConstantFPSDNode>(N0))
11590+
return N0;
11591+
11592+
return SDValue();
11593+
}
11594+
1157911595
/// We know that BV is a build_vector node with Constant, ConstantFP or Undef
1158011596
/// operands. DstEltVT indicates the destination element value type.
1158111597
SDValue DAGCombiner::

llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1927,6 +1927,10 @@ SDValue SelectionDAG::getAddrSpaceCast(const SDLoc &dl, EVT VT, SDValue Ptr,
19271927
return SDValue(N, 0);
19281928
}
19291929

1930+
SDValue SelectionDAG::getFreeze(SDValue V) {
1931+
return getNode(ISD::FREEZE, SDLoc(V), V.getValueType(), V);
1932+
}
1933+
19301934
/// getShiftAmountOperand - Return the specified value casted to
19311935
/// the target's desired shift amount type.
19321936
SDValue SelectionDAG::getShiftAmountOperand(EVT LHSTy, SDValue Op) {

llvm/test/CodeGen/X86/fast-isel-freeze.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
define i32 @freeze(i32 %t) {
66
; SDAG-LABEL: freeze:
77
; SDAG: # %bb.0:
8-
; SDAG-NEXT: movl $10, %eax
9-
; SDAG-NEXT: xorl %edi, %eax
8+
; SDAG-NEXT: movl %edi, %eax
9+
; SDAG-NEXT: xorl $10, %eax
1010
; SDAG-NEXT: retq
1111
;
1212
; FAST-LABEL: freeze:
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2+
; RUN: llc -stop-after=finalize-isel -mtriple=x86_64-unknown < %s 2>&1 | FileCheck %s
3+
define i32 @const() {
4+
; CHECK-LABEL: name: const
5+
; CHECK: bb.0 (%ir-block.0):
6+
; CHECK: [[MOV32ri:%[0-9]+]]:gr32 = MOV32ri 1
7+
; CHECK: $eax = COPY [[MOV32ri]]
8+
; CHECK: RET 0, $eax
9+
%y = freeze i32 1
10+
ret i32 %y
11+
}
12+
13+
define i32 @fold(i32 %x) {
14+
; CHECK-LABEL: name: fold
15+
; CHECK: bb.0 (%ir-block.0):
16+
; CHECK: liveins: $edi
17+
; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $edi
18+
; CHECK: [[COPY1:%[0-9]+]]:gr32 = COPY [[COPY]]
19+
; CHECK: $eax = COPY [[COPY1]]
20+
; CHECK: RET 0, $eax
21+
%y = freeze i32 %x
22+
%z = freeze i32 %y
23+
ret i32 %z
24+
}

llvm/test/CodeGen/X86/freeze-legalize.ll

Lines changed: 9 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,8 @@
55
define i64 @expand(i32 %x) {
66
; CHECK-LABEL: expand:
77
; CHECK: ## %bb.0:
8-
; CHECK-NEXT: movl $303174162, %eax ## imm = 0x12121212
9-
; CHECK-NEXT: movl $875836468, %ecx ## imm = 0x34343434
10-
; CHECK-NEXT: movl $1448498774, %edx ## imm = 0x56565656
11-
; CHECK-NEXT: xorl %eax, %edx
12-
; CHECK-NEXT: movl $2021161080, %eax ## imm = 0x78787878
13-
; CHECK-NEXT: xorl %ecx, %eax
8+
; CHECK-NEXT: movl $1280068684, %eax ## imm = 0x4C4C4C4C
9+
; CHECK-NEXT: movl $1145324612, %edx ## imm = 0x44444444
1410
; CHECK-NEXT: retl
1511
%y1 = freeze i64 1302123111658042420 ; 0x1212121234343434
1612
%y2 = freeze i64 6221254864647256184 ; 0x5656565678787878
@@ -22,29 +18,11 @@ define i64 @expand(i32 %x) {
2218
define <2 x i64> @expand_vec(i32 %x) nounwind {
2319
; CHECK-LABEL: expand_vec:
2420
; CHECK: ## %bb.0:
25-
; CHECK-NEXT: pushl %ebx
26-
; CHECK-NEXT: pushl %edi
27-
; CHECK-NEXT: pushl %esi
2821
; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax
29-
; CHECK-NEXT: movl $16843009, %ecx ## imm = 0x1010101
30-
; CHECK-NEXT: movl $589505315, %edx ## imm = 0x23232323
31-
; CHECK-NEXT: movl $303174162, %esi ## imm = 0x12121212
32-
; CHECK-NEXT: movl $875836468, %edi ## imm = 0x34343434
33-
; CHECK-NEXT: movl $1162167621, %ebx ## imm = 0x45454545
34-
; CHECK-NEXT: xorl %ecx, %ebx
35-
; CHECK-NEXT: movl $1734829927, %ecx ## imm = 0x67676767
36-
; CHECK-NEXT: xorl %edx, %ecx
37-
; CHECK-NEXT: movl $1448498774, %edx ## imm = 0x56565656
38-
; CHECK-NEXT: xorl %esi, %edx
39-
; CHECK-NEXT: movl $2021161080, %esi ## imm = 0x78787878
40-
; CHECK-NEXT: xorl %edi, %esi
41-
; CHECK-NEXT: movl %ebx, 12(%eax)
42-
; CHECK-NEXT: movl %ecx, 8(%eax)
43-
; CHECK-NEXT: movl %edx, 4(%eax)
44-
; CHECK-NEXT: movl %esi, (%eax)
45-
; CHECK-NEXT: popl %esi
46-
; CHECK-NEXT: popl %edi
47-
; CHECK-NEXT: popl %ebx
22+
; CHECK-NEXT: movl $1145324612, 12(%eax) ## imm = 0x44444444
23+
; CHECK-NEXT: movl $1145324612, 8(%eax) ## imm = 0x44444444
24+
; CHECK-NEXT: movl $1145324612, 4(%eax) ## imm = 0x44444444
25+
; CHECK-NEXT: movl $1280068684, (%eax) ## imm = 0x4C4C4C4C
4826
; CHECK-NEXT: retl $4
4927
; <0x1212121234343434, 0x101010123232323>
5028
%y1 = freeze <2 x i64> <i64 1302123111658042420, i64 72340173410738979>
@@ -57,10 +35,7 @@ define <2 x i64> @expand_vec(i32 %x) nounwind {
5735
define i10 @promote() {
5836
; CHECK-LABEL: promote:
5937
; CHECK: ## %bb.0:
60-
; CHECK-NEXT: movw $682, %cx ## imm = 0x2AA
61-
; CHECK-NEXT: movw $992, %ax ## imm = 0x3E0
62-
; CHECK-NEXT: addl %ecx, %eax
63-
; CHECK-NEXT: ## kill: def $ax killed $ax killed $eax
38+
; CHECK-NEXT: movw $650, %ax ## imm = 0x28A
6439
; CHECK-NEXT: retl
6540
%a = freeze i10 682
6641
%b = freeze i10 992
@@ -71,14 +46,8 @@ define i10 @promote() {
7146
define <2 x i10> @promote_vec() {
7247
; CHECK-LABEL: promote_vec:
7348
; CHECK: ## %bb.0:
74-
; CHECK-NEXT: movw $125, %ax
75-
; CHECK-NEXT: movw $682, %cx ## imm = 0x2AA
76-
; CHECK-NEXT: movw $393, %dx ## imm = 0x189
77-
; CHECK-NEXT: addl %eax, %edx
78-
; CHECK-NEXT: movw $992, %ax ## imm = 0x3E0
79-
; CHECK-NEXT: addl %ecx, %eax
80-
; CHECK-NEXT: ## kill: def $ax killed $ax killed $eax
81-
; CHECK-NEXT: ## kill: def $dx killed $dx killed $edx
49+
; CHECK-NEXT: movw $1674, %ax ## imm = 0x68A
50+
; CHECK-NEXT: movw $518, %dx ## imm = 0x206
8251
; CHECK-NEXT: retl
8352
%a = freeze <2 x i10> <i10 682, i10 125>
8453
%b = freeze <2 x i10> <i10 992, i10 393>

0 commit comments

Comments
 (0)