Skip to content

Commit 9c9e56b

Browse files
authored
[X86][APX] Remove redundant TEST*ri instructions (#155586)
The goal is to remove redundant TEST*ri instructions, especially with NF feature. Other tests are side effects due to longer live range of EFLAGS. https://godbolt.org/z/PbaTj1oa3
1 parent 7f4d2c7 commit 9c9e56b

File tree

6 files changed

+74
-49
lines changed

6 files changed

+74
-49
lines changed

llvm/lib/Target/X86/X86InstrInfo.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4836,6 +4836,10 @@ bool X86InstrInfo::analyzeCompare(const MachineInstr &MI, Register &SrcReg,
48364836
case X86::CMP32ri:
48374837
case X86::CMP16ri:
48384838
case X86::CMP8ri:
4839+
case X86::TEST64ri32:
4840+
case X86::TEST32ri:
4841+
case X86::TEST16ri:
4842+
case X86::TEST8ri:
48394843
SrcReg = MI.getOperand(0).getReg();
48404844
SrcReg2 = 0;
48414845
if (MI.getOperand(1).isImm()) {
@@ -4937,6 +4941,10 @@ bool X86InstrInfo::isRedundantFlagInstr(const MachineInstr &FlagI,
49374941
case X86::CMP32ri:
49384942
case X86::CMP16ri:
49394943
case X86::CMP8ri:
4944+
case X86::TEST64ri32:
4945+
case X86::TEST32ri:
4946+
case X86::TEST16ri:
4947+
case X86::TEST8ri:
49404948
CASE_ND(SUB64ri32)
49414949
CASE_ND(SUB32ri)
49424950
CASE_ND(SUB16ri)

llvm/test/CodeGen/X86/2007-11-30-LoadFolding-Bug.ll

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,25 +13,24 @@ define fastcc void @mp_sqrt(i32 %n, i32 %radix, ptr %in, ptr %out, ptr %tmp1, pt
1313
; CHECK-NEXT: pushl %edi
1414
; CHECK-NEXT: pushl %esi
1515
; CHECK-NEXT: pushl %eax
16-
; CHECK-NEXT: movb $1, %cl
16+
; CHECK-NEXT: movb $1, %al
1717
; CHECK-NEXT: movl $1, %ebx
1818
; CHECK-NEXT: movl {{[0-9]+}}(%esp), %esi
1919
; CHECK-NEXT: .p2align 4
2020
; CHECK-NEXT: .LBB0_1: # %bb.i5
2121
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
22-
; CHECK-NEXT: movl %ecx, %eax
22+
; CHECK-NEXT: movl %eax, %ecx
2323
; CHECK-NEXT: addl %ebx, %ebx
24-
; CHECK-NEXT: xorl %ecx, %ecx
25-
; CHECK-NEXT: testb $1, %al
24+
; CHECK-NEXT: xorl %eax, %eax
25+
; CHECK-NEXT: testb $1, %cl
2626
; CHECK-NEXT: jne .LBB0_1
2727
; CHECK-NEXT: # %bb.2: # %mp_unexp_mp2d.exit.i
2828
; CHECK-NEXT: je .LBB0_3
2929
; CHECK-NEXT: # %bb.5: # %cond_next.i
30-
; CHECK-NEXT: testb $1, %al
3130
; CHECK-NEXT: jne .LBB0_3
3231
; CHECK-NEXT: # %bb.6: # %cond_next36.i
3332
; CHECK-NEXT: movl $0, 0
34-
; CHECK-NEXT: movzbl %al, %ebp
33+
; CHECK-NEXT: movzbl %cl, %ebp
3534
; CHECK-NEXT: andl $1, %ebp
3635
; CHECK-NEXT: xorpd %xmm0, %xmm0
3736
; CHECK-NEXT: xorl %eax, %eax

llvm/test/CodeGen/X86/2008-04-17-CoalescerBug.ll

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ define void @_ZNK10wxDateTime6FormatEPKwRKNS_8TimeZoneE(ptr noalias sret(%struct
3838
; CHECK-NEXT: ## %bb.1: ## %bb116.i
3939
; CHECK-NEXT: je LBB0_25
4040
; CHECK-NEXT: ## %bb.2: ## %bb52.i.i
41-
; CHECK-NEXT: testb $1, %bl
4241
; CHECK-NEXT: je LBB0_25
4342
; CHECK-NEXT: ## %bb.3: ## %bb142.i
4443
; CHECK-NEXT: je LBB0_25
@@ -49,23 +48,23 @@ define void @_ZNK10wxDateTime6FormatEPKwRKNS_8TimeZoneE(ptr noalias sret(%struct
4948
; CHECK-NEXT: jmp LBB0_5
5049
; CHECK-NEXT: LBB0_21: ## %bb7806
5150
; CHECK-NEXT: ## in Loop: Header=BB0_5 Depth=1
52-
; CHECK-NEXT: Ltmp16:
51+
; CHECK-NEXT: Ltmp16: ## EH_LABEL
5352
; CHECK-NEXT: movl $0, {{[0-9]+}}(%esp)
5453
; CHECK-NEXT: movl $1, {{[0-9]+}}(%esp)
5554
; CHECK-NEXT: movl $0, (%esp)
5655
; CHECK-NEXT: calll __ZN12wxStringBase6appendEmw
57-
; CHECK-NEXT: Ltmp17:
56+
; CHECK-NEXT: Ltmp17: ## EH_LABEL
5857
; CHECK-NEXT: LBB0_5: ## %bb3261
5958
; CHECK-NEXT: ## =>This Inner Loop Header: Depth=1
6059
; CHECK-NEXT: cmpl $37, 0
6160
; CHECK-NEXT: jne LBB0_25
6261
; CHECK-NEXT: ## %bb.6: ## %bb3306
6362
; CHECK-NEXT: ## in Loop: Header=BB0_5 Depth=1
64-
; CHECK-NEXT: Ltmp0:
63+
; CHECK-NEXT: Ltmp0: ## EH_LABEL
6564
; CHECK-NEXT: movl %edi, {{[0-9]+}}(%esp)
6665
; CHECK-NEXT: movl $0, (%esp)
6766
; CHECK-NEXT: calll __ZN12wxStringBaseaSEPKw
68-
; CHECK-NEXT: Ltmp1:
67+
; CHECK-NEXT: Ltmp1: ## EH_LABEL
6968
; CHECK-NEXT: ## %bb.7: ## %bb3314
7069
; CHECK-NEXT: ## in Loop: Header=BB0_5 Depth=1
7170
; CHECK-NEXT: movl 0, %eax
@@ -89,11 +88,11 @@ define void @_ZNK10wxDateTime6FormatEPKwRKNS_8TimeZoneE(ptr noalias sret(%struct
8988
; CHECK-NEXT: je LBB0_14
9089
; CHECK-NEXT: ## %bb.13: ## %bb155.i8541
9190
; CHECK-NEXT: ## in Loop: Header=BB0_5 Depth=1
92-
; CHECK-NEXT: Ltmp4:
91+
; CHECK-NEXT: Ltmp4: ## EH_LABEL
9392
; CHECK-NEXT: movl $0, {{[0-9]+}}(%esp)
9493
; CHECK-NEXT: movl $0, (%esp)
9594
; CHECK-NEXT: calll _gmtime_r
96-
; CHECK-NEXT: Ltmp5:
95+
; CHECK-NEXT: Ltmp5: ## EH_LABEL
9796
; CHECK-NEXT: LBB0_14: ## %bb182.i8560
9897
; CHECK-NEXT: ## in Loop: Header=BB0_5 Depth=1
9998
; CHECK-NEXT: testb $1, %bl
@@ -103,7 +102,7 @@ define void @_ZNK10wxDateTime6FormatEPKwRKNS_8TimeZoneE(ptr noalias sret(%struct
103102
; CHECK-NEXT: je LBB0_18
104103
; CHECK-NEXT: ## %bb.17: ## %bb440.i8663
105104
; CHECK-NEXT: ## in Loop: Header=BB0_5 Depth=1
106-
; CHECK-NEXT: Ltmp6:
105+
; CHECK-NEXT: Ltmp6: ## EH_LABEL
107106
; CHECK-NEXT: movl L_.str4$non_lazy_ptr, %eax
108107
; CHECK-NEXT: movl %eax, {{[0-9]+}}(%esp)
109108
; CHECK-NEXT: movl L_.str33$non_lazy_ptr, %eax
@@ -113,47 +112,47 @@ define void @_ZNK10wxDateTime6FormatEPKwRKNS_8TimeZoneE(ptr noalias sret(%struct
113112
; CHECK-NEXT: movl %ebp, (%esp)
114113
; CHECK-NEXT: movl $1717, {{[0-9]+}}(%esp) ## imm = 0x6B5
115114
; CHECK-NEXT: calll __Z10wxOnAssertPKwiPKcS0_S0_
116-
; CHECK-NEXT: Ltmp7:
115+
; CHECK-NEXT: Ltmp7: ## EH_LABEL
117116
; CHECK-NEXT: jmp LBB0_18
118117
; CHECK-NEXT: LBB0_15: ## %bb187.i8591
119118
; CHECK-NEXT: ## in Loop: Header=BB0_5 Depth=1
120119
; CHECK-NEXT: jne LBB0_25
121120
; CHECK-NEXT: LBB0_18: ## %invcont5814
122121
; CHECK-NEXT: ## in Loop: Header=BB0_5 Depth=1
123-
; CHECK-NEXT: Ltmp8:
122+
; CHECK-NEXT: Ltmp8: ## EH_LABEL
124123
; CHECK-NEXT: movl $0, {{[0-9]+}}(%esp)
125124
; CHECK-NEXT: movl $0, {{[0-9]+}}(%esp)
126125
; CHECK-NEXT: movl $0, (%esp)
127126
; CHECK-NEXT: calll __ZN8wxString6FormatEPKwz
128127
; CHECK-NEXT: subl $4, %esp
129-
; CHECK-NEXT: Ltmp9:
128+
; CHECK-NEXT: Ltmp9: ## EH_LABEL
130129
; CHECK-NEXT: ## %bb.19: ## %invcont5831
131130
; CHECK-NEXT: ## in Loop: Header=BB0_5 Depth=1
132-
; CHECK-NEXT: Ltmp10:
131+
; CHECK-NEXT: Ltmp10: ## EH_LABEL
133132
; CHECK-NEXT: movl $0, {{[0-9]+}}(%esp)
134133
; CHECK-NEXT: movl $0, {{[0-9]+}}(%esp)
135134
; CHECK-NEXT: movl $0, {{[0-9]+}}(%esp)
136135
; CHECK-NEXT: movl $0, (%esp)
137136
; CHECK-NEXT: calll __ZN12wxStringBase10ConcatSelfEmPKwm
138-
; CHECK-NEXT: Ltmp11:
137+
; CHECK-NEXT: Ltmp11: ## EH_LABEL
139138
; CHECK-NEXT: jmp LBB0_5
140139
; CHECK-NEXT: LBB0_9: ## %bb5657
141-
; CHECK-NEXT: Ltmp13:
140+
; CHECK-NEXT: Ltmp13: ## EH_LABEL
142141
; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax
143142
; CHECK-NEXT: movl %eax, {{[0-9]+}}(%esp)
144143
; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax
145144
; CHECK-NEXT: movl %eax, (%esp)
146145
; CHECK-NEXT: calll __ZNK10wxDateTime12GetDayOfYearERKNS_8TimeZoneE
147-
; CHECK-NEXT: Ltmp14:
146+
; CHECK-NEXT: Ltmp14: ## EH_LABEL
148147
; CHECK-NEXT: jmp LBB0_25
149148
; CHECK-NEXT: LBB0_20: ## %bb5968
150-
; CHECK-NEXT: Ltmp2:
149+
; CHECK-NEXT: Ltmp2: ## EH_LABEL
151150
; CHECK-NEXT: movl $0, {{[0-9]+}}(%esp)
152151
; CHECK-NEXT: movl $0, {{[0-9]+}}(%esp)
153152
; CHECK-NEXT: movl $0, (%esp)
154153
; CHECK-NEXT: calll __ZN8wxString6FormatEPKwz
155154
; CHECK-NEXT: subl $4, %esp
156-
; CHECK-NEXT: Ltmp3:
155+
; CHECK-NEXT: Ltmp3: ## EH_LABEL
157156
; CHECK-NEXT: LBB0_25: ## %bb115.critedge.i
158157
; CHECK-NEXT: movl %esi, %eax
159158
; CHECK-NEXT: addl $28, %esp
@@ -163,13 +162,13 @@ define void @_ZNK10wxDateTime6FormatEPKwRKNS_8TimeZoneE(ptr noalias sret(%struct
163162
; CHECK-NEXT: popl %ebp
164163
; CHECK-NEXT: retl $4
165164
; CHECK-NEXT: LBB0_23: ## %lpad.loopexit.split-lp
166-
; CHECK-NEXT: Ltmp15:
165+
; CHECK-NEXT: Ltmp15: ## EH_LABEL
167166
; CHECK-NEXT: jmp LBB0_25
168167
; CHECK-NEXT: LBB0_24: ## %lpad8185
169-
; CHECK-NEXT: Ltmp12:
168+
; CHECK-NEXT: Ltmp12: ## EH_LABEL
170169
; CHECK-NEXT: jmp LBB0_25
171170
; CHECK-NEXT: LBB0_22: ## %lpad.loopexit
172-
; CHECK-NEXT: Ltmp18:
171+
; CHECK-NEXT: Ltmp18: ## EH_LABEL
173172
; CHECK-NEXT: jmp LBB0_25
174173
; CHECK-NEXT: Lfunc_end0:
175174
entry:

llvm/test/CodeGen/X86/apx/cf.ll

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,3 +229,21 @@ entry:
229229
call void @llvm.masked.store.v1i32.p0(<1 x i32> zeroinitializer, ptr %p, i32 1, <1 x i1> %1)
230230
ret void
231231
}
232+
233+
define i64 @redundant_test(i64 %num, ptr %p1, i64 %in) {
234+
; CHECK-LABEL: redundant_test:
235+
; CHECK: # %bb.0:
236+
; CHECK-NEXT: testl $-32, %edi
237+
; CHECK-NEXT: cfcmoveq (%rsi), %rax
238+
; CHECK-NEXT: {nf} addq %rdx, %rax
239+
; CHECK-NEXT: cmovneq %rdi, %rax
240+
; CHECK-NEXT: retq
241+
%and = and i64 %num, 4294967264
242+
%cmp = icmp eq i64 %and, 0
243+
%mask = bitcast i1 %cmp to <1 x i1>
244+
%condload = tail call <1 x i64> @llvm.masked.load.v1i64.p0(ptr %p1, i32 8, <1 x i1> %mask, <1 x i64> poison)
245+
%v = bitcast <1 x i64> %condload to i64
246+
%add = add i64 %v, %in
247+
%sel = select i1 %cmp, i64 %add, i64 %num
248+
ret i64 %sel
249+
}

llvm/test/CodeGen/X86/ins_subreg_coalesce-3.ll

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -22,41 +22,45 @@ define void @FontChange(i1 %foo) nounwind {
2222
; CHECK-LABEL: FontChange:
2323
; CHECK: # %bb.0: # %entry
2424
; CHECK-NEXT: testb $1, %dil
25-
; CHECK-NEXT: je .LBB0_10
25+
; CHECK-NEXT: je .LBB0_12
26+
; CHECK-NEXT: # %bb.1: # %bb298
27+
; CHECK-NEXT: je .LBB0_3
28+
; CHECK-NEXT: # %bb.2: # %bb304
29+
; CHECK-NEXT: je .LBB0_4
2630
; CHECK-NEXT: .p2align 4
27-
; CHECK-NEXT: .LBB0_1: # %bb366
31+
; CHECK-NEXT: .LBB0_3: # %bb366
2832
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
2933
; CHECK-NEXT: testb $1, %dil
30-
; CHECK-NEXT: jne .LBB0_1
31-
; CHECK-NEXT: # %bb.2: # %bb428
34+
; CHECK-NEXT: jne .LBB0_3
35+
; CHECK-NEXT: .LBB0_4: # %bb428
3236
; CHECK-NEXT: testb $1, %dil
33-
; CHECK-NEXT: je .LBB0_10
34-
; CHECK-NEXT: # %bb.3:
37+
; CHECK-NEXT: je .LBB0_12
38+
; CHECK-NEXT: # %bb.5:
3539
; CHECK-NEXT: cmpb $0, 0
3640
; CHECK-NEXT: .p2align 4
37-
; CHECK-NEXT: .LBB0_4: # %bb650
41+
; CHECK-NEXT: .LBB0_6: # %bb650
3842
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
39-
; CHECK-NEXT: je .LBB0_4
40-
; CHECK-NEXT: # %bb.5: # %bb662
43+
; CHECK-NEXT: je .LBB0_6
44+
; CHECK-NEXT: # %bb.7: # %bb662
4145
; CHECK-NEXT: movl 0, %eax
4246
; CHECK-NEXT: movl %eax, %ecx
4347
; CHECK-NEXT: andl $57344, %ecx # imm = 0xE000
4448
; CHECK-NEXT: cmpl $8192, %ecx # imm = 0x2000
45-
; CHECK-NEXT: jne .LBB0_10
46-
; CHECK-NEXT: # %bb.6: # %bb4884
49+
; CHECK-NEXT: jne .LBB0_12
50+
; CHECK-NEXT: # %bb.8: # %bb4884
4751
; CHECK-NEXT: andl $7168, %eax # imm = 0x1C00
4852
; CHECK-NEXT: cmpl $1024, %eax # imm = 0x400
49-
; CHECK-NEXT: jne .LBB0_10
50-
; CHECK-NEXT: # %bb.7: # %bb4932
53+
; CHECK-NEXT: jne .LBB0_12
54+
; CHECK-NEXT: # %bb.9: # %bb4932
5155
; CHECK-NEXT: testb $1, %dil
52-
; CHECK-NEXT: jne .LBB0_10
53-
; CHECK-NEXT: # %bb.8: # %bb4940
56+
; CHECK-NEXT: jne .LBB0_12
57+
; CHECK-NEXT: # %bb.10: # %bb4940
5458
; CHECK-NEXT: movl 0, %eax
5559
; CHECK-NEXT: cmpl $160, %eax
56-
; CHECK-NEXT: je .LBB0_10
57-
; CHECK-NEXT: # %bb.9: # %bb4940
60+
; CHECK-NEXT: je .LBB0_12
61+
; CHECK-NEXT: # %bb.11: # %bb4940
5862
; CHECK-NEXT: cmpl $159, %eax
59-
; CHECK-NEXT: .LBB0_10: # %bb4897
63+
; CHECK-NEXT: .LBB0_12: # %bb4897
6064
; CHECK-NEXT: retq
6165
entry:
6266
br i1 %foo, label %bb298, label %bb49

llvm/test/CodeGen/X86/pr38795.ll

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,6 @@ define void @verifier_error_reduced_issue38788(i1 %cmp11) {
260260
; CHECK-NEXT: pushl %ebx
261261
; CHECK-NEXT: .cfi_def_cfa_offset 8
262262
; CHECK-NEXT: .cfi_offset %ebx, -8
263-
; CHECK-NEXT: movzbl {{[0-9]+}}(%esp), %eax
264263
; CHECK-NEXT: xorl %ecx, %ecx
265264
; CHECK-NEXT: xorl %ebx, %ebx
266265
; CHECK-NEXT: jmp .LBB1_1
@@ -272,23 +271,21 @@ define void @verifier_error_reduced_issue38788(i1 %cmp11) {
272271
; CHECK-NEXT: # in Loop: Header=BB1_1 Depth=1
273272
; CHECK-NEXT: movl %eax, %ecx
274273
; CHECK-NEXT: movl %edx, %ebx
275-
; CHECK-NEXT: movzbl {{[0-9]+}}(%esp), %eax
276274
; CHECK-NEXT: .LBB1_1: # %for.cond
277275
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
278-
; CHECK-NEXT: testb $1, %al
276+
; CHECK-NEXT: testb $1, {{[0-9]+}}(%esp)
279277
; CHECK-NEXT: je .LBB1_3
280278
; CHECK-NEXT: # %bb.2: # in Loop: Header=BB1_1 Depth=1
281279
; CHECK-NEXT: xorl %eax, %eax
282280
; CHECK-NEXT: jmp .LBB1_5
283281
; CHECK-NEXT: .p2align 4
284282
; CHECK-NEXT: .LBB1_3: # %if.end
285283
; CHECK-NEXT: # in Loop: Header=BB1_1 Depth=1
286-
; CHECK-NEXT: testb $1, %al
287284
; CHECK-NEXT: je .LBB1_4
288285
; CHECK-NEXT: # %bb.9: # %if.then13
289286
; CHECK-NEXT: # in Loop: Header=BB1_1 Depth=1
290287
; CHECK-NEXT: xorl %edx, %edx
291-
; CHECK-NEXT: testb $1, %al
288+
; CHECK-NEXT: testb $1, {{[0-9]+}}(%esp)
292289
; CHECK-NEXT: movl %ebx, %eax
293290
; CHECK-NEXT: movl $0, %ebx
294291
; CHECK-NEXT: jne .LBB1_8

0 commit comments

Comments
 (0)