Skip to content

Commit 5751edb

Browse files
committed
[ValueTracking] Adjust known bits from select's condition
1 parent d990feb commit 5751edb

File tree

3 files changed

+31
-41
lines changed

3 files changed

+31
-41
lines changed

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1574,11 +1574,13 @@ static void computeKnownBitsFromOperator(const Operator *I,
15741574

15751575
// If the Use is a select of this phi, use the knownbit of the other
15761576
// operand to break the recursion.
1577-
Value *V;
1578-
if (match(IncValue, m_Select(m_Value(), m_Specific(P), m_Value(V))) ||
1579-
match(IncValue, m_Select(m_Value(), m_Value(V), m_Specific(P)))) {
1580-
IncValue = V;
1577+
Value *IncCond = nullptr;
1578+
bool InvertIncCond = false;
1579+
if (auto *SI = dyn_cast<SelectInst>(IncValue)) {
1580+
InvertIncCond = SI->getTrueValue() == P;
1581+
IncValue = InvertIncCond ? SI->getFalseValue() : SI->getTrueValue();
15811582
IncDepth = Depth + 1;
1583+
IncCond = SI->getCondition();
15821584
}
15831585

15841586
// Change the context instruction to the "edge" that flows into the
@@ -1590,6 +1592,9 @@ static void computeKnownBitsFromOperator(const Operator *I,
15901592

15911593
Known2 = KnownBits(BitWidth);
15921594
computeKnownBits(IncValue, DemandedElts, Known2, IncDepth, RecQ);
1595+
if (IncCond)
1596+
adjustKnownBitsForSelectArm(Known2, IncCond, IncValue, InvertIncCond,
1597+
Depth, RecQ);
15931598

15941599
// See if we can further use a conditional branch into the phi
15951600
// to help us determine the range of the value.

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

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -29,32 +29,29 @@ define void @f(ptr nocapture %arg, ptr nocapture %arg1, ptr nocapture %arg2, ptr
2929
; CHECK-NEXT: pushl %ebx
3030
; CHECK-NEXT: pushl %edi
3131
; CHECK-NEXT: pushl %esi
32-
; CHECK-NEXT: subl $28, %esp
32+
; CHECK-NEXT: subl $12, %esp
3333
; CHECK-NEXT: .cfi_offset %esi, -20
3434
; CHECK-NEXT: .cfi_offset %edi, -16
3535
; CHECK-NEXT: .cfi_offset %ebx, -12
3636
; CHECK-NEXT: xorl %eax, %eax
37-
; CHECK-NEXT: xorl %edi, %edi
3837
; CHECK-NEXT: testb %al, %al
3938
; CHECK-NEXT: Ltmp0:
40-
; CHECK-NEXT: ## implicit-def: $ebx
39+
; CHECK-NEXT: ## implicit-def: $edi
4140
; CHECK-NEXT: calll __Znam
4241
; CHECK-NEXT: Ltmp1:
4342
; CHECK-NEXT: ## %bb.1: ## %bb11
4443
; CHECK-NEXT: movl %eax, %esi
45-
; CHECK-NEXT: movb $1, %al
46-
; CHECK-NEXT: testb %al, %al
44+
; CHECK-NEXT: movb $1, %bl
45+
; CHECK-NEXT: testb %bl, %bl
4746
; CHECK-NEXT: jne LBB0_2
4847
; CHECK-NEXT: ## %bb.7: ## %bb31
49-
; CHECK-NEXT: ## implicit-def: $eax
50-
; CHECK-NEXT: ## kill: killed $eax
48+
; CHECK-NEXT: ## implicit-def: $edi
5149
; CHECK-NEXT: LBB0_8: ## %bb38
5250
; CHECK-NEXT: ## =>This Loop Header: Depth=1
5351
; CHECK-NEXT: ## Child Loop BB0_13 Depth 2
5452
; CHECK-NEXT: ## Child Loop BB0_16 Depth 3
5553
; CHECK-NEXT: ## Child Loop BB0_21 Depth 2
56-
; CHECK-NEXT: movb $1, %al
57-
; CHECK-NEXT: testb %al, %al
54+
; CHECK-NEXT: testb %bl, %bl
5855
; CHECK-NEXT: jne LBB0_9
5956
; CHECK-NEXT: ## %bb.10: ## %bb41
6057
; CHECK-NEXT: ## in Loop: Header=BB0_8 Depth=1
@@ -78,8 +75,7 @@ define void @f(ptr nocapture %arg, ptr nocapture %arg1, ptr nocapture %arg2, ptr
7875
; CHECK-NEXT: ## Parent Loop BB0_8 Depth=1
7976
; CHECK-NEXT: ## => This Loop Header: Depth=2
8077
; CHECK-NEXT: ## Child Loop BB0_16 Depth 3
81-
; CHECK-NEXT: movb $1, %cl
82-
; CHECK-NEXT: testb %cl, %cl
78+
; CHECK-NEXT: testb %bl, %bl
8379
; CHECK-NEXT: jne LBB0_19
8480
; CHECK-NEXT: ## %bb.14: ## %bb48
8581
; CHECK-NEXT: ## in Loop: Header=BB0_13 Depth=2
@@ -88,14 +84,13 @@ define void @f(ptr nocapture %arg, ptr nocapture %arg1, ptr nocapture %arg2, ptr
8884
; CHECK-NEXT: ## in Loop: Header=BB0_13 Depth=2
8985
; CHECK-NEXT: xorl %ecx, %ecx
9086
; CHECK-NEXT: movl %esi, %edx
91-
; CHECK-NEXT: movl %edi, %ebx
9287
; CHECK-NEXT: LBB0_16: ## %bb49
9388
; CHECK-NEXT: ## Parent Loop BB0_8 Depth=1
9489
; CHECK-NEXT: ## Parent Loop BB0_13 Depth=2
9590
; CHECK-NEXT: ## => This Inner Loop Header: Depth=3
9691
; CHECK-NEXT: incl %ecx
9792
; CHECK-NEXT: addl $4, %edx
98-
; CHECK-NEXT: decl %ebx
93+
; CHECK-NEXT: testb %bl, %bl
9994
; CHECK-NEXT: jne LBB0_16
10095
; CHECK-NEXT: LBB0_17: ## %bb57
10196
; CHECK-NEXT: ## in Loop: Header=BB0_13 Depth=2
@@ -107,44 +102,42 @@ define void @f(ptr nocapture %arg, ptr nocapture %arg1, ptr nocapture %arg2, ptr
107102
; CHECK-NEXT: movl %eax, {{[0-9]+}}(%esp)
108103
; CHECK-NEXT: movl $0, (%esp)
109104
; CHECK-NEXT: calll ___bzero
110-
; CHECK-NEXT: movb $1, %al
111-
; CHECK-NEXT: testb %al, %al
105+
; CHECK-NEXT: testb %bl, %bl
112106
; CHECK-NEXT: jne LBB0_22
113107
; CHECK-NEXT: ## %bb.20: ## %bb61.preheader
114108
; CHECK-NEXT: ## in Loop: Header=BB0_8 Depth=1
115109
; CHECK-NEXT: movl %esi, %eax
116-
; CHECK-NEXT: movl %edi, %ecx
117110
; CHECK-NEXT: LBB0_21: ## %bb61
118111
; CHECK-NEXT: ## Parent Loop BB0_8 Depth=1
119112
; CHECK-NEXT: ## => This Inner Loop Header: Depth=2
120113
; CHECK-NEXT: movl $0, (%eax)
121114
; CHECK-NEXT: addl $4, %eax
122-
; CHECK-NEXT: decl %ecx
115+
; CHECK-NEXT: testb %bl, %bl
123116
; CHECK-NEXT: jne LBB0_21
124117
; CHECK-NEXT: LBB0_22: ## %bb67
125118
; CHECK-NEXT: ## in Loop: Header=BB0_8 Depth=1
126-
; CHECK-NEXT: decl {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Folded Spill
119+
; CHECK-NEXT: decl %edi
127120
; CHECK-NEXT: jmp LBB0_8
128121
; CHECK-NEXT: LBB0_18: ## %bb43
129122
; CHECK-NEXT: Ltmp5:
130-
; CHECK-NEXT: movl %esi, %ebx
123+
; CHECK-NEXT: movl %esi, %edi
131124
; CHECK-NEXT: calll _OnOverFlow
132125
; CHECK-NEXT: Ltmp6:
133126
; CHECK-NEXT: jmp LBB0_3
134127
; CHECK-NEXT: LBB0_2: ## %bb29
135128
; CHECK-NEXT: Ltmp7:
136-
; CHECK-NEXT: movl %esi, %ebx
129+
; CHECK-NEXT: movl %esi, %edi
137130
; CHECK-NEXT: calll _OnOverFlow
138131
; CHECK-NEXT: Ltmp8:
139132
; CHECK-NEXT: LBB0_3: ## %bb30
140133
; CHECK-NEXT: ud2
141134
; CHECK-NEXT: LBB0_4: ## %bb20.loopexit
142135
; CHECK-NEXT: Ltmp4:
143136
; CHECK-NEXT: LBB0_9:
144-
; CHECK-NEXT: movl %esi, %ebx
137+
; CHECK-NEXT: movl %esi, %edi
145138
; CHECK-NEXT: LBB0_6: ## %bb23
146-
; CHECK-NEXT: testl %ebx, %ebx
147-
; CHECK-NEXT: addl $28, %esp
139+
; CHECK-NEXT: testl %edi, %edi
140+
; CHECK-NEXT: addl $12, %esp
148141
; CHECK-NEXT: popl %esi
149142
; CHECK-NEXT: popl %edi
150143
; CHECK-NEXT: popl %ebx

llvm/test/Transforms/InstCombine/cast-mul-select.ll

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -182,8 +182,6 @@ define void @PR36225(i32 %a, i32 %b, i1 %c1, i3 %v1, i3 %v2) {
182182
; CHECK: while.body:
183183
; CHECK-NEXT: br i1 [[C1:%.*]], label [[FOR_BODY3_US:%.*]], label [[FOR_BODY3:%.*]]
184184
; CHECK: for.body3.us:
185-
; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[B:%.*]], 0
186-
; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[TOBOOL]], i8 0, i8 4
187185
; CHECK-NEXT: switch i3 [[V1:%.*]], label [[EXIT:%.*]] [
188186
; CHECK-NEXT: i3 0, label [[FOR_END:%.*]]
189187
; CHECK-NEXT: i3 -1, label [[FOR_END]]
@@ -194,9 +192,7 @@ define void @PR36225(i32 %a, i32 %b, i1 %c1, i3 %v1, i3 %v2) {
194192
; CHECK-NEXT: i3 -1, label [[FOR_END]]
195193
; CHECK-NEXT: ]
196194
; CHECK: for.end:
197-
; CHECK-NEXT: [[H:%.*]] = phi i8 [ [[SPEC_SELECT]], [[FOR_BODY3_US]] ], [ [[SPEC_SELECT]], [[FOR_BODY3_US]] ], [ 0, [[FOR_BODY3]] ], [ 0, [[FOR_BODY3]] ]
198-
; CHECK-NEXT: [[CONV:%.*]] = zext nneg i8 [[H]] to i32
199-
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A:%.*]], [[CONV]]
195+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A:%.*]], 0
200196
; CHECK-NEXT: br i1 [[CMP]], label [[EXIT]], label [[EXIT2:%.*]]
201197
; CHECK: exit2:
202198
; CHECK-NEXT: unreachable
@@ -210,10 +206,8 @@ define void @PR36225(i32 %a, i32 %b, i1 %c1, i3 %v1, i3 %v2) {
210206
; DBGINFO-NEXT: #dbg_value(i32 [[B:%.*]], [[META89:![0-9]+]], !DIExpression(DW_OP_lit0, DW_OP_eq, DW_OP_stack_value), [[META95:![0-9]+]])
211207
; DBGINFO-NEXT: br i1 [[C1:%.*]], label [[FOR_BODY3_US:%.*]], label [[FOR_BODY3:%.*]], !dbg [[DBG96:![0-9]+]]
212208
; DBGINFO: for.body3.us:
213-
; DBGINFO-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[B]], 0, !dbg [[META95]]
214-
; DBGINFO-NEXT: #dbg_value(i1 [[TOBOOL]], [[META89]], !DIExpression(), [[META95]])
215-
; DBGINFO-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[TOBOOL]], i8 0, i8 4, !dbg [[DBG97:![0-9]+]]
216-
; DBGINFO-NEXT: #dbg_value(i8 [[SPEC_SELECT]], [[META90:![0-9]+]], !DIExpression(), [[DBG97]])
209+
; DBGINFO-NEXT: #dbg_value(i32 [[B]], [[META89]], !DIExpression(DW_OP_lit0, DW_OP_eq, DW_OP_stack_value), [[META95]])
210+
; DBGINFO-NEXT: #dbg_value(i8 poison, [[META90:![0-9]+]], !DIExpression(), [[META97:![0-9]+]])
217211
; DBGINFO-NEXT: switch i3 [[V1:%.*]], label [[EXIT:%.*]] [
218212
; DBGINFO-NEXT: i3 0, label [[FOR_END:%.*]]
219213
; DBGINFO-NEXT: i3 -1, label [[FOR_END]]
@@ -224,11 +218,9 @@ define void @PR36225(i32 %a, i32 %b, i1 %c1, i3 %v1, i3 %v2) {
224218
; DBGINFO-NEXT: i3 -1, label [[FOR_END]]
225219
; DBGINFO-NEXT: ], !dbg [[DBG99:![0-9]+]]
226220
; DBGINFO: for.end:
227-
; DBGINFO-NEXT: [[H:%.*]] = phi i8 [ [[SPEC_SELECT]], [[FOR_BODY3_US]] ], [ [[SPEC_SELECT]], [[FOR_BODY3_US]] ], [ 0, [[FOR_BODY3]] ], [ 0, [[FOR_BODY3]] ], !dbg [[DBG100:![0-9]+]]
228-
; DBGINFO-NEXT: #dbg_value(i8 [[H]], [[META91:![0-9]+]], !DIExpression(), [[DBG100]])
229-
; DBGINFO-NEXT: [[CONV:%.*]] = zext nneg i8 [[H]] to i32, !dbg [[DBG101:![0-9]+]]
230-
; DBGINFO-NEXT: #dbg_value(i32 [[CONV]], [[META92:![0-9]+]], !DIExpression(), [[DBG101]])
231-
; DBGINFO-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A:%.*]], [[CONV]], !dbg [[DBG102:![0-9]+]]
221+
; DBGINFO-NEXT: #dbg_value(i8 poison, [[META91:![0-9]+]], !DIExpression(), [[META100:![0-9]+]])
222+
; DBGINFO-NEXT: #dbg_value(i8 0, [[META92:![0-9]+]], !DIExpression(DW_OP_LLVM_convert, 8, DW_ATE_unsigned, DW_OP_LLVM_convert, 32, DW_ATE_unsigned, DW_OP_stack_value), [[META101:![0-9]+]])
223+
; DBGINFO-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A:%.*]], 0, !dbg [[DBG102:![0-9]+]]
232224
; DBGINFO-NEXT: #dbg_value(i1 [[CMP]], [[META93:![0-9]+]], !DIExpression(), [[DBG102]])
233225
; DBGINFO-NEXT: br i1 [[CMP]], label [[EXIT]], label [[EXIT2:%.*]], !dbg [[DBG103:![0-9]+]]
234226
; DBGINFO: exit2:

0 commit comments

Comments
 (0)