Skip to content

Commit 51f9734

Browse files
committed
[ValueTracking] Fix miscompilation
1 parent a5567a2 commit 51f9734

File tree

3 files changed

+43
-26
lines changed

3 files changed

+43
-26
lines changed

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1577,10 +1577,12 @@ static void computeKnownBitsFromOperator(const Operator *I,
15771577
Value *IncCond = nullptr;
15781578
bool InvertIncCond = false;
15791579
if (auto *SI = dyn_cast<SelectInst>(IncValue)) {
1580-
InvertIncCond = SI->getTrueValue() == P;
1581-
IncValue = InvertIncCond ? SI->getFalseValue() : SI->getTrueValue();
1582-
IncDepth = Depth + 1;
1583-
IncCond = SI->getCondition();
1580+
if (SI->getTrueValue() == P || SI->getFalseValue() == P) {
1581+
InvertIncCond = SI->getTrueValue() == P;
1582+
IncValue = InvertIncCond ? SI->getFalseValue() : SI->getTrueValue();
1583+
IncDepth = Depth + 1;
1584+
IncCond = SI->getCondition();
1585+
}
15841586
}
15851587

15861588
// Change the context instruction to the "edge" that flows into the

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

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,29 +29,32 @@ 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 $12, %esp
32+
; CHECK-NEXT: subl $28, %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
3738
; CHECK-NEXT: testb %al, %al
3839
; CHECK-NEXT: Ltmp0:
39-
; CHECK-NEXT: ## implicit-def: $edi
40+
; CHECK-NEXT: ## implicit-def: $ebx
4041
; CHECK-NEXT: calll __Znam
4142
; CHECK-NEXT: Ltmp1:
4243
; CHECK-NEXT: ## %bb.1: ## %bb11
4344
; CHECK-NEXT: movl %eax, %esi
44-
; CHECK-NEXT: movb $1, %bl
45-
; CHECK-NEXT: testb %bl, %bl
45+
; CHECK-NEXT: movb $1, %al
46+
; CHECK-NEXT: testb %al, %al
4647
; CHECK-NEXT: jne LBB0_2
4748
; CHECK-NEXT: ## %bb.7: ## %bb31
48-
; CHECK-NEXT: ## implicit-def: $edi
49+
; CHECK-NEXT: ## implicit-def: $eax
50+
; CHECK-NEXT: ## kill: killed $eax
4951
; CHECK-NEXT: LBB0_8: ## %bb38
5052
; CHECK-NEXT: ## =>This Loop Header: Depth=1
5153
; CHECK-NEXT: ## Child Loop BB0_13 Depth 2
5254
; CHECK-NEXT: ## Child Loop BB0_16 Depth 3
5355
; CHECK-NEXT: ## Child Loop BB0_21 Depth 2
54-
; CHECK-NEXT: testb %bl, %bl
56+
; CHECK-NEXT: movb $1, %al
57+
; CHECK-NEXT: testb %al, %al
5558
; CHECK-NEXT: jne LBB0_9
5659
; CHECK-NEXT: ## %bb.10: ## %bb41
5760
; 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,13 +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
91+
; CHECK-NEXT: movl %edi, %ebx
8792
; CHECK-NEXT: LBB0_16: ## %bb49
8893
; CHECK-NEXT: ## Parent Loop BB0_8 Depth=1
8994
; CHECK-NEXT: ## Parent Loop BB0_13 Depth=2
9095
; CHECK-NEXT: ## => This Inner Loop Header: Depth=3
9196
; CHECK-NEXT: incl %ecx
9297
; CHECK-NEXT: addl $4, %edx
93-
; CHECK-NEXT: testb %bl, %bl
98+
; CHECK-NEXT: decl %ebx
9499
; CHECK-NEXT: jne LBB0_16
95100
; CHECK-NEXT: LBB0_17: ## %bb57
96101
; CHECK-NEXT: ## in Loop: Header=BB0_13 Depth=2
@@ -102,42 +107,44 @@ define void @f(ptr nocapture %arg, ptr nocapture %arg1, ptr nocapture %arg2, ptr
102107
; CHECK-NEXT: movl %eax, {{[0-9]+}}(%esp)
103108
; CHECK-NEXT: movl $0, (%esp)
104109
; CHECK-NEXT: calll ___bzero
105-
; CHECK-NEXT: testb %bl, %bl
110+
; CHECK-NEXT: movb $1, %al
111+
; CHECK-NEXT: testb %al, %al
106112
; CHECK-NEXT: jne LBB0_22
107113
; CHECK-NEXT: ## %bb.20: ## %bb61.preheader
108114
; CHECK-NEXT: ## in Loop: Header=BB0_8 Depth=1
109115
; CHECK-NEXT: movl %esi, %eax
116+
; CHECK-NEXT: movl %edi, %ecx
110117
; CHECK-NEXT: LBB0_21: ## %bb61
111118
; CHECK-NEXT: ## Parent Loop BB0_8 Depth=1
112119
; CHECK-NEXT: ## => This Inner Loop Header: Depth=2
113120
; CHECK-NEXT: movl $0, (%eax)
114121
; CHECK-NEXT: addl $4, %eax
115-
; CHECK-NEXT: testb %bl, %bl
122+
; CHECK-NEXT: decl %ecx
116123
; CHECK-NEXT: jne LBB0_21
117124
; CHECK-NEXT: LBB0_22: ## %bb67
118125
; CHECK-NEXT: ## in Loop: Header=BB0_8 Depth=1
119-
; CHECK-NEXT: decl %edi
126+
; CHECK-NEXT: decl {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Folded Spill
120127
; CHECK-NEXT: jmp LBB0_8
121128
; CHECK-NEXT: LBB0_18: ## %bb43
122129
; CHECK-NEXT: Ltmp5:
123-
; CHECK-NEXT: movl %esi, %edi
130+
; CHECK-NEXT: movl %esi, %ebx
124131
; CHECK-NEXT: calll _OnOverFlow
125132
; CHECK-NEXT: Ltmp6:
126133
; CHECK-NEXT: jmp LBB0_3
127134
; CHECK-NEXT: LBB0_2: ## %bb29
128135
; CHECK-NEXT: Ltmp7:
129-
; CHECK-NEXT: movl %esi, %edi
136+
; CHECK-NEXT: movl %esi, %ebx
130137
; CHECK-NEXT: calll _OnOverFlow
131138
; CHECK-NEXT: Ltmp8:
132139
; CHECK-NEXT: LBB0_3: ## %bb30
133140
; CHECK-NEXT: ud2
134141
; CHECK-NEXT: LBB0_4: ## %bb20.loopexit
135142
; CHECK-NEXT: Ltmp4:
136143
; CHECK-NEXT: LBB0_9:
137-
; CHECK-NEXT: movl %esi, %edi
144+
; CHECK-NEXT: movl %esi, %ebx
138145
; CHECK-NEXT: LBB0_6: ## %bb23
139-
; CHECK-NEXT: testl %edi, %edi
140-
; CHECK-NEXT: addl $12, %esp
146+
; CHECK-NEXT: testl %ebx, %ebx
147+
; CHECK-NEXT: addl $28, %esp
141148
; CHECK-NEXT: popl %esi
142149
; CHECK-NEXT: popl %edi
143150
; CHECK-NEXT: popl %ebx

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

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,8 @@ 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
185187
; CHECK-NEXT: switch i3 [[V1:%.*]], label [[EXIT:%.*]] [
186188
; CHECK-NEXT: i3 0, label [[FOR_END:%.*]]
187189
; CHECK-NEXT: i3 -1, label [[FOR_END]]
@@ -192,7 +194,9 @@ define void @PR36225(i32 %a, i32 %b, i1 %c1, i3 %v1, i3 %v2) {
192194
; CHECK-NEXT: i3 -1, label [[FOR_END]]
193195
; CHECK-NEXT: ]
194196
; CHECK: for.end:
195-
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A:%.*]], 0
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]]
196200
; CHECK-NEXT: br i1 [[CMP]], label [[EXIT]], label [[EXIT2:%.*]]
197201
; CHECK: exit2:
198202
; CHECK-NEXT: unreachable
@@ -206,8 +210,10 @@ define void @PR36225(i32 %a, i32 %b, i1 %c1, i3 %v1, i3 %v2) {
206210
; DBGINFO-NEXT: #dbg_value(i32 [[B:%.*]], [[META89:![0-9]+]], !DIExpression(DW_OP_lit0, DW_OP_eq, DW_OP_stack_value), [[META95:![0-9]+]])
207211
; DBGINFO-NEXT: br i1 [[C1:%.*]], label [[FOR_BODY3_US:%.*]], label [[FOR_BODY3:%.*]], !dbg [[DBG96:![0-9]+]]
208212
; DBGINFO: for.body3.us:
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]+]])
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]])
211217
; DBGINFO-NEXT: switch i3 [[V1:%.*]], label [[EXIT:%.*]] [
212218
; DBGINFO-NEXT: i3 0, label [[FOR_END:%.*]]
213219
; DBGINFO-NEXT: i3 -1, label [[FOR_END]]
@@ -218,9 +224,11 @@ define void @PR36225(i32 %a, i32 %b, i1 %c1, i3 %v1, i3 %v2) {
218224
; DBGINFO-NEXT: i3 -1, label [[FOR_END]]
219225
; DBGINFO-NEXT: ], !dbg [[DBG99:![0-9]+]]
220226
; DBGINFO: for.end:
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]+]]
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]+]]
224232
; DBGINFO-NEXT: #dbg_value(i1 [[CMP]], [[META93:![0-9]+]], !DIExpression(), [[DBG102]])
225233
; DBGINFO-NEXT: br i1 [[CMP]], label [[EXIT]], label [[EXIT2:%.*]], !dbg [[DBG103:![0-9]+]]
226234
; DBGINFO: exit2:

0 commit comments

Comments
 (0)