Skip to content

Commit 4e9b617

Browse files
committed
Only sink larger than legal integer comparisons if its only used in other blocks
1 parent 1b91173 commit 4e9b617

File tree

7 files changed

+69
-65
lines changed

7 files changed

+69
-65
lines changed

llvm/lib/CodeGen/CodeGenPrepare.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1848,8 +1848,14 @@ static bool sinkCmpExpression(CmpInst *Cmp, const TargetLowering &TLI,
18481848
if (TLI.useSoftFloat() && isa<FCmpInst>(Cmp))
18491849
return false;
18501850

1851-
// Avoid sinking larger than legal integer comparisons.
1852-
if (Cmp->getOperand(0)->getType()->isIntegerTy() &&
1851+
bool UsedInPhiOrCurrentBlock = any_of(Cmp->users(), [Cmp](User *U) {
1852+
return isa<PHINode>(U) ||
1853+
cast<Instruction>(U)->getParent() == Cmp->getParent();
1854+
});
1855+
1856+
// Avoid sinking larger than legal integer comparisons unless its ONLY used in
1857+
// another BB.
1858+
if (UsedInPhiOrCurrentBlock && Cmp->getOperand(0)->getType()->isIntegerTy() &&
18531859
Cmp->getOperand(0)->getType()->getScalarSizeInBits() >
18541860
DL.getLargestLegalIntTypeSizeInBits())
18551861
return false;

llvm/test/CodeGen/ARM/consthoist-icmpimm.ll

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -39,50 +39,46 @@ define i32 @icmp64_sge_0(i64 %x, i64 %y, i32 %a, i32 %b, i1 %c) {
3939
;
4040
; CHECKV7M-LABEL: icmp64_sge_0:
4141
; CHECKV7M: @ %bb.0:
42-
; CHECKV7M-NEXT: mvns r0, r1
43-
; CHECKV7M-NEXT: lsrs r2, r0, #31
4442
; CHECKV7M-NEXT: ldr r0, [sp, #8]
4543
; CHECKV7M-NEXT: lsls r0, r0, #31
46-
; CHECKV7M-NEXT: ldrd r1, r0, [sp]
44+
; CHECKV7M-NEXT: ldrd r2, r0, [sp]
4745
; CHECKV7M-NEXT: beq .LBB0_2
4846
; CHECKV7M-NEXT: @ %bb.1: @ %then
49-
; CHECKV7M-NEXT: cmp r2, #0
50-
; CHECKV7M-NEXT: mov r2, r0
51-
; CHECKV7M-NEXT: it ne
52-
; CHECKV7M-NEXT: movne r2, r1
5347
; CHECKV7M-NEXT: cmp.w r3, #-1
48+
; CHECKV7M-NEXT: mov r3, r0
5449
; CHECKV7M-NEXT: it gt
55-
; CHECKV7M-NEXT: movgt r0, r1
56-
; CHECKV7M-NEXT: add r0, r2
50+
; CHECKV7M-NEXT: movgt r3, r2
51+
; CHECKV7M-NEXT: cmp.w r1, #-1
52+
; CHECKV7M-NEXT: it gt
53+
; CHECKV7M-NEXT: movgt r0, r2
54+
; CHECKV7M-NEXT: add r0, r3
5755
; CHECKV7M-NEXT: bx lr
5856
; CHECKV7M-NEXT: .LBB0_2: @ %else
59-
; CHECKV7M-NEXT: cmp r2, #0
60-
; CHECKV7M-NEXT: it ne
61-
; CHECKV7M-NEXT: movne r0, r1
57+
; CHECKV7M-NEXT: cmp.w r1, #-1
58+
; CHECKV7M-NEXT: it gt
59+
; CHECKV7M-NEXT: movgt r0, r2
6260
; CHECKV7M-NEXT: bx lr
6361
;
6462
; CHECKV7A-LABEL: icmp64_sge_0:
6563
; CHECKV7A: @ %bb.0:
6664
; CHECKV7A-NEXT: ldr r2, [sp, #8]
67-
; CHECKV7A-NEXT: mvns r1, r1
6865
; CHECKV7A-NEXT: ldrd r12, r0, [sp]
69-
; CHECKV7A-NEXT: lsrs r1, r1, #31
7066
; CHECKV7A-NEXT: lsls r2, r2, #31
7167
; CHECKV7A-NEXT: beq .LBB0_2
7268
; CHECKV7A-NEXT: @ %bb.1: @ %then
73-
; CHECKV7A-NEXT: cmp r1, #0
74-
; CHECKV7A-NEXT: mov r1, r0
75-
; CHECKV7A-NEXT: it ne
76-
; CHECKV7A-NEXT: movne r1, r12
7769
; CHECKV7A-NEXT: cmp.w r3, #-1
70+
; CHECKV7A-NEXT: mov r2, r0
71+
; CHECKV7A-NEXT: it gt
72+
; CHECKV7A-NEXT: movgt r2, r12
73+
; CHECKV7A-NEXT: cmp.w r1, #-1
7874
; CHECKV7A-NEXT: it gt
7975
; CHECKV7A-NEXT: movgt r0, r12
80-
; CHECKV7A-NEXT: add r0, r1
76+
; CHECKV7A-NEXT: add r0, r2
8177
; CHECKV7A-NEXT: bx lr
8278
; CHECKV7A-NEXT: .LBB0_2: @ %else
83-
; CHECKV7A-NEXT: cmp r1, #0
84-
; CHECKV7A-NEXT: it ne
85-
; CHECKV7A-NEXT: movne r0, r12
79+
; CHECKV7A-NEXT: cmp.w r1, #-1
80+
; CHECKV7A-NEXT: it gt
81+
; CHECKV7A-NEXT: movgt r0, r12
8682
; CHECKV7A-NEXT: bx lr
8783
br i1 %c, label %then, label %else
8884
then:

llvm/test/CodeGen/RISCV/branch-on-zero.ll

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,11 @@ define i64 @optbranch_64(i64 %Arg) {
4141
; RV32-NEXT: seqz a2, a0
4242
; RV32-NEXT: add a1, a1, a2
4343
; RV32-NEXT: or a2, a0, a1
44-
; RV32-NEXT: beqz a2, .LBB1_2
45-
; RV32-NEXT: # %bb.1: # %bb3
46-
; RV32-NEXT: ret
47-
; RV32-NEXT: .LBB1_2: # %bb2
44+
; RV32-NEXT: bnez a2, .LBB1_2
45+
; RV32-NEXT: # %bb.1: # %bb2
4846
; RV32-NEXT: li a0, -1
4947
; RV32-NEXT: li a1, -1
48+
; RV32-NEXT: .LBB1_2: # %bb3
5049
; RV32-NEXT: ret
5150
;
5251
; RV64-LABEL: optbranch_64:

llvm/test/CodeGen/RISCV/overflow-intrinsics.ll

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -237,17 +237,17 @@ define i64 @uaddo3_math_overflow_used(i64 %a, i64 %b, ptr %res) nounwind ssp {
237237
define i64 @uaddo4(i64 %a, i64 %b, i1 %c) nounwind ssp {
238238
; RV32-LABEL: uaddo4:
239239
; RV32: # %bb.0: # %entry
240+
; RV32-NEXT: andi a4, a4, 1
241+
; RV32-NEXT: beqz a4, .LBB6_6
242+
; RV32-NEXT: # %bb.1: # %next
240243
; RV32-NEXT: add a1, a3, a1
241244
; RV32-NEXT: add a0, a2, a0
242245
; RV32-NEXT: sltu a0, a0, a2
243246
; RV32-NEXT: add a1, a1, a0
244-
; RV32-NEXT: andi a4, a4, 1
245-
; RV32-NEXT: beq a3, a1, .LBB6_2
246-
; RV32-NEXT: # %bb.1: # %entry
247+
; RV32-NEXT: beq a3, a1, .LBB6_3
248+
; RV32-NEXT: # %bb.2: # %next
247249
; RV32-NEXT: sltu a0, a1, a3
248-
; RV32-NEXT: .LBB6_2: # %entry
249-
; RV32-NEXT: beqz a4, .LBB6_6
250-
; RV32-NEXT: # %bb.3: # %next
250+
; RV32-NEXT: .LBB6_3: # %next
251251
; RV32-NEXT: bnez a0, .LBB6_5
252252
; RV32-NEXT: # %bb.4: # %next
253253
; RV32-NEXT: li a2, 42
@@ -292,19 +292,19 @@ exit:
292292
define i64 @uaddo5(i64 %a, i64 %b, ptr %ptr, i1 %c) nounwind ssp {
293293
; RV32-LABEL: uaddo5:
294294
; RV32: # %bb.0: # %entry
295-
; RV32-NEXT: add a6, a3, a1
296-
; RV32-NEXT: add a1, a2, a0
297-
; RV32-NEXT: sltu a0, a1, a2
298-
; RV32-NEXT: add a6, a6, a0
299295
; RV32-NEXT: andi a5, a5, 1
300-
; RV32-NEXT: beq a6, a3, .LBB7_2
301-
; RV32-NEXT: # %bb.1: # %entry
302-
; RV32-NEXT: sltu a0, a6, a3
303-
; RV32-NEXT: .LBB7_2: # %entry
304-
; RV32-NEXT: sw a1, 0(a4)
305-
; RV32-NEXT: sw a6, 4(a4)
296+
; RV32-NEXT: add a1, a3, a1
297+
; RV32-NEXT: add a6, a2, a0
298+
; RV32-NEXT: sltu a0, a6, a2
299+
; RV32-NEXT: add a1, a1, a0
300+
; RV32-NEXT: sw a6, 0(a4)
301+
; RV32-NEXT: sw a1, 4(a4)
306302
; RV32-NEXT: beqz a5, .LBB7_6
307-
; RV32-NEXT: # %bb.3: # %next
303+
; RV32-NEXT: # %bb.1: # %next
304+
; RV32-NEXT: beq a3, a1, .LBB7_3
305+
; RV32-NEXT: # %bb.2: # %next
306+
; RV32-NEXT: sltu a0, a1, a3
307+
; RV32-NEXT: .LBB7_3: # %next
308308
; RV32-NEXT: bnez a0, .LBB7_5
309309
; RV32-NEXT: # %bb.4: # %next
310310
; RV32-NEXT: li a2, 42

llvm/test/CodeGen/RISCV/rvv/vxrm-insert-out-of-loop.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,14 @@ define void @test1(ptr nocapture noundef writeonly %dst, i32 noundef signext %i_
5959
; RV32-NEXT: sltu t5, a0, t6
6060
; RV32-NEXT: sltu t6, a2, t3
6161
; RV32-NEXT: and t5, t5, t6
62-
; RV32-NEXT: sltu t1, a6, t1
6362
; RV32-NEXT: sltu t4, a0, t4
6463
; RV32-NEXT: sltu t3, a4, t3
6564
; RV32-NEXT: and t3, t4, t3
6665
; RV32-NEXT: or t4, a1, a3
6766
; RV32-NEXT: srli t4, t4, 31
6867
; RV32-NEXT: or t4, t5, t4
6968
; RV32-NEXT: or t5, a1, a5
69+
; RV32-NEXT: sltu t1, a6, t1
7070
; RV32-NEXT: srli t5, t5, 31
7171
; RV32-NEXT: or t3, t3, t5
7272
; RV32-NEXT: or t3, t4, t3

llvm/test/CodeGen/X86/2012-01-10-UndefExceptionEdge.ll

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,16 @@ define void @f(ptr nocapture %arg, ptr nocapture %arg1, ptr nocapture %arg2, ptr
3434
; CHECK-NEXT: .cfi_offset %edi, -16
3535
; CHECK-NEXT: .cfi_offset %ebx, -12
3636
; CHECK-NEXT: xorl %eax, %eax
37-
; CHECK-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Folded Spill
37+
; CHECK-NEXT: xorl %edi, %edi
3838
; CHECK-NEXT: testb %al, %al
3939
; CHECK-NEXT: Ltmp0: ## EH_LABEL
40-
; CHECK-NEXT: ## implicit-def: $edi
40+
; CHECK-NEXT: ## implicit-def: $ebx
4141
; CHECK-NEXT: calll __Znam
4242
; CHECK-NEXT: Ltmp1: ## EH_LABEL
4343
; CHECK-NEXT: ## %bb.1: ## %bb11
4444
; CHECK-NEXT: movl %eax, %esi
45-
; CHECK-NEXT: movb $1, %bl
46-
; CHECK-NEXT: testb %bl, %bl
45+
; CHECK-NEXT: movb $1, %al
46+
; CHECK-NEXT: testb %al, %al
4747
; CHECK-NEXT: jne LBB0_2
4848
; CHECK-NEXT: ## %bb.7: ## %bb31
4949
; CHECK-NEXT: ## implicit-def: $eax
@@ -53,7 +53,8 @@ define void @f(ptr nocapture %arg, ptr nocapture %arg1, ptr nocapture %arg2, ptr
5353
; CHECK-NEXT: ## Child Loop BB0_13 Depth 2
5454
; CHECK-NEXT: ## Child Loop BB0_16 Depth 3
5555
; CHECK-NEXT: ## Child Loop BB0_21 Depth 2
56-
; CHECK-NEXT: testb %bl, %bl
56+
; CHECK-NEXT: movb $1, %al
57+
; CHECK-NEXT: testb %al, %al
5758
; CHECK-NEXT: jne LBB0_9
5859
; CHECK-NEXT: ## %bb.10: ## %bb41
5960
; CHECK-NEXT: ## in Loop: Header=BB0_8 Depth=1
@@ -66,7 +67,9 @@ define void @f(ptr nocapture %arg, ptr nocapture %arg1, ptr nocapture %arg2, ptr
6667
; CHECK-NEXT: Ltmp3: ## EH_LABEL
6768
; CHECK-NEXT: ## %bb.11: ## %bb42
6869
; CHECK-NEXT: ## in Loop: Header=BB0_8 Depth=1
69-
; CHECK-NEXT: testb %bl, %bl
70+
; CHECK-NEXT: xorl %eax, %eax
71+
; CHECK-NEXT: decl %eax
72+
; CHECK-NEXT: testl %eax, %eax
7073
; CHECK-NEXT: jne LBB0_18
7174
; CHECK-NEXT: ## %bb.12: ## %bb45.preheader
7275
; CHECK-NEXT: ## in Loop: Header=BB0_8 Depth=1
@@ -75,7 +78,8 @@ define void @f(ptr nocapture %arg, ptr nocapture %arg1, ptr nocapture %arg2, ptr
7578
; CHECK-NEXT: ## Parent Loop BB0_8 Depth=1
7679
; CHECK-NEXT: ## => This Loop Header: Depth=2
7780
; CHECK-NEXT: ## Child Loop BB0_16 Depth 3
78-
; CHECK-NEXT: testb %bl, %bl
81+
; CHECK-NEXT: movb $1, %cl
82+
; CHECK-NEXT: testb %cl, %cl
7983
; CHECK-NEXT: jne LBB0_19
8084
; CHECK-NEXT: ## %bb.14: ## %bb48
8185
; CHECK-NEXT: ## in Loop: Header=BB0_13 Depth=2
@@ -84,14 +88,14 @@ define void @f(ptr nocapture %arg, ptr nocapture %arg1, ptr nocapture %arg2, ptr
8488
; CHECK-NEXT: ## in Loop: Header=BB0_13 Depth=2
8589
; CHECK-NEXT: xorl %ecx, %ecx
8690
; CHECK-NEXT: movl %esi, %edx
87-
; CHECK-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi ## 4-byte Reload
91+
; CHECK-NEXT: movl %edi, %ebx
8892
; CHECK-NEXT: LBB0_16: ## %bb49
8993
; CHECK-NEXT: ## Parent Loop BB0_8 Depth=1
9094
; CHECK-NEXT: ## Parent Loop BB0_13 Depth=2
9195
; CHECK-NEXT: ## => This Inner Loop Header: Depth=3
9296
; CHECK-NEXT: incl %ecx
9397
; CHECK-NEXT: addl $4, %edx
94-
; CHECK-NEXT: decl %edi
98+
; CHECK-NEXT: decl %ebx
9599
; CHECK-NEXT: jne LBB0_16
96100
; CHECK-NEXT: LBB0_17: ## %bb57
97101
; CHECK-NEXT: ## in Loop: Header=BB0_13 Depth=2
@@ -103,12 +107,13 @@ define void @f(ptr nocapture %arg, ptr nocapture %arg1, ptr nocapture %arg2, ptr
103107
; CHECK-NEXT: movl %eax, {{[0-9]+}}(%esp)
104108
; CHECK-NEXT: movl $0, (%esp)
105109
; CHECK-NEXT: calll ___bzero
106-
; CHECK-NEXT: testb %bl, %bl
110+
; CHECK-NEXT: movb $1, %al
111+
; CHECK-NEXT: testb %al, %al
107112
; CHECK-NEXT: jne LBB0_22
108113
; CHECK-NEXT: ## %bb.20: ## %bb61.preheader
109114
; CHECK-NEXT: ## in Loop: Header=BB0_8 Depth=1
110115
; CHECK-NEXT: movl %esi, %eax
111-
; CHECK-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx ## 4-byte Reload
116+
; CHECK-NEXT: movl %edi, %ecx
112117
; CHECK-NEXT: LBB0_21: ## %bb61
113118
; CHECK-NEXT: ## Parent Loop BB0_8 Depth=1
114119
; CHECK-NEXT: ## => This Inner Loop Header: Depth=2
@@ -122,23 +127,23 @@ define void @f(ptr nocapture %arg, ptr nocapture %arg1, ptr nocapture %arg2, ptr
122127
; CHECK-NEXT: jmp LBB0_8
123128
; CHECK-NEXT: LBB0_18: ## %bb43
124129
; CHECK-NEXT: Ltmp5: ## EH_LABEL
125-
; CHECK-NEXT: movl %esi, %edi
130+
; CHECK-NEXT: movl %esi, %ebx
126131
; CHECK-NEXT: calll _OnOverFlow
127132
; CHECK-NEXT: Ltmp6: ## EH_LABEL
128133
; CHECK-NEXT: jmp LBB0_3
129134
; CHECK-NEXT: LBB0_2: ## %bb29
130135
; CHECK-NEXT: Ltmp7: ## EH_LABEL
131-
; CHECK-NEXT: movl %esi, %edi
136+
; CHECK-NEXT: movl %esi, %ebx
132137
; CHECK-NEXT: calll _OnOverFlow
133138
; CHECK-NEXT: Ltmp8: ## EH_LABEL
134139
; CHECK-NEXT: LBB0_3: ## %bb30
135140
; CHECK-NEXT: ud2
136141
; CHECK-NEXT: LBB0_4: ## %bb20.loopexit
137142
; CHECK-NEXT: Ltmp4: ## EH_LABEL
138143
; CHECK-NEXT: LBB0_9:
139-
; CHECK-NEXT: movl %esi, %edi
144+
; CHECK-NEXT: movl %esi, %ebx
140145
; CHECK-NEXT: LBB0_6: ## %bb23
141-
; CHECK-NEXT: testl %edi, %edi
146+
; CHECK-NEXT: testl %ebx, %ebx
142147
; CHECK-NEXT: addl $28, %esp
143148
; CHECK-NEXT: popl %esi
144149
; CHECK-NEXT: popl %edi

llvm/test/Transforms/CodeGenPrepare/ARM/branch-on-zero.ll

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -260,8 +260,7 @@ else:
260260
define i64 @lshr64(i64 %a) {
261261
; CHECK-LABEL: @lshr64(
262262
; CHECK-NEXT: entry:
263-
; CHECK-NEXT: [[C:%.*]] = icmp ult i64 [[A:%.*]], 1099511627776
264-
; CHECK-NEXT: [[L:%.*]] = lshr i64 [[A]], 40
263+
; CHECK-NEXT: [[L:%.*]] = lshr i64 [[A:%.*]], 40
265264
; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i64 [[L]], 0
266265
; CHECK-NEXT: br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]
267266
; CHECK: then:
@@ -284,8 +283,7 @@ else:
284283
define i128 @lshr128(i128 %a) {
285284
; CHECK-LABEL: @lshr128(
286285
; CHECK-NEXT: entry:
287-
; CHECK-NEXT: [[C:%.*]] = icmp ult i128 [[A:%.*]], 36893488147419103232
288-
; CHECK-NEXT: [[L:%.*]] = lshr i128 [[A]], 65
286+
; CHECK-NEXT: [[L:%.*]] = lshr i128 [[A:%.*]], 65
289287
; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i128 [[L]], 0
290288
; CHECK-NEXT: br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]
291289
; CHECK: then:

0 commit comments

Comments
 (0)