Skip to content

Commit a590c65

Browse files
committed
Merge 81821 from mainline.
Don't pull a load through a callseq_start if the load's chain has multiple uses, as one of the other uses may be on a path to a different node above the callseq_start, because that leads to a cyclic graph. This problem is exposed when -combiner-global-alias-analysis is used. This fixes PR4880. llvm-svn: 81978
1 parent c61881e commit a590c65

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

llvm/lib/Target/X86/X86ISelDAGToDAG.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,8 @@ static bool isCalleeLoad(SDValue Callee, SDValue &Chain) {
447447
if (Chain.getOperand(0).getNode() == Callee.getNode())
448448
return true;
449449
if (Chain.getOperand(0).getOpcode() == ISD::TokenFactor &&
450-
Callee.getValue(1).isOperandOf(Chain.getOperand(0).getNode()))
450+
Callee.getValue(1).isOperandOf(Chain.getOperand(0).getNode()) &&
451+
Callee.getValue(1).hasOneUse())
451452
return true;
452453
return false;
453454
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
; RUN: llc < %s --combiner-alias-analysis --combiner-global-alias-analysis
2+
; PR4880
3+
4+
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32"
5+
target triple = "i386-pc-linux-gnu"
6+
7+
%struct.alst_node = type { %struct.node }
8+
%struct.arg_node = type { %struct.node, i8*, %struct.alst_node* }
9+
%struct.arglst_node = type { %struct.alst_node, %struct.arg_node*, %struct.arglst_node* }
10+
%struct.lam_node = type { %struct.alst_node, %struct.arg_node*, %struct.alst_node* }
11+
%struct.node = type { i32 (...)**, %struct.node* }
12+
13+
define i32 @._ZN8lam_node18resolve_name_clashEP8arg_nodeP9alst_node._ZNK8lam_nodeeqERK8exp_node._ZN11arglst_nodeD0Ev(%struct.lam_node* %this.this, %struct.arg_node* %outer_arg, %struct.alst_node* %env.cmp, %struct.arglst_node* %this, i32 %functionID) {
14+
comb_entry:
15+
%.SV59 = alloca %struct.node* ; <%struct.node**> [#uses=1]
16+
%0 = load i32 (...)*** null, align 4 ; <i32 (...)**> [#uses=1]
17+
%1 = getelementptr inbounds i32 (...)** %0, i32 3 ; <i32 (...)**> [#uses=1]
18+
%2 = load i32 (...)** %1, align 4 ; <i32 (...)*> [#uses=1]
19+
store %struct.node* undef, %struct.node** %.SV59
20+
%3 = bitcast i32 (...)* %2 to i32 (%struct.node*)* ; <i32 (%struct.node*)*> [#uses=1]
21+
%4 = tail call i32 %3(%struct.node* undef) ; <i32> [#uses=0]
22+
unreachable
23+
}

0 commit comments

Comments
 (0)