llvm.org GIT mirror llvm / 14ac1dd
Invert the logic of reachesChainWithoutSideEffects(). What we want to check is that there is NO path to the destination containing side effects, not that SOME path contains no side effects. In practice, this only manifests with CombinerAA enabled, because otherwise the chain has little to no branching, so "any" is effectively equivalent to "all". git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@114268 91177308-0d34-0410-b5e6-96231b3b80d8 Owen Anderson 9 years ago
2 changed file(s) with 33 addition(s) and 7 deletion(s). Raw diff Collapse all Expand all
54775477
54785478 /// reachesChainWithoutSideEffects - Return true if this operand (which must
54795479 /// be a chain) reaches the specified operand without crossing any
5480 /// side-effecting instructions. In practice, this looks through token
5481 /// factors and non-volatile loads. In order to remain efficient, this only
5482 /// looks a couple of nodes in, it does not do an exhaustive search.
5480 /// side-effecting instructions on any chain path. In practice, this looks
5481 /// through token factors and non-volatile loads. In order to remain efficient,
5482 /// this only looks a couple of nodes in, it does not do an exhaustive search.
54835483 bool SDValue::reachesChainWithoutSideEffects(SDValue Dest,
54845484 unsigned Depth) const {
54855485 if (*this == Dest) return true;
54895489 if (Depth == 0) return false;
54905490
54915491 // If this is a token factor, all inputs to the TF happen in parallel. If any
5492 // of the operands of the TF reach dest, then we can do the xform.
5492 // of the operands of the TF does not reach dest, then we cannot do the xform.
54935493 if (getOpcode() == ISD::TokenFactor) {
54945494 for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
5495 if (getOperand(i).reachesChainWithoutSideEffects(Dest, Depth-1))
5496 return true;
5497 return false;
5495 if (!getOperand(i).reachesChainWithoutSideEffects(Dest, Depth-1))
5496 return false;
5497 return true;
54985498 }
54995499
55005500 // Loads don't have side effects, look through them.
0 ; RUN: llc < %s -combiner-alias-analysis -march=x86-64 | FileCheck %s
1
2 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
3 target triple = "x86_64-apple-darwin10.4"
4 declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind
5
6 define fastcc i32 @cli_magic_scandesc(i8* %in) nounwind ssp {
7 entry:
8 %a = alloca [64 x i8]
9 %b = getelementptr inbounds [64 x i8]* %a, i64 0, i32 0
10 %c = getelementptr inbounds [64 x i8]* %a, i64 0, i32 30
11 %d = load i8* %b, align 8
12 %e = load i8* %c, align 8
13 %f = bitcast [64 x i8]* %a to i8*
14 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %f, i8* %in, i64 64, i32 8, i1 false) nounwind
15 store i8 %d, i8* %b, align 8
16 store i8 %e, i8* %c, align 8
17 ret i32 0
18 }
19
20 ; CHECK: movq ___stack_chk_guard@GOTPCREL(%rip), %rax
21 ; CHECK: movb (%rsp), %dl
22 ; CHECK-NEXT: movb 30(%rsp), %sil
23 ; CHECK: movb %dl, (%rsp)
24 ; CHECK-NEXT: movb %sil, 30(%rsp)
25 ; CHECK: callq ___stack_chk_fail