Skip to content

Commit a71147d

Browse files
authored
[WebAssembly] improve getRegForPromotedValue to avoid meanless value copy (#80469)
When promoted value, it is meaningless to copy value from reg to another reg with the same type. This PR add additional check for this cases to reduce the code size. Fixes: #80053.
1 parent 99ddd77 commit a71147d

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,8 @@ unsigned WebAssemblyFastISel::getRegForUnsignedValue(const Value *V) {
559559
Register VReg = getRegForValue(V);
560560
if (VReg == 0)
561561
return 0;
562+
if (From == To)
563+
return VReg;
562564
return zeroExtend(VReg, V, From, To);
563565
}
564566

@@ -568,6 +570,8 @@ unsigned WebAssemblyFastISel::getRegForSignedValue(const Value *V) {
568570
Register VReg = getRegForValue(V);
569571
if (VReg == 0)
570572
return 0;
573+
if (From == To)
574+
return VReg;
571575
return signExtend(VReg, V, From, To);
572576
}
573577

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
; RUN: llc < %s -fast-isel -O0 | FileCheck %s
2+
3+
target triple = "wasm32-unknown-unknown"
4+
5+
; CHECK-LABEL: gh_80053: # @gh_80053
6+
; CHECK-NEXT: .functype gh_80053 (i32) -> (i32)
7+
; CHECK-NEXT: .local i32, i32, i32, i32, i32, i32
8+
; CHECK: i32.const 0
9+
; CHECK-NEXT: local.set 1
10+
; CHECK-NEXT: local.get 0
11+
; CHECK-NEXT: local.get 1
12+
; CHECK-NEXT: i32.eq
13+
; CHECK-NEXT: local.set 2
14+
; CHECK-NEXT: i32.const 1
15+
; CHECK-NEXT: local.set 3
16+
; CHECK-NEXT: local.get 2
17+
; CHECK-NEXT: local.get 3
18+
; CHECK-NEXT: i32.and
19+
; CHECK-NEXT: local.set 4
20+
; CHECK-NEXT: block
21+
; CHECK-NEXT: local.get 4
22+
; CHECK-NEXT: i32.eqz
23+
; CHECK-NEXT: br_if 0 # 0: down to label0
24+
; CHECK: i32.const 0
25+
; CHECK-NEXT: local.set 5
26+
; CHECK-NEXT: local.get 5
27+
; CHECK-NEXT: return
28+
; CHECK-NEXT: .LBB0_2: # %BB03
29+
; CHECK-NEXT: end_block # label0:
30+
; CHECK-NEXT: i32.const 1
31+
; CHECK-NEXT: local.set 6
32+
; CHECK-NEXT: local.get 6
33+
; CHECK-NEXT: return
34+
; CHECK-NEXT: end_function
35+
define i1 @gh_80053(ptr) {
36+
BB01:
37+
%eq = icmp eq ptr %0, null
38+
br i1 %eq, label %BB02, label %BB03
39+
BB02:
40+
ret i1 0
41+
BB03:
42+
ret i1 1
43+
}

0 commit comments

Comments
 (0)