Skip to content

Commit 5155c38

Browse files
authored
[InstCombine] Don't check uses of constant exprs (#113684)
This patch skips constant expressions to avoid iterating over uses on other functions. Fix crash reported in #105510 (comment).
1 parent 819abe4 commit 5155c38

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

llvm/lib/Transforms/InstCombine/InstructionCombining.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3753,7 +3753,9 @@ Instruction *InstCombinerImpl::visitBranchInst(BranchInst &BI) {
37533753
}
37543754

37553755
// Replace all dominated uses of the condition with true/false
3756-
if (BI.getSuccessor(0) != BI.getSuccessor(1)) {
3756+
// Ignore constant expressions to avoid iterating over uses on other
3757+
// functions.
3758+
if (!isa<Constant>(Cond) && BI.getSuccessor(0) != BI.getSuccessor(1)) {
37573759
for (auto &U : make_early_inc_range(Cond->uses())) {
37583760
BasicBlockEdge Edge0(BI.getParent(), BI.getSuccessor(0));
37593761
if (DT.dominates(Edge0, U)) {
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -S -passes=instcombine < %s | FileCheck %s
3+
4+
; Make sure we don't crash in this case.
5+
@g = global i32 0
6+
7+
define i1 @foo() {
8+
; CHECK-LABEL: define i1 @foo() {
9+
; CHECK-NEXT: [[ENTRY:.*:]]
10+
; CHECK-NEXT: br i1 ptrtoint (ptr @g to i1), label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
11+
; CHECK: [[IF_THEN]]:
12+
; CHECK-NEXT: ret i1 true
13+
; CHECK: [[IF_ELSE]]:
14+
; CHECK-NEXT: ret i1 false
15+
;
16+
entry:
17+
br i1 ptrtoint (ptr @g to i1), label %if.then, label %if.else
18+
19+
if.then:
20+
ret i1 true
21+
22+
if.else:
23+
ret i1 false
24+
}
25+
26+
define i1 @bar() {
27+
; CHECK-LABEL: define i1 @bar() {
28+
; CHECK-NEXT: [[ENTRY:.*:]]
29+
; CHECK-NEXT: br i1 ptrtoint (ptr @g to i1), label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
30+
; CHECK: [[IF_THEN]]:
31+
; CHECK-NEXT: ret i1 true
32+
; CHECK: [[IF_ELSE]]:
33+
; CHECK-NEXT: ret i1 false
34+
;
35+
entry:
36+
br i1 ptrtoint (ptr @g to i1), label %if.then, label %if.else
37+
38+
if.then:
39+
ret i1 true
40+
41+
if.else:
42+
ret i1 false
43+
}

0 commit comments

Comments
 (0)