mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
Reland "[SCEV] Model ptrtoint(SCEVUnknown) cast not as unknown, but as zext/trunc/self of SCEVUnknown"
This relands commit 1c021c64caef83cccb719c9bf0a2554faa6563af which was reverted in commit 17cec6a11a12f815052d56a17ef738cf246a2d9a because an assertion was being triggered, since `BuildConstantFromSCEV()` wasn't updated to handle the case where the constant we want to truncate is actually a pointer. I was unsuccessful in coming up with a test case where we'd end there with constant zext/sext of a pointer, so i didn't handle those cases there until there is a test case. Original commit message: While we indeed can't treat them as no-ops, i believe we can/should do better than just modelling them as `unknown`. `inttoptr` story is complicated, but for `ptrtoint`, it seems straight-forward to model it just as a zext-or-trunc of unknown. This may be important now that we track towards making inttoptr/ptrtoint casts not no-op, and towards preventing folding them into loads/etc (see D88979/D88789/D88788) Reviewed By: mkazantsev Differential Revision: https://reviews.llvm.org/D88806
This commit is contained in:
parent
7aaed16e98
commit
47d13f688a
@ -3505,15 +3505,15 @@ const SCEV *ScalarEvolution::getUMinExpr(SmallVectorImpl<const SCEV *> &Ops) {
|
||||
}
|
||||
|
||||
const SCEV *ScalarEvolution::getSizeOfExpr(Type *IntTy, Type *AllocTy) {
|
||||
// We can bypass creating a target-independent
|
||||
// constant expression and then folding it back into a ConstantInt.
|
||||
// This is just a compile-time optimization.
|
||||
if (isa<ScalableVectorType>(AllocTy)) {
|
||||
Constant *NullPtr = Constant::getNullValue(AllocTy->getPointerTo());
|
||||
Constant *One = ConstantInt::get(IntTy, 1);
|
||||
Constant *GEP = ConstantExpr::getGetElementPtr(AllocTy, NullPtr, One);
|
||||
return getSCEV(ConstantExpr::getPtrToInt(GEP, IntTy));
|
||||
return getUnknown(ConstantExpr::getPtrToInt(GEP, IntTy));
|
||||
}
|
||||
// We can bypass creating a target-independent
|
||||
// constant expression and then folding it back into a ConstantInt.
|
||||
// This is just a compile-time optimization.
|
||||
return getConstant(IntTy, getDataLayout().getTypeAllocSize(AllocTy));
|
||||
}
|
||||
|
||||
@ -6301,6 +6301,36 @@ const SCEV *ScalarEvolution::createSCEV(Value *V) {
|
||||
return getSCEV(U->getOperand(0));
|
||||
break;
|
||||
|
||||
case Instruction::PtrToInt: {
|
||||
// It's tempting to handle inttoptr and ptrtoint as no-ops,
|
||||
// however this can lead to pointer expressions which cannot safely be
|
||||
// expanded to GEPs because ScalarEvolution doesn't respect
|
||||
// the GEP aliasing rules when simplifying integer expressions.
|
||||
//
|
||||
// However, given
|
||||
// %x = ???
|
||||
// %y = ptrtoint %x
|
||||
// %z = ptrtoint %x
|
||||
// it is safe to say that %y and %z are the same thing.
|
||||
//
|
||||
// So instead of modelling the cast itself as unknown,
|
||||
// since the casts are transparent within SCEV,
|
||||
// we can at least model the casts original value as unknow instead.
|
||||
|
||||
// BUT, there's caveat. If we simply model %x as unknown, unrelated uses
|
||||
// of %x will also see it as unknown, which is obviously bad.
|
||||
// So we can only do this iff %x would be modelled as unknown anyways.
|
||||
auto *OpSCEV = getSCEV(U->getOperand(0));
|
||||
if (isa<SCEVUnknown>(OpSCEV))
|
||||
return getTruncateOrZeroExtend(OpSCEV, U->getType());
|
||||
// If we can model the operand, however, we must fallback to modelling
|
||||
// the whole cast as unknown instead.
|
||||
LLVM_FALLTHROUGH;
|
||||
}
|
||||
case Instruction::IntToPtr:
|
||||
// We can't do this for inttoptr at all, however.
|
||||
return getUnknown(V);
|
||||
|
||||
case Instruction::SDiv:
|
||||
// If both operands are non-negative, this is just an udiv.
|
||||
if (isKnownNonNegative(getSCEV(U->getOperand(0))) &&
|
||||
@ -6315,11 +6345,6 @@ const SCEV *ScalarEvolution::createSCEV(Value *V) {
|
||||
return getURemExpr(getSCEV(U->getOperand(0)), getSCEV(U->getOperand(1)));
|
||||
break;
|
||||
|
||||
// It's tempting to handle inttoptr and ptrtoint as no-ops, however this can
|
||||
// lead to pointer expressions which cannot safely be expanded to GEPs,
|
||||
// because ScalarEvolution doesn't respect the GEP aliasing rules when
|
||||
// simplifying integer expressions.
|
||||
|
||||
case Instruction::GetElementPtr:
|
||||
return createNodeForGEP(cast<GEPOperator>(U));
|
||||
|
||||
@ -7974,8 +7999,11 @@ static Constant *BuildConstantFromSCEV(const SCEV *V) {
|
||||
}
|
||||
case scTruncate: {
|
||||
const SCEVTruncateExpr *ST = cast<SCEVTruncateExpr>(V);
|
||||
if (Constant *CastOp = BuildConstantFromSCEV(ST->getOperand()))
|
||||
return ConstantExpr::getTrunc(CastOp, ST->getType());
|
||||
if (Constant *CastOp = BuildConstantFromSCEV(ST->getOperand())) {
|
||||
if (!CastOp->getType()->isPointerTy())
|
||||
return ConstantExpr::getTrunc(CastOp, ST->getType());
|
||||
return ConstantExpr::getPtrToInt(CastOp, ST->getType());
|
||||
}
|
||||
break;
|
||||
}
|
||||
case scAddExpr: {
|
||||
|
@ -427,7 +427,7 @@ static bool willNotOverflow(ScalarEvolution *SE, Instruction::BinaryOps BinOp,
|
||||
: &ScalarEvolution::getZeroExtendExpr;
|
||||
|
||||
// Check ext(LHS op RHS) == ext(LHS) op ext(RHS)
|
||||
auto *NarrowTy = cast<IntegerType>(LHS->getType());
|
||||
auto *NarrowTy = cast<IntegerType>(SE->getEffectiveSCEVType(LHS->getType()));
|
||||
auto *WideTy =
|
||||
IntegerType::get(NarrowTy->getContext(), NarrowTy->getBitWidth() * 2);
|
||||
|
||||
|
@ -33,9 +33,9 @@ define i32 @d(i32 %base) {
|
||||
; CHECK-NEXT: %1 = load i32*, i32** @c, align 8
|
||||
; CHECK-NEXT: --> %1 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %for.cond: Variant }
|
||||
; CHECK-NEXT: %sub.ptr.lhs.cast = ptrtoint i32* %1 to i64
|
||||
; CHECK-NEXT: --> %sub.ptr.lhs.cast U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %for.cond: Variant }
|
||||
; CHECK-NEXT: --> %1 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %for.cond: Variant }
|
||||
; CHECK-NEXT: %sub.ptr.sub = sub i64 %sub.ptr.lhs.cast, ptrtoint ([1 x i32]* @b to i64)
|
||||
; CHECK-NEXT: --> ((-1 * ptrtoint ([1 x i32]* @b to i64)) + %sub.ptr.lhs.cast) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %for.cond: Variant }
|
||||
; CHECK-NEXT: --> ((-1 * @b) + %1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %for.cond: Variant }
|
||||
; CHECK-NEXT: %sub.ptr.div = sdiv exact i64 %sub.ptr.sub, 4
|
||||
; CHECK-NEXT: --> %sub.ptr.div U: full-set S: [-2305843009213693952,2305843009213693952) Exits: <<Unknown>> LoopDispositions: { %for.cond: Variant }
|
||||
; CHECK-NEXT: %arrayidx1 = getelementptr inbounds [1 x i8], [1 x i8]* %arrayidx, i64 0, i64 %sub.ptr.div
|
||||
|
@ -170,14 +170,14 @@ define void @f3(i8* %x_addr, i8* %y_addr, i32* %tmp_addr) {
|
||||
%int5 = add i32 %int0, 5
|
||||
%int.zext = zext i32 %int5 to i64
|
||||
; CHECK: %int.zext = zext i32 %int5 to i64
|
||||
; CHECK-NEXT: --> (1 + (zext i32 (4 + %int0) to i64))<nuw><nsw> U: [1,4294967294) S: [1,4294967297)
|
||||
; CHECK-NEXT: --> (1 + (zext i32 (4 + (trunc [16 x i8]* @z_addr to i32)) to i64))<nuw><nsw> U: [1,4294967294) S: [1,4294967297)
|
||||
|
||||
%ptr_noalign = bitcast [16 x i8]* @z_addr_noalign to i8*
|
||||
%int0_na = ptrtoint i8* %ptr_noalign to i32
|
||||
%int5_na = add i32 %int0_na, 5
|
||||
%int.zext_na = zext i32 %int5_na to i64
|
||||
; CHECK: %int.zext_na = zext i32 %int5_na to i64
|
||||
; CHECK-NEXT: --> (zext i32 (5 + %int0_na) to i64) U: [0,4294967296) S: [0,4294967296)
|
||||
; CHECK-NEXT: --> (zext i32 (5 + (trunc [16 x i8]* @z_addr_noalign to i32)) to i64) U: [0,4294967296) S: [0,4294967296)
|
||||
|
||||
%tmp = load i32, i32* %tmp_addr
|
||||
%mul = and i32 %tmp, -4
|
||||
|
@ -11,48 +11,31 @@
|
||||
@global = external hidden global [0 x i8]
|
||||
|
||||
define hidden i32* @i64(i8* %arg, i32* %arg10) {
|
||||
; PTR64_IDX64-LABEL: 'i64'
|
||||
; PTR64_IDX64-NEXT: Classifying expressions for: @i64
|
||||
; PTR64_IDX64-NEXT: %tmp = phi i32 [ 0, %bb ], [ %tmp18, %bb17 ]
|
||||
; PTR64_IDX64-NEXT: --> {0,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
|
||||
; PTR64_IDX64-NEXT: %tmp12 = getelementptr i8, i8* %arg, i64 ptrtoint ([0 x i8]* @global to i64)
|
||||
; PTR64_IDX64-NEXT: --> (ptrtoint ([0 x i8]* @global to i64) + %arg) U: full-set S: full-set Exits: (ptrtoint ([0 x i8]* @global to i64) + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR64_IDX64-NEXT: %tmp13 = bitcast i8* %tmp12 to i32*
|
||||
; PTR64_IDX64-NEXT: --> (ptrtoint ([0 x i8]* @global to i64) + %arg) U: full-set S: full-set Exits: (ptrtoint ([0 x i8]* @global to i64) + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR64_IDX64-NEXT: %tmp14 = load i32, i32* %tmp13, align 4
|
||||
; PTR64_IDX64-NEXT: --> %tmp14 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb11: Variant }
|
||||
; PTR64_IDX64-NEXT: %tmp18 = add i32 %tmp, 2
|
||||
; PTR64_IDX64-NEXT: --> {2,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
|
||||
; PTR64_IDX64-NEXT: Determining loop execution counts for: @i64
|
||||
; PTR64_IDX64-NEXT: Loop %bb11: Unpredictable backedge-taken count.
|
||||
; PTR64_IDX64-NEXT: Loop %bb11: Unpredictable max backedge-taken count.
|
||||
; PTR64_IDX64-NEXT: Loop %bb11: Unpredictable predicated backedge-taken count.
|
||||
;
|
||||
; PTR64_IDX32-LABEL: 'i64'
|
||||
; PTR64_IDX32-NEXT: Classifying expressions for: @i64
|
||||
; PTR64_IDX32-NEXT: %tmp = phi i32 [ 0, %bb ], [ %tmp18, %bb17 ]
|
||||
; PTR64_IDX32-NEXT: --> {0,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
|
||||
; PTR64_IDX32-NEXT: %tmp12 = getelementptr i8, i8* %arg, i64 ptrtoint ([0 x i8]* @global to i64)
|
||||
; PTR64_IDX32-NEXT: --> ((trunc i64 ptrtoint ([0 x i8]* @global to i64) to i32) + %arg) U: full-set S: full-set Exits: ((trunc i64 ptrtoint ([0 x i8]* @global to i64) to i32) + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR64_IDX32-NEXT: %tmp13 = bitcast i8* %tmp12 to i32*
|
||||
; PTR64_IDX32-NEXT: --> ((trunc i64 ptrtoint ([0 x i8]* @global to i64) to i32) + %arg) U: full-set S: full-set Exits: ((trunc i64 ptrtoint ([0 x i8]* @global to i64) to i32) + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR64_IDX32-NEXT: %tmp14 = load i32, i32* %tmp13, align 4
|
||||
; PTR64_IDX32-NEXT: --> %tmp14 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb11: Variant }
|
||||
; PTR64_IDX32-NEXT: %tmp18 = add i32 %tmp, 2
|
||||
; PTR64_IDX32-NEXT: --> {2,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
|
||||
; PTR64_IDX32-NEXT: Determining loop execution counts for: @i64
|
||||
; PTR64_IDX32-NEXT: Loop %bb11: Unpredictable backedge-taken count.
|
||||
; PTR64_IDX32-NEXT: Loop %bb11: Unpredictable max backedge-taken count.
|
||||
; PTR64_IDX32-NEXT: Loop %bb11: Unpredictable predicated backedge-taken count.
|
||||
; X64-LABEL: 'i64'
|
||||
; X64-NEXT: Classifying expressions for: @i64
|
||||
; X64-NEXT: %tmp = phi i32 [ 0, %bb ], [ %tmp18, %bb17 ]
|
||||
; X64-NEXT: --> {0,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
|
||||
; X64-NEXT: %tmp12 = getelementptr i8, i8* %arg, i64 ptrtoint ([0 x i8]* @global to i64)
|
||||
; X64-NEXT: --> (@global + %arg) U: full-set S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; X64-NEXT: %tmp13 = bitcast i8* %tmp12 to i32*
|
||||
; X64-NEXT: --> (@global + %arg) U: full-set S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; X64-NEXT: %tmp14 = load i32, i32* %tmp13, align 4
|
||||
; X64-NEXT: --> %tmp14 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb11: Variant }
|
||||
; X64-NEXT: %tmp18 = add i32 %tmp, 2
|
||||
; X64-NEXT: --> {2,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
|
||||
; X64-NEXT: Determining loop execution counts for: @i64
|
||||
; X64-NEXT: Loop %bb11: Unpredictable backedge-taken count.
|
||||
; X64-NEXT: Loop %bb11: Unpredictable max backedge-taken count.
|
||||
; X64-NEXT: Loop %bb11: Unpredictable predicated backedge-taken count.
|
||||
;
|
||||
; PTR32_IDX32-LABEL: 'i64'
|
||||
; PTR32_IDX32-NEXT: Classifying expressions for: @i64
|
||||
; PTR32_IDX32-NEXT: %tmp = phi i32 [ 0, %bb ], [ %tmp18, %bb17 ]
|
||||
; PTR32_IDX32-NEXT: --> {0,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
|
||||
; PTR32_IDX32-NEXT: %tmp12 = getelementptr i8, i8* %arg, i64 ptrtoint ([0 x i8]* @global to i64)
|
||||
; PTR32_IDX32-NEXT: --> ((trunc i64 ptrtoint ([0 x i8]* @global to i64) to i32) + %arg) U: full-set S: full-set Exits: ((trunc i64 ptrtoint ([0 x i8]* @global to i64) to i32) + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR32_IDX32-NEXT: --> (@global + %arg) U: full-set S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR32_IDX32-NEXT: %tmp13 = bitcast i8* %tmp12 to i32*
|
||||
; PTR32_IDX32-NEXT: --> ((trunc i64 ptrtoint ([0 x i8]* @global to i64) to i32) + %arg) U: full-set S: full-set Exits: ((trunc i64 ptrtoint ([0 x i8]* @global to i64) to i32) + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR32_IDX32-NEXT: --> (@global + %arg) U: full-set S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR32_IDX32-NEXT: %tmp14 = load i32, i32* %tmp13, align 4
|
||||
; PTR32_IDX32-NEXT: --> %tmp14 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb11: Variant }
|
||||
; PTR32_IDX32-NEXT: %tmp18 = add i32 %tmp, 2
|
||||
@ -67,9 +50,9 @@ define hidden i32* @i64(i8* %arg, i32* %arg10) {
|
||||
; PTR32_IDX64-NEXT: %tmp = phi i32 [ 0, %bb ], [ %tmp18, %bb17 ]
|
||||
; PTR32_IDX64-NEXT: --> {0,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
|
||||
; PTR32_IDX64-NEXT: %tmp12 = getelementptr i8, i8* %arg, i64 ptrtoint ([0 x i8]* @global to i64)
|
||||
; PTR32_IDX64-NEXT: --> (ptrtoint ([0 x i8]* @global to i64) + %arg) U: [0,8589934591) S: full-set Exits: (ptrtoint ([0 x i8]* @global to i64) + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR32_IDX64-NEXT: --> (@global + %arg) U: [0,8589934591) S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR32_IDX64-NEXT: %tmp13 = bitcast i8* %tmp12 to i32*
|
||||
; PTR32_IDX64-NEXT: --> (ptrtoint ([0 x i8]* @global to i64) + %arg) U: [0,8589934591) S: full-set Exits: (ptrtoint ([0 x i8]* @global to i64) + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR32_IDX64-NEXT: --> (@global + %arg) U: [0,8589934591) S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR32_IDX64-NEXT: %tmp14 = load i32, i32* %tmp13, align 4
|
||||
; PTR32_IDX64-NEXT: --> %tmp14 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb11: Variant }
|
||||
; PTR32_IDX64-NEXT: %tmp18 = add i32 %tmp, 2
|
||||
@ -103,9 +86,9 @@ define hidden i32* @i64_to_i32(i8* %arg, i32* %arg10) {
|
||||
; PTR64_IDX64-NEXT: %tmp = phi i32 [ 0, %bb ], [ %tmp18, %bb17 ]
|
||||
; PTR64_IDX64-NEXT: --> {0,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
|
||||
; PTR64_IDX64-NEXT: %tmp12 = getelementptr i8, i8* %arg, i32 ptrtoint ([0 x i8]* @global to i32)
|
||||
; PTR64_IDX64-NEXT: --> ((sext i32 ptrtoint ([0 x i8]* @global to i32) to i64) + %arg) U: full-set S: full-set Exits: ((sext i32 ptrtoint ([0 x i8]* @global to i32) to i64) + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR64_IDX64-NEXT: --> ((sext i32 (trunc [0 x i8]* @global to i32) to i64) + %arg) U: full-set S: full-set Exits: ((sext i32 (trunc [0 x i8]* @global to i32) to i64) + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR64_IDX64-NEXT: %tmp13 = bitcast i8* %tmp12 to i32*
|
||||
; PTR64_IDX64-NEXT: --> ((sext i32 ptrtoint ([0 x i8]* @global to i32) to i64) + %arg) U: full-set S: full-set Exits: ((sext i32 ptrtoint ([0 x i8]* @global to i32) to i64) + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR64_IDX64-NEXT: --> ((sext i32 (trunc [0 x i8]* @global to i32) to i64) + %arg) U: full-set S: full-set Exits: ((sext i32 (trunc [0 x i8]* @global to i32) to i64) + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR64_IDX64-NEXT: %tmp14 = load i32, i32* %tmp13, align 4
|
||||
; PTR64_IDX64-NEXT: --> %tmp14 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb11: Variant }
|
||||
; PTR64_IDX64-NEXT: %tmp18 = add i32 %tmp, 2
|
||||
@ -120,9 +103,9 @@ define hidden i32* @i64_to_i32(i8* %arg, i32* %arg10) {
|
||||
; PTR64_IDX32-NEXT: %tmp = phi i32 [ 0, %bb ], [ %tmp18, %bb17 ]
|
||||
; PTR64_IDX32-NEXT: --> {0,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
|
||||
; PTR64_IDX32-NEXT: %tmp12 = getelementptr i8, i8* %arg, i32 ptrtoint ([0 x i8]* @global to i32)
|
||||
; PTR64_IDX32-NEXT: --> (ptrtoint ([0 x i8]* @global to i32) + %arg) U: full-set S: full-set Exits: (ptrtoint ([0 x i8]* @global to i32) + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR64_IDX32-NEXT: --> (@global + %arg) U: full-set S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR64_IDX32-NEXT: %tmp13 = bitcast i8* %tmp12 to i32*
|
||||
; PTR64_IDX32-NEXT: --> (ptrtoint ([0 x i8]* @global to i32) + %arg) U: full-set S: full-set Exits: (ptrtoint ([0 x i8]* @global to i32) + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR64_IDX32-NEXT: --> (@global + %arg) U: full-set S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR64_IDX32-NEXT: %tmp14 = load i32, i32* %tmp13, align 4
|
||||
; PTR64_IDX32-NEXT: --> %tmp14 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb11: Variant }
|
||||
; PTR64_IDX32-NEXT: %tmp18 = add i32 %tmp, 2
|
||||
@ -137,9 +120,9 @@ define hidden i32* @i64_to_i32(i8* %arg, i32* %arg10) {
|
||||
; PTR32_IDX32-NEXT: %tmp = phi i32 [ 0, %bb ], [ %tmp18, %bb17 ]
|
||||
; PTR32_IDX32-NEXT: --> {0,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
|
||||
; PTR32_IDX32-NEXT: %tmp12 = getelementptr i8, i8* %arg, i32 ptrtoint ([0 x i8]* @global to i32)
|
||||
; PTR32_IDX32-NEXT: --> (ptrtoint ([0 x i8]* @global to i32) + %arg) U: full-set S: full-set Exits: (ptrtoint ([0 x i8]* @global to i32) + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR32_IDX32-NEXT: --> (@global + %arg) U: full-set S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR32_IDX32-NEXT: %tmp13 = bitcast i8* %tmp12 to i32*
|
||||
; PTR32_IDX32-NEXT: --> (ptrtoint ([0 x i8]* @global to i32) + %arg) U: full-set S: full-set Exits: (ptrtoint ([0 x i8]* @global to i32) + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR32_IDX32-NEXT: --> (@global + %arg) U: full-set S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR32_IDX32-NEXT: %tmp14 = load i32, i32* %tmp13, align 4
|
||||
; PTR32_IDX32-NEXT: --> %tmp14 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb11: Variant }
|
||||
; PTR32_IDX32-NEXT: %tmp18 = add i32 %tmp, 2
|
||||
@ -154,9 +137,9 @@ define hidden i32* @i64_to_i32(i8* %arg, i32* %arg10) {
|
||||
; PTR32_IDX64-NEXT: %tmp = phi i32 [ 0, %bb ], [ %tmp18, %bb17 ]
|
||||
; PTR32_IDX64-NEXT: --> {0,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
|
||||
; PTR32_IDX64-NEXT: %tmp12 = getelementptr i8, i8* %arg, i32 ptrtoint ([0 x i8]* @global to i32)
|
||||
; PTR32_IDX64-NEXT: --> ((sext i32 ptrtoint ([0 x i8]* @global to i32) to i64) + %arg) U: [-2147483648,6442450943) S: full-set Exits: ((sext i32 ptrtoint ([0 x i8]* @global to i32) to i64) + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR32_IDX64-NEXT: --> ((sext i32 (trunc [0 x i8]* @global to i32) to i64) + %arg) U: [-2147483648,6442450943) S: full-set Exits: ((sext i32 (trunc [0 x i8]* @global to i32) to i64) + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR32_IDX64-NEXT: %tmp13 = bitcast i8* %tmp12 to i32*
|
||||
; PTR32_IDX64-NEXT: --> ((sext i32 ptrtoint ([0 x i8]* @global to i32) to i64) + %arg) U: [-2147483648,6442450943) S: full-set Exits: ((sext i32 ptrtoint ([0 x i8]* @global to i32) to i64) + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR32_IDX64-NEXT: --> ((sext i32 (trunc [0 x i8]* @global to i32) to i64) + %arg) U: [-2147483648,6442450943) S: full-set Exits: ((sext i32 (trunc [0 x i8]* @global to i32) to i64) + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR32_IDX64-NEXT: %tmp14 = load i32, i32* %tmp13, align 4
|
||||
; PTR32_IDX64-NEXT: --> %tmp14 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb11: Variant }
|
||||
; PTR32_IDX64-NEXT: %tmp18 = add i32 %tmp, 2
|
||||
@ -185,48 +168,31 @@ bb17: ; preds = %bb11
|
||||
br label %bb11
|
||||
}
|
||||
define hidden i32* @i64_to_i128(i8* %arg, i32* %arg10) {
|
||||
; PTR64_IDX64-LABEL: 'i64_to_i128'
|
||||
; PTR64_IDX64-NEXT: Classifying expressions for: @i64_to_i128
|
||||
; PTR64_IDX64-NEXT: %tmp = phi i32 [ 0, %bb ], [ %tmp18, %bb17 ]
|
||||
; PTR64_IDX64-NEXT: --> {0,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
|
||||
; PTR64_IDX64-NEXT: %tmp12 = getelementptr i8, i8* %arg, i128 ptrtoint ([0 x i8]* @global to i128)
|
||||
; PTR64_IDX64-NEXT: --> ((trunc i128 ptrtoint ([0 x i8]* @global to i128) to i64) + %arg) U: full-set S: full-set Exits: ((trunc i128 ptrtoint ([0 x i8]* @global to i128) to i64) + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR64_IDX64-NEXT: %tmp13 = bitcast i8* %tmp12 to i32*
|
||||
; PTR64_IDX64-NEXT: --> ((trunc i128 ptrtoint ([0 x i8]* @global to i128) to i64) + %arg) U: full-set S: full-set Exits: ((trunc i128 ptrtoint ([0 x i8]* @global to i128) to i64) + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR64_IDX64-NEXT: %tmp14 = load i32, i32* %tmp13, align 4
|
||||
; PTR64_IDX64-NEXT: --> %tmp14 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb11: Variant }
|
||||
; PTR64_IDX64-NEXT: %tmp18 = add i32 %tmp, 2
|
||||
; PTR64_IDX64-NEXT: --> {2,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
|
||||
; PTR64_IDX64-NEXT: Determining loop execution counts for: @i64_to_i128
|
||||
; PTR64_IDX64-NEXT: Loop %bb11: Unpredictable backedge-taken count.
|
||||
; PTR64_IDX64-NEXT: Loop %bb11: Unpredictable max backedge-taken count.
|
||||
; PTR64_IDX64-NEXT: Loop %bb11: Unpredictable predicated backedge-taken count.
|
||||
;
|
||||
; PTR64_IDX32-LABEL: 'i64_to_i128'
|
||||
; PTR64_IDX32-NEXT: Classifying expressions for: @i64_to_i128
|
||||
; PTR64_IDX32-NEXT: %tmp = phi i32 [ 0, %bb ], [ %tmp18, %bb17 ]
|
||||
; PTR64_IDX32-NEXT: --> {0,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
|
||||
; PTR64_IDX32-NEXT: %tmp12 = getelementptr i8, i8* %arg, i128 ptrtoint ([0 x i8]* @global to i128)
|
||||
; PTR64_IDX32-NEXT: --> ((trunc i128 ptrtoint ([0 x i8]* @global to i128) to i32) + %arg) U: full-set S: full-set Exits: ((trunc i128 ptrtoint ([0 x i8]* @global to i128) to i32) + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR64_IDX32-NEXT: %tmp13 = bitcast i8* %tmp12 to i32*
|
||||
; PTR64_IDX32-NEXT: --> ((trunc i128 ptrtoint ([0 x i8]* @global to i128) to i32) + %arg) U: full-set S: full-set Exits: ((trunc i128 ptrtoint ([0 x i8]* @global to i128) to i32) + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR64_IDX32-NEXT: %tmp14 = load i32, i32* %tmp13, align 4
|
||||
; PTR64_IDX32-NEXT: --> %tmp14 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb11: Variant }
|
||||
; PTR64_IDX32-NEXT: %tmp18 = add i32 %tmp, 2
|
||||
; PTR64_IDX32-NEXT: --> {2,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
|
||||
; PTR64_IDX32-NEXT: Determining loop execution counts for: @i64_to_i128
|
||||
; PTR64_IDX32-NEXT: Loop %bb11: Unpredictable backedge-taken count.
|
||||
; PTR64_IDX32-NEXT: Loop %bb11: Unpredictable max backedge-taken count.
|
||||
; PTR64_IDX32-NEXT: Loop %bb11: Unpredictable predicated backedge-taken count.
|
||||
; X64-LABEL: 'i64_to_i128'
|
||||
; X64-NEXT: Classifying expressions for: @i64_to_i128
|
||||
; X64-NEXT: %tmp = phi i32 [ 0, %bb ], [ %tmp18, %bb17 ]
|
||||
; X64-NEXT: --> {0,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
|
||||
; X64-NEXT: %tmp12 = getelementptr i8, i8* %arg, i128 ptrtoint ([0 x i8]* @global to i128)
|
||||
; X64-NEXT: --> (@global + %arg) U: full-set S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; X64-NEXT: %tmp13 = bitcast i8* %tmp12 to i32*
|
||||
; X64-NEXT: --> (@global + %arg) U: full-set S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; X64-NEXT: %tmp14 = load i32, i32* %tmp13, align 4
|
||||
; X64-NEXT: --> %tmp14 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb11: Variant }
|
||||
; X64-NEXT: %tmp18 = add i32 %tmp, 2
|
||||
; X64-NEXT: --> {2,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
|
||||
; X64-NEXT: Determining loop execution counts for: @i64_to_i128
|
||||
; X64-NEXT: Loop %bb11: Unpredictable backedge-taken count.
|
||||
; X64-NEXT: Loop %bb11: Unpredictable max backedge-taken count.
|
||||
; X64-NEXT: Loop %bb11: Unpredictable predicated backedge-taken count.
|
||||
;
|
||||
; PTR32_IDX32-LABEL: 'i64_to_i128'
|
||||
; PTR32_IDX32-NEXT: Classifying expressions for: @i64_to_i128
|
||||
; PTR32_IDX32-NEXT: %tmp = phi i32 [ 0, %bb ], [ %tmp18, %bb17 ]
|
||||
; PTR32_IDX32-NEXT: --> {0,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
|
||||
; PTR32_IDX32-NEXT: %tmp12 = getelementptr i8, i8* %arg, i128 ptrtoint ([0 x i8]* @global to i128)
|
||||
; PTR32_IDX32-NEXT: --> ((trunc i128 ptrtoint ([0 x i8]* @global to i128) to i32) + %arg) U: full-set S: full-set Exits: ((trunc i128 ptrtoint ([0 x i8]* @global to i128) to i32) + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR32_IDX32-NEXT: --> (@global + %arg) U: full-set S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR32_IDX32-NEXT: %tmp13 = bitcast i8* %tmp12 to i32*
|
||||
; PTR32_IDX32-NEXT: --> ((trunc i128 ptrtoint ([0 x i8]* @global to i128) to i32) + %arg) U: full-set S: full-set Exits: ((trunc i128 ptrtoint ([0 x i8]* @global to i128) to i32) + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR32_IDX32-NEXT: --> (@global + %arg) U: full-set S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR32_IDX32-NEXT: %tmp14 = load i32, i32* %tmp13, align 4
|
||||
; PTR32_IDX32-NEXT: --> %tmp14 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb11: Variant }
|
||||
; PTR32_IDX32-NEXT: %tmp18 = add i32 %tmp, 2
|
||||
@ -241,9 +207,9 @@ define hidden i32* @i64_to_i128(i8* %arg, i32* %arg10) {
|
||||
; PTR32_IDX64-NEXT: %tmp = phi i32 [ 0, %bb ], [ %tmp18, %bb17 ]
|
||||
; PTR32_IDX64-NEXT: --> {0,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
|
||||
; PTR32_IDX64-NEXT: %tmp12 = getelementptr i8, i8* %arg, i128 ptrtoint ([0 x i8]* @global to i128)
|
||||
; PTR32_IDX64-NEXT: --> ((trunc i128 ptrtoint ([0 x i8]* @global to i128) to i64) + %arg) U: [0,8589934591) S: full-set Exits: ((trunc i128 ptrtoint ([0 x i8]* @global to i128) to i64) + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR32_IDX64-NEXT: --> (@global + %arg) U: [0,8589934591) S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR32_IDX64-NEXT: %tmp13 = bitcast i8* %tmp12 to i32*
|
||||
; PTR32_IDX64-NEXT: --> ((trunc i128 ptrtoint ([0 x i8]* @global to i128) to i64) + %arg) U: [0,8589934591) S: full-set Exits: ((trunc i128 ptrtoint ([0 x i8]* @global to i128) to i64) + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR32_IDX64-NEXT: --> (@global + %arg) U: [0,8589934591) S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
|
||||
; PTR32_IDX64-NEXT: %tmp14 = load i32, i32* %tmp13, align 4
|
||||
; PTR32_IDX64-NEXT: --> %tmp14 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb11: Variant }
|
||||
; PTR32_IDX64-NEXT: %tmp18 = add i32 %tmp, 2
|
||||
|
@ -16,25 +16,25 @@ define void @ptrtoint(i8* %in, i64* %out0, i32* %out1, i16* %out2, i128* %out3)
|
||||
; X64-LABEL: 'ptrtoint'
|
||||
; X64-NEXT: Classifying expressions for: @ptrtoint
|
||||
; X64-NEXT: %p0 = ptrtoint i8* %in to i64
|
||||
; X64-NEXT: --> %p0 U: full-set S: full-set
|
||||
; X64-NEXT: --> %in U: full-set S: full-set
|
||||
; X64-NEXT: %p1 = ptrtoint i8* %in to i32
|
||||
; X64-NEXT: --> %p1 U: full-set S: full-set
|
||||
; X64-NEXT: --> (trunc i8* %in to i32) U: full-set S: full-set
|
||||
; X64-NEXT: %p2 = ptrtoint i8* %in to i16
|
||||
; X64-NEXT: --> %p2 U: full-set S: full-set
|
||||
; X64-NEXT: --> (trunc i8* %in to i16) U: full-set S: full-set
|
||||
; X64-NEXT: %p3 = ptrtoint i8* %in to i128
|
||||
; X64-NEXT: --> %p3 U: [0,18446744073709551616) S: [-18446744073709551616,18446744073709551616)
|
||||
; X64-NEXT: --> (zext i8* %in to i128) U: [0,18446744073709551616) S: [0,18446744073709551616)
|
||||
; X64-NEXT: Determining loop execution counts for: @ptrtoint
|
||||
;
|
||||
; X32-LABEL: 'ptrtoint'
|
||||
; X32-NEXT: Classifying expressions for: @ptrtoint
|
||||
; X32-NEXT: %p0 = ptrtoint i8* %in to i64
|
||||
; X32-NEXT: --> %p0 U: [0,4294967296) S: [-4294967296,4294967296)
|
||||
; X32-NEXT: --> (zext i8* %in to i64) U: [0,4294967296) S: [0,4294967296)
|
||||
; X32-NEXT: %p1 = ptrtoint i8* %in to i32
|
||||
; X32-NEXT: --> %p1 U: full-set S: full-set
|
||||
; X32-NEXT: --> %in U: full-set S: full-set
|
||||
; X32-NEXT: %p2 = ptrtoint i8* %in to i16
|
||||
; X32-NEXT: --> %p2 U: full-set S: full-set
|
||||
; X32-NEXT: --> (trunc i8* %in to i16) U: full-set S: full-set
|
||||
; X32-NEXT: %p3 = ptrtoint i8* %in to i128
|
||||
; X32-NEXT: --> %p3 U: [0,4294967296) S: [-4294967296,4294967296)
|
||||
; X32-NEXT: --> (zext i8* %in to i128) U: [0,4294967296) S: [0,4294967296)
|
||||
; X32-NEXT: Determining loop execution counts for: @ptrtoint
|
||||
;
|
||||
%p0 = ptrtoint i8* %in to i64
|
||||
@ -53,25 +53,25 @@ define void @ptrtoint_as1(i8 addrspace(1)* %in, i64* %out0, i32* %out1, i16* %ou
|
||||
; X64-LABEL: 'ptrtoint_as1'
|
||||
; X64-NEXT: Classifying expressions for: @ptrtoint_as1
|
||||
; X64-NEXT: %p0 = ptrtoint i8 addrspace(1)* %in to i64
|
||||
; X64-NEXT: --> %p0 U: full-set S: full-set
|
||||
; X64-NEXT: --> %in U: full-set S: full-set
|
||||
; X64-NEXT: %p1 = ptrtoint i8 addrspace(1)* %in to i32
|
||||
; X64-NEXT: --> %p1 U: full-set S: full-set
|
||||
; X64-NEXT: --> (trunc i8 addrspace(1)* %in to i32) U: full-set S: full-set
|
||||
; X64-NEXT: %p2 = ptrtoint i8 addrspace(1)* %in to i16
|
||||
; X64-NEXT: --> %p2 U: full-set S: full-set
|
||||
; X64-NEXT: --> (trunc i8 addrspace(1)* %in to i16) U: full-set S: full-set
|
||||
; X64-NEXT: %p3 = ptrtoint i8 addrspace(1)* %in to i128
|
||||
; X64-NEXT: --> %p3 U: [0,18446744073709551616) S: [-18446744073709551616,18446744073709551616)
|
||||
; X64-NEXT: --> (zext i8 addrspace(1)* %in to i128) U: [0,18446744073709551616) S: [0,18446744073709551616)
|
||||
; X64-NEXT: Determining loop execution counts for: @ptrtoint_as1
|
||||
;
|
||||
; X32-LABEL: 'ptrtoint_as1'
|
||||
; X32-NEXT: Classifying expressions for: @ptrtoint_as1
|
||||
; X32-NEXT: %p0 = ptrtoint i8 addrspace(1)* %in to i64
|
||||
; X32-NEXT: --> %p0 U: [0,4294967296) S: [-4294967296,4294967296)
|
||||
; X32-NEXT: --> (zext i8 addrspace(1)* %in to i64) U: [0,4294967296) S: [0,4294967296)
|
||||
; X32-NEXT: %p1 = ptrtoint i8 addrspace(1)* %in to i32
|
||||
; X32-NEXT: --> %p1 U: full-set S: full-set
|
||||
; X32-NEXT: --> %in U: full-set S: full-set
|
||||
; X32-NEXT: %p2 = ptrtoint i8 addrspace(1)* %in to i16
|
||||
; X32-NEXT: --> %p2 U: full-set S: full-set
|
||||
; X32-NEXT: --> (trunc i8 addrspace(1)* %in to i16) U: full-set S: full-set
|
||||
; X32-NEXT: %p3 = ptrtoint i8 addrspace(1)* %in to i128
|
||||
; X32-NEXT: --> %p3 U: [0,4294967296) S: [-4294967296,4294967296)
|
||||
; X32-NEXT: --> (zext i8 addrspace(1)* %in to i128) U: [0,4294967296) S: [0,4294967296)
|
||||
; X32-NEXT: Determining loop execution counts for: @ptrtoint_as1
|
||||
;
|
||||
%p0 = ptrtoint i8 addrspace(1)* %in to i64
|
||||
@ -92,7 +92,7 @@ define void @ptrtoint_of_bitcast(i8* %in, i64* %out0) {
|
||||
; X64-NEXT: %in_casted = bitcast i8* %in to float*
|
||||
; X64-NEXT: --> %in U: full-set S: full-set
|
||||
; X64-NEXT: %p0 = ptrtoint float* %in_casted to i64
|
||||
; X64-NEXT: --> %p0 U: full-set S: full-set
|
||||
; X64-NEXT: --> %in U: full-set S: full-set
|
||||
; X64-NEXT: Determining loop execution counts for: @ptrtoint_of_bitcast
|
||||
;
|
||||
; X32-LABEL: 'ptrtoint_of_bitcast'
|
||||
@ -100,7 +100,7 @@ define void @ptrtoint_of_bitcast(i8* %in, i64* %out0) {
|
||||
; X32-NEXT: %in_casted = bitcast i8* %in to float*
|
||||
; X32-NEXT: --> %in U: full-set S: full-set
|
||||
; X32-NEXT: %p0 = ptrtoint float* %in_casted to i64
|
||||
; X32-NEXT: --> %p0 U: [0,4294967296) S: [-4294967296,4294967296)
|
||||
; X32-NEXT: --> (zext i8* %in to i64) U: [0,4294967296) S: [0,4294967296)
|
||||
; X32-NEXT: Determining loop execution counts for: @ptrtoint_of_bitcast
|
||||
;
|
||||
%in_casted = bitcast i8* %in to float*
|
||||
@ -116,7 +116,7 @@ define void @ptrtoint_of_addrspacecast(i8* %in, i64* %out0) {
|
||||
; X64-NEXT: %in_casted = addrspacecast i8* %in to i8 addrspace(1)*
|
||||
; X64-NEXT: --> %in_casted U: full-set S: full-set
|
||||
; X64-NEXT: %p0 = ptrtoint i8 addrspace(1)* %in_casted to i64
|
||||
; X64-NEXT: --> %p0 U: full-set S: full-set
|
||||
; X64-NEXT: --> %in_casted U: full-set S: full-set
|
||||
; X64-NEXT: Determining loop execution counts for: @ptrtoint_of_addrspacecast
|
||||
;
|
||||
; X32-LABEL: 'ptrtoint_of_addrspacecast'
|
||||
@ -124,7 +124,7 @@ define void @ptrtoint_of_addrspacecast(i8* %in, i64* %out0) {
|
||||
; X32-NEXT: %in_casted = addrspacecast i8* %in to i8 addrspace(1)*
|
||||
; X32-NEXT: --> %in_casted U: full-set S: full-set
|
||||
; X32-NEXT: %p0 = ptrtoint i8 addrspace(1)* %in_casted to i64
|
||||
; X32-NEXT: --> %p0 U: [0,4294967296) S: [-4294967296,4294967296)
|
||||
; X32-NEXT: --> (zext i8 addrspace(1)* %in_casted to i64) U: [0,4294967296) S: [0,4294967296)
|
||||
; X32-NEXT: Determining loop execution counts for: @ptrtoint_of_addrspacecast
|
||||
;
|
||||
%in_casted = addrspacecast i8* %in to i8 addrspace(1)*
|
||||
@ -140,7 +140,7 @@ define void @ptrtoint_of_inttoptr(i64 %in, i64* %out0) {
|
||||
; X64-NEXT: %in_casted = inttoptr i64 %in to i8*
|
||||
; X64-NEXT: --> %in_casted U: full-set S: full-set
|
||||
; X64-NEXT: %p0 = ptrtoint i8* %in_casted to i64
|
||||
; X64-NEXT: --> %p0 U: full-set S: full-set
|
||||
; X64-NEXT: --> %in_casted U: full-set S: full-set
|
||||
; X64-NEXT: Determining loop execution counts for: @ptrtoint_of_inttoptr
|
||||
;
|
||||
; X32-LABEL: 'ptrtoint_of_inttoptr'
|
||||
@ -148,7 +148,7 @@ define void @ptrtoint_of_inttoptr(i64 %in, i64* %out0) {
|
||||
; X32-NEXT: %in_casted = inttoptr i64 %in to i8*
|
||||
; X32-NEXT: --> %in_casted U: full-set S: full-set
|
||||
; X32-NEXT: %p0 = ptrtoint i8* %in_casted to i64
|
||||
; X32-NEXT: --> %p0 U: [0,4294967296) S: [-4294967296,4294967296)
|
||||
; X32-NEXT: --> (zext i8* %in_casted to i64) U: [0,4294967296) S: [0,4294967296)
|
||||
; X32-NEXT: Determining loop execution counts for: @ptrtoint_of_inttoptr
|
||||
;
|
||||
%in_casted = inttoptr i64 %in to i8*
|
||||
@ -197,11 +197,17 @@ define void @ptrtoint_of_nullptr(i64* %out0) {
|
||||
|
||||
; A constant inttoptr argument of an ptrtoint is still bad.
|
||||
define void @ptrtoint_of_constantexpr_inttoptr(i64* %out0) {
|
||||
; ALL-LABEL: 'ptrtoint_of_constantexpr_inttoptr'
|
||||
; ALL-NEXT: Classifying expressions for: @ptrtoint_of_constantexpr_inttoptr
|
||||
; ALL-NEXT: %p0 = ptrtoint i8* inttoptr (i64 42 to i8*) to i64
|
||||
; ALL-NEXT: --> %p0 U: [42,43) S: [-64,64)
|
||||
; ALL-NEXT: Determining loop execution counts for: @ptrtoint_of_constantexpr_inttoptr
|
||||
; X64-LABEL: 'ptrtoint_of_constantexpr_inttoptr'
|
||||
; X64-NEXT: Classifying expressions for: @ptrtoint_of_constantexpr_inttoptr
|
||||
; X64-NEXT: %p0 = ptrtoint i8* inttoptr (i64 42 to i8*) to i64
|
||||
; X64-NEXT: --> inttoptr (i64 42 to i8*) U: [42,43) S: [-64,64)
|
||||
; X64-NEXT: Determining loop execution counts for: @ptrtoint_of_constantexpr_inttoptr
|
||||
;
|
||||
; X32-LABEL: 'ptrtoint_of_constantexpr_inttoptr'
|
||||
; X32-NEXT: Classifying expressions for: @ptrtoint_of_constantexpr_inttoptr
|
||||
; X32-NEXT: %p0 = ptrtoint i8* inttoptr (i64 42 to i8*) to i64
|
||||
; X32-NEXT: --> (zext i8* inttoptr (i64 42 to i8*) to i64) U: [42,43) S: [0,4294967296)
|
||||
; X32-NEXT: Determining loop execution counts for: @ptrtoint_of_constantexpr_inttoptr
|
||||
;
|
||||
%p0 = ptrtoint i8* inttoptr (i64 42 to i8*) to i64
|
||||
store i64 %p0, i64* %out0
|
||||
|
@ -186,7 +186,9 @@ define linkonce_odr i32 @vector_insert(%"class.std::__1::vector.182"*, [1 x i32]
|
||||
br i1 %114, label %124, label %115
|
||||
|
||||
; CHECK-LABEL: .preheader:
|
||||
; CHECK-NEXT: sub i32 [[OLD_CAST]], [[NEW_CAST]]
|
||||
; CHECK-NEXT: [[NEG_NEW:%[0-9]+]] = sub i32 0, [[NEW_CAST]]
|
||||
; CHECK-NEXT: getelementptr i8, i8* %97, i32 [[NEG_NEW]]
|
||||
|
||||
; <label>:115: ; preds = %111, %115
|
||||
%116 = phi i8* [ %118, %115 ], [ %97, %111 ]
|
||||
%117 = phi i8* [ %119, %115 ], [ %11, %111 ]
|
||||
|
@ -268,9 +268,9 @@ define i8* @SyFgets(i8* %line, i64 %length, i64 %fid) {
|
||||
; CHECK-NEXT: LBB0_48: ## %if.then1477
|
||||
; CHECK-NEXT: movl $1, %edx
|
||||
; CHECK-NEXT: callq _write
|
||||
; CHECK-NEXT: subq %rbx, %r14
|
||||
; CHECK-NEXT: movq _syHistory@{{.*}}(%rip), %rax
|
||||
; CHECK-NEXT: leaq 8189(%r14,%rax), %rax
|
||||
; CHECK-NEXT: subq %rbx, %rax
|
||||
; CHECK-NEXT: leaq 8189(%rax,%r14), %rax
|
||||
; CHECK-NEXT: .p2align 4, 0x90
|
||||
; CHECK-NEXT: LBB0_49: ## %for.body1723
|
||||
; CHECK-NEXT: ## =>This Inner Loop Header: Depth=1
|
||||
|
@ -166,21 +166,23 @@ define i8 @testnullptrint(i8* %buf, i8* %end) nounwind {
|
||||
; PTR64-NEXT: ret i8 [[RET]]
|
||||
;
|
||||
; PTR32-LABEL: @testnullptrint(
|
||||
; PTR32-NEXT: [[BUF1:%.*]] = ptrtoint i8* [[BUF:%.*]] to i32
|
||||
; PTR32-NEXT: br label [[LOOPGUARD:%.*]]
|
||||
; PTR32: loopguard:
|
||||
; PTR32-NEXT: [[BI:%.*]] = ptrtoint i8* [[BUF:%.*]] to i32
|
||||
; PTR32-NEXT: [[BI:%.*]] = ptrtoint i8* [[BUF]] to i32
|
||||
; PTR32-NEXT: [[EI:%.*]] = ptrtoint i8* [[END:%.*]] to i32
|
||||
; PTR32-NEXT: [[CNT:%.*]] = sub i32 [[EI]], [[BI]]
|
||||
; PTR32-NEXT: [[CNT1:%.*]] = inttoptr i32 [[CNT]] to i8*
|
||||
; PTR32-NEXT: [[GUARD:%.*]] = icmp ult i32 0, [[CNT]]
|
||||
; PTR32-NEXT: br i1 [[GUARD]], label [[PREHEADER:%.*]], label [[EXIT:%.*]]
|
||||
; PTR32: preheader:
|
||||
; PTR32-NEXT: [[TMP1:%.*]] = sub i32 0, [[BUF1]]
|
||||
; PTR32-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, i8* [[END]], i32 [[TMP1]]
|
||||
; PTR32-NEXT: br label [[LOOP:%.*]]
|
||||
; PTR32: loop:
|
||||
; PTR32-NEXT: [[P_01_US_US:%.*]] = phi i8* [ null, [[PREHEADER]] ], [ [[GEP:%.*]], [[LOOP]] ]
|
||||
; PTR32-NEXT: [[GEP]] = getelementptr inbounds i8, i8* [[P_01_US_US]], i64 1
|
||||
; PTR32-NEXT: [[SNEXT:%.*]] = load i8, i8* [[GEP]]
|
||||
; PTR32-NEXT: [[EXITCOND:%.*]] = icmp ne i8* [[GEP]], [[CNT1]]
|
||||
; PTR32-NEXT: [[SNEXT:%.*]] = load i8, i8* [[GEP]], align 1
|
||||
; PTR32-NEXT: [[EXITCOND:%.*]] = icmp ne i8* [[GEP]], [[SCEVGEP]]
|
||||
; PTR32-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]]
|
||||
; PTR32: exit.loopexit:
|
||||
; PTR32-NEXT: [[SNEXT_LCSSA:%.*]] = phi i8 [ [[SNEXT]], [[LOOP]] ]
|
||||
@ -256,10 +258,10 @@ define i8 @testptrint(i8* %buf, i8* %end) nounwind {
|
||||
; PTR32-NEXT: [[P_01_US_US:%.*]] = phi i8* [ [[BUF]], [[PREHEADER]] ], [ [[GEP:%.*]], [[LOOP]] ]
|
||||
; PTR32-NEXT: [[IV:%.*]] = phi i32 [ [[BI]], [[PREHEADER]] ], [ [[IVNEXT:%.*]], [[LOOP]] ]
|
||||
; PTR32-NEXT: [[GEP]] = getelementptr inbounds i8, i8* [[P_01_US_US]], i64 1
|
||||
; PTR32-NEXT: [[SNEXT:%.*]] = load i8, i8* [[GEP]]
|
||||
; PTR32-NEXT: [[SNEXT:%.*]] = load i8, i8* [[GEP]], align 1
|
||||
; PTR32-NEXT: [[IVNEXT]] = add nuw i32 [[IV]], 1
|
||||
; PTR32-NEXT: [[EXITCOND:%.*]] = icmp ne i32 [[IVNEXT]], [[CNT]]
|
||||
; PTR32-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]]
|
||||
; PTR32-NEXT: [[CMP:%.*]] = icmp ult i32 [[IVNEXT]], [[CNT]]
|
||||
; PTR32-NEXT: br i1 [[CMP]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]]
|
||||
; PTR32: exit.loopexit:
|
||||
; PTR32-NEXT: [[SNEXT_LCSSA:%.*]] = phi i8 [ [[SNEXT]], [[LOOP]] ]
|
||||
; PTR32-NEXT: br label [[EXIT]]
|
||||
|
Loading…
Reference in New Issue
Block a user