[IRBuilder] Migrate and-folding to value-based FoldAnd.
Similar to the migration of or-folding to FoldOr, there are a few cases where the fold in IRBuilder::CreateAnd triggered directly. Those have been updated. Reviewed By: nikic Differential Revision: https://reviews.llvm.org/D117431
This commit is contained in:
parent
90efbe697a
commit
782c0dd1a1
|
@ -89,7 +89,8 @@ char *var_zero(char *base) {
|
|||
// CHECK-SANITIZE-C-NEXT: %[[COMPUTED_GEP_IS_NOT_NULL:.*]] = icmp ne i64 %[[COMPUTED_GEP]], 0, !nosanitize
|
||||
// CHECK-SANITIZE-C-NEXT: %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL:.*]] = and i1 %[[BASE_IS_NOT_NULLPTR]], %[[COMPUTED_GEP_IS_NOT_NULL]], !nosanitize
|
||||
// CHECK-SANITIZE-C-NEXT: %[[COMPUTED_GEP_IS_UGE_BASE:.*]] = icmp uge i64 %[[COMPUTED_GEP]], %[[BASE_RELOADED_INT]], !nosanitize
|
||||
// CHECK-SANITIZE-C-NEXT: %[[GEP_IS_OKAY:.*]] = and i1 %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL]], %[[COMPUTED_GEP_IS_UGE_BASE]], !nosanitize
|
||||
// CHECK-SANITIZE-C-NEXT: %[[AND_TRUE:.*]] = and i1 %[[COMPUTED_GEP_IS_UGE_BASE]], true, !nosanitize
|
||||
// CHECK-SANITIZE-C-NEXT: %[[GEP_IS_OKAY:.*]] = and i1 %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL]], %[[AND_TRUE]], !nosanitize
|
||||
// CHECK-SANITIZE-C-NEXT: br i1 %[[GEP_IS_OKAY]], label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize
|
||||
// CHECK-SANITIZE-C: [[HANDLER_POINTER_OVERFLOW]]:
|
||||
// CHECK-SANITIZE-NORECOVER-C-NEXT: call void @__ubsan_handle_pointer_overflow_abort(i8* bitcast ({ {{{.*}}} }* @[[LINE_200]] to i8*), i64 %[[BASE_RELOADED_INT]], i64 %[[COMPUTED_GEP]])
|
||||
|
@ -117,7 +118,8 @@ char *var_one(char *base) {
|
|||
// CHECK-SANITIZE-C-NEXT: %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL:.*]] = and i1 %[[BASE_IS_NOT_NULLPTR]], %[[COMPUTED_GEP_IS_NOT_NULL]], !nosanitize
|
||||
// CHECK-SANITIZE-CPP-NEXT: %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL:.*]] = icmp eq i1 %[[BASE_IS_NOT_NULLPTR]], %[[COMPUTED_GEP_IS_NOT_NULL]], !nosanitize
|
||||
// CHECK-SANITIZE-NEXT: %[[COMPUTED_GEP_IS_UGE_BASE:.*]] = icmp uge i64 %[[COMPUTED_GEP]], %[[BASE_RELOADED_INT]], !nosanitize
|
||||
// CHECK-SANITIZE-NEXT: %[[GEP_IS_OKAY:.*]] = and i1 %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL]], %[[COMPUTED_GEP_IS_UGE_BASE]], !nosanitize
|
||||
// CHECK-SANITIZE-NEXT: %[[AND_TRUE:.*]] = and i1 %[[COMPUTED_GEP_IS_UGE_BASE]], true, !nosanitize
|
||||
// CHECK-SANITIZE-NEXT: %[[GEP_IS_OKAY:.*]] = and i1 %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL]], %[[AND_TRUE]], !nosanitize
|
||||
// CHECK-SANITIZE-NEXT: br i1 %[[GEP_IS_OKAY]], label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize
|
||||
// CHECK-SANITIZE: [[HANDLER_POINTER_OVERFLOW]]:
|
||||
// CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_pointer_overflow_abort(i8* bitcast ({ {{{.*}}} }* @[[LINE_300]] to i8*), i64 %[[BASE_RELOADED_INT]], i64 %[[COMPUTED_GEP]])
|
||||
|
@ -145,7 +147,8 @@ char *var_allones(char *base) {
|
|||
// CHECK-SANITIZE-C-NEXT: %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL:.*]] = and i1 %[[BASE_IS_NOT_NULLPTR]], %[[COMPUTED_GEP_IS_NOT_NULL]], !nosanitize
|
||||
// CHECK-SANITIZE-CPP-NEXT: %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL:.*]] = icmp eq i1 %[[BASE_IS_NOT_NULLPTR]], %[[COMPUTED_GEP_IS_NOT_NULL]], !nosanitize
|
||||
// CHECK-SANITIZE-NEXT: %[[COMPUTED_GEP_IS_UGE_BASE:.*]] = icmp uge i64 %[[COMPUTED_GEP]], %[[BASE_RELOADED_INT]], !nosanitize
|
||||
// CHECK-SANITIZE-NEXT: %[[GEP_IS_OKAY:.*]] = and i1 %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL]], %[[COMPUTED_GEP_IS_UGE_BASE]], !nosanitize
|
||||
// CHECK-SANITIZE-NEXT: %[[AND_TRUE:.*]] = and i1 %[[COMPUTED_GEP_IS_UGE_BASE]], true, !nosanitize
|
||||
// CHECK-SANITIZE-NEXT: %[[GEP_IS_OKAY:.*]] = and i1 %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL]], %[[AND_TRUE]], !nosanitize
|
||||
// CHECK-SANITIZE-NEXT: br i1 %[[GEP_IS_OKAY]], label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize
|
||||
// CHECK-SANITIZE: [[HANDLER_POINTER_OVERFLOW]]:
|
||||
// CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_pointer_overflow_abort(i8* bitcast ({ {{{.*}}} }* @[[LINE_400]] to i8*), i64 %[[BASE_RELOADED_INT]], i64 %[[COMPUTED_GEP]])
|
||||
|
|
|
@ -187,7 +187,8 @@ char *postinc(char *base) {
|
|||
// CHECK-SANITIZE-C-NEXT: %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL:.*]] = and i1 %[[BASE_IS_NOT_NULLPTR]], %[[COMPUTED_GEP_IS_NOT_NULL]], !nosanitize
|
||||
// CHECK-SANITIZE-CPP-NEXT: %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL:.*]] = icmp eq i1 %[[BASE_IS_NOT_NULLPTR]], %[[COMPUTED_GEP_IS_NOT_NULL]], !nosanitize
|
||||
// CHECK-SANITIZE-NEXT: %[[COMPUTED_GEP_IS_UGE_BASE:.*]] = icmp uge i64 %[[COMPUTED_GEP]], %[[BASE_RELOADED_INT]], !nosanitize
|
||||
// CHECK-SANITIZE-NEXT: %[[GEP_IS_OKAY:.*]] = and i1 %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL]], %[[COMPUTED_GEP_IS_UGE_BASE]], !nosanitize
|
||||
// CHECK-SANITIZE-NEXT: %[[AND_TRUE:.*]] = and i1 %[[COMPUTED_GEP_IS_UGE_BASE]], true, !nosanitize
|
||||
// CHECK-SANITIZE-NEXT: %[[GEP_IS_OKAY:.*]] = and i1 %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL]], %[[AND_TRUE]], !nosanitize
|
||||
// CHECK-SANITIZE-NEXT: br i1 %[[GEP_IS_OKAY]], label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize
|
||||
// CHECK-SANITIZE: [[HANDLER_POINTER_OVERFLOW]]:
|
||||
// CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_pointer_overflow_abort(i8* bitcast ({ {{{.*}}} }* @[[LINE_500]] to i8*), i64 %[[BASE_RELOADED_INT]], i64 %[[COMPUTED_GEP]])
|
||||
|
@ -217,7 +218,8 @@ char *postdec(char *base) {
|
|||
// CHECK-SANITIZE-C-NEXT: %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL:.*]] = and i1 %[[BASE_IS_NOT_NULLPTR]], %[[COMPUTED_GEP_IS_NOT_NULL]], !nosanitize
|
||||
// CHECK-SANITIZE-CPP-NEXT: %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL:.*]] = icmp eq i1 %[[BASE_IS_NOT_NULLPTR]], %[[COMPUTED_GEP_IS_NOT_NULL]], !nosanitize
|
||||
// CHECK-SANITIZE-NEXT: %[[COMPUTED_GEP_IS_ULE_BASE:.*]] = icmp ule i64 %[[COMPUTED_GEP]], %[[BASE_RELOADED_INT]], !nosanitize
|
||||
// CHECK-SANITIZE-NEXT: %[[GEP_IS_OKAY:.*]] = and i1 %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL]], %[[COMPUTED_GEP_IS_ULE_BASE]], !nosanitize
|
||||
// CHECK-SANITIZE-NEXT: %[[AND_TRUE:.*]] = and i1 %[[COMPUTED_GEP_IS_UGE_BASE]], true, !nosanitize
|
||||
// CHECK-SANITIZE-NEXT: %[[GEP_IS_OKAY:.*]] = and i1 %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL]], %[[AND_TRUE]], !nosanitize
|
||||
// CHECK-SANITIZE-NEXT: br i1 %[[GEP_IS_OKAY]], label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize
|
||||
// CHECK-SANITIZE: [[HANDLER_POINTER_OVERFLOW]]:
|
||||
// CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_pointer_overflow_abort(i8* bitcast ({ {{{.*}}} }* @[[LINE_600]] to i8*), i64 %[[BASE_RELOADED_INT]], i64 %[[COMPUTED_GEP]])
|
||||
|
@ -247,7 +249,8 @@ char *preinc(char *base) {
|
|||
// CHECK-SANITIZE-C-NEXT: %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL:.*]] = and i1 %[[BASE_IS_NOT_NULLPTR]], %[[COMPUTED_GEP_IS_NOT_NULL]], !nosanitize
|
||||
// CHECK-SANITIZE-CPP-NEXT: %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL:.*]] = icmp eq i1 %[[BASE_IS_NOT_NULLPTR]], %[[COMPUTED_GEP_IS_NOT_NULL]], !nosanitize
|
||||
// CHECK-SANITIZE-NEXT: %[[COMPUTED_GEP_IS_UGE_BASE:.*]] = icmp uge i64 %[[COMPUTED_GEP]], %[[BASE_RELOADED_INT]], !nosanitize
|
||||
// CHECK-SANITIZE-NEXT: %[[GEP_IS_OKAY:.*]] = and i1 %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL]], %[[COMPUTED_GEP_IS_UGE_BASE]], !nosanitize
|
||||
// CHECK-SANITIZE-NEXT: %[[AND_TRUE:.*]] = and i1 %[[COMPUTED_GEP_IS_UGE_BASE]], true, !nosanitize
|
||||
// CHECK-SANITIZE-NEXT: %[[GEP_IS_OKAY:.*]] = and i1 %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL]], %[[AND_TRUE]], !nosanitize
|
||||
// CHECK-SANITIZE-NEXT: br i1 %[[GEP_IS_OKAY]], label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize
|
||||
// CHECK-SANITIZE: [[HANDLER_POINTER_OVERFLOW]]:
|
||||
// CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_pointer_overflow_abort(i8* bitcast ({ {{{.*}}} }* @[[LINE_700]] to i8*), i64 %[[BASE_RELOADED_INT]], i64 %[[COMPUTED_GEP]])
|
||||
|
@ -277,7 +280,8 @@ char *predec(char *base) {
|
|||
// CHECK-SANITIZE-C-NEXT: %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL:.*]] = and i1 %[[BASE_IS_NOT_NULLPTR]], %[[COMPUTED_GEP_IS_NOT_NULL]], !nosanitize
|
||||
// CHECK-SANITIZE-CPP-NEXT: %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL:.*]] = icmp eq i1 %[[BASE_IS_NOT_NULLPTR]], %[[COMPUTED_GEP_IS_NOT_NULL]], !nosanitize
|
||||
// CHECK-SANITIZE-NEXT: %[[COMPUTED_GEP_IS_ULE_BASE:.*]] = icmp ule i64 %[[COMPUTED_GEP]], %[[BASE_RELOADED_INT]], !nosanitize
|
||||
// CHECK-SANITIZE-NEXT: %[[GEP_IS_OKAY:.*]] = and i1 %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL]], %[[COMPUTED_GEP_IS_ULE_BASE]], !nosanitize
|
||||
// CHECK-SANITIZE-NEXT: %[[AND_TRUE:.*]] = and i1 %[[COMPUTED_GEP_IS_UGE_BASE]], true, !nosanitize
|
||||
// CHECK-SANITIZE-NEXT: %[[GEP_IS_OKAY:.*]] = and i1 %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL]], %[[AND_TRUE]], !nosanitize
|
||||
// CHECK-SANITIZE-NEXT: br i1 %[[GEP_IS_OKAY]], label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize
|
||||
// CHECK-SANITIZE: [[HANDLER_POINTER_OVERFLOW]]:
|
||||
// CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_pointer_overflow_abort(i8* bitcast ({ {{{.*}}} }* @[[LINE_800]] to i8*), i64 %[[BASE_RELOADED_INT]], i64 %[[COMPUTED_GEP]])
|
||||
|
|
|
@ -229,8 +229,10 @@ typedef struct __attribute__((packed)) T14 {
|
|||
T14 t14;
|
||||
__attribute__((cmse_nonsecure_entry)) T14 f14() { return t14; }
|
||||
// CHECK: define {{.*}} @f14()
|
||||
// CHECK: %[[R:.*]] = load
|
||||
// CHECK: ret i32 %[[R]]
|
||||
// CHECK: [[R:%.*]] = load
|
||||
// CHECK-LE-NOPT-NEXT: [[AND:%.+]] = and i32 [[R]], -1
|
||||
// CHECK-BE-NOPT-NEXT: [[AND:%.+]] = and i32 [[R]], -1
|
||||
// CHECK_NEXT: ret i32 [[AND]]
|
||||
|
||||
// LE: 1111..11 1111..11 11111111 11111111 0xfffff3f3/-3085
|
||||
// BE: 11..1111 11..1111 11111111 11111111 0xcfcfffff/-808452097
|
||||
|
|
|
@ -52,6 +52,10 @@ public:
|
|||
return SimplifyAddInst(LHS, RHS, HasNUW, HasNSW, SQ);
|
||||
}
|
||||
|
||||
Value *FoldAnd(Value *LHS, Value *RHS) const override {
|
||||
return SimplifyAndInst(LHS, RHS, SQ);
|
||||
}
|
||||
|
||||
Value *FoldOr(Value *LHS, Value *RHS) const override {
|
||||
return SimplifyOrInst(LHS, RHS, SQ);
|
||||
}
|
||||
|
@ -122,9 +126,6 @@ public:
|
|||
bool isExact = false) const override {
|
||||
return ConstFolder.CreateAShr(LHS, RHS, isExact);
|
||||
}
|
||||
Value *CreateAnd(Constant *LHS, Constant *RHS) const override {
|
||||
return ConstFolder.CreateAnd(LHS, RHS);
|
||||
}
|
||||
Value *CreateXor(Constant *LHS, Constant *RHS) const override {
|
||||
return ConstFolder.CreateXor(LHS, RHS);
|
||||
}
|
||||
|
|
|
@ -57,6 +57,14 @@ public:
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
Value *FoldAnd(Value *LHS, Value *RHS) const override {
|
||||
auto *LC = dyn_cast<Constant>(LHS);
|
||||
auto *RC = dyn_cast<Constant>(RHS);
|
||||
if (LC && RC)
|
||||
return Fold(ConstantExpr::getAnd(LC, RC));
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Value *FoldOr(Value *LHS, Value *RHS) const override {
|
||||
auto *LC = dyn_cast<Constant>(LHS);
|
||||
auto *RC = dyn_cast<Constant>(RHS);
|
||||
|
@ -150,9 +158,6 @@ public:
|
|||
bool isExact = false) const override {
|
||||
return Fold(ConstantExpr::getAShr(LHS, RHS, isExact));
|
||||
}
|
||||
Constant *CreateAnd(Constant *LHS, Constant *RHS) const override {
|
||||
return Fold(ConstantExpr::getAnd(LHS, RHS));
|
||||
}
|
||||
Constant *CreateXor(Constant *LHS, Constant *RHS) const override {
|
||||
return Fold(ConstantExpr::getXor(LHS, RHS));
|
||||
}
|
||||
|
|
|
@ -47,6 +47,14 @@ public:
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
Value *FoldAnd(Value *LHS, Value *RHS) const override {
|
||||
auto *LC = dyn_cast<Constant>(LHS);
|
||||
auto *RC = dyn_cast<Constant>(RHS);
|
||||
if (LC && RC)
|
||||
return ConstantExpr::getAnd(LC, RC);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Value *FoldOr(Value *LHS, Value *RHS) const override {
|
||||
auto *LC = dyn_cast<Constant>(LHS);
|
||||
auto *RC = dyn_cast<Constant>(RHS);
|
||||
|
@ -154,10 +162,6 @@ public:
|
|||
return ConstantExpr::getAShr(LHS, RHS, isExact);
|
||||
}
|
||||
|
||||
Constant *CreateAnd(Constant *LHS, Constant *RHS) const override {
|
||||
return ConstantExpr::getAnd(LHS, RHS);
|
||||
}
|
||||
|
||||
Constant *CreateOr(Constant *LHS, Constant *RHS) const {
|
||||
return ConstantExpr::getOr(LHS, RHS);
|
||||
}
|
||||
|
|
|
@ -1359,12 +1359,8 @@ public:
|
|||
}
|
||||
|
||||
Value *CreateAnd(Value *LHS, Value *RHS, const Twine &Name = "") {
|
||||
if (auto *RC = dyn_cast<Constant>(RHS)) {
|
||||
if (isa<ConstantInt>(RC) && cast<ConstantInt>(RC)->isMinusOne())
|
||||
return LHS; // LHS & -1 -> LHS
|
||||
if (auto *LC = dyn_cast<Constant>(LHS))
|
||||
return Insert(Folder.CreateAnd(LC, RC), Name);
|
||||
}
|
||||
if (auto *V = Folder.FoldAnd(LHS, RHS))
|
||||
return V;
|
||||
return Insert(BinaryOperator::CreateAnd(LHS, RHS), Name);
|
||||
}
|
||||
|
||||
|
|
|
@ -33,6 +33,9 @@ public:
|
|||
//===--------------------------------------------------------------------===//
|
||||
virtual Value *FoldAdd(Value *LHS, Value *RHS, bool HasNUW = false,
|
||||
bool HasNSW = false) const = 0;
|
||||
|
||||
virtual Value *FoldAnd(Value *LHS, Value *RHS) const = 0;
|
||||
|
||||
virtual Value *FoldOr(Value *LHS, Value *RHS) const = 0;
|
||||
|
||||
virtual Value *FoldICmp(CmpInst::Predicate P, Value *LHS,
|
||||
|
@ -68,7 +71,6 @@ public:
|
|||
bool isExact = false) const = 0;
|
||||
virtual Value *CreateAShr(Constant *LHS, Constant *RHS,
|
||||
bool isExact = false) const = 0;
|
||||
virtual Value *CreateAnd(Constant *LHS, Constant *RHS) const = 0;
|
||||
virtual Value *CreateXor(Constant *LHS, Constant *RHS) const = 0;
|
||||
virtual Value *CreateBinOp(Instruction::BinaryOps Opc,
|
||||
Constant *LHS, Constant *RHS) const = 0;
|
||||
|
|
|
@ -48,6 +48,8 @@ public:
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
Value *FoldAnd(Value *LHS, Value *RHS) const override { return nullptr; }
|
||||
|
||||
Value *FoldOr(Value *LHS, Value *RHS) const override { return nullptr; }
|
||||
|
||||
Value *FoldICmp(CmpInst::Predicate P, Value *LHS, Value *RHS) const override {
|
||||
|
@ -149,10 +151,6 @@ public:
|
|||
return BinaryOperator::CreateExactAShr(LHS, RHS);
|
||||
}
|
||||
|
||||
Instruction *CreateAnd(Constant *LHS, Constant *RHS) const override {
|
||||
return BinaryOperator::CreateAnd(LHS, RHS);
|
||||
}
|
||||
|
||||
Instruction *CreateXor(Constant *LHS, Constant *RHS) const override {
|
||||
return BinaryOperator::CreateXor(LHS, RHS);
|
||||
}
|
||||
|
|
|
@ -581,10 +581,11 @@ end:
|
|||
define void @p8_constant_mask_signbit_noncanonical(i32 %x, i32* %p0, i32* %p1) {
|
||||
; LZCNT-LABEL: @p8_constant_mask_signbit_noncanonical(
|
||||
; LZCNT-NEXT: entry:
|
||||
; LZCNT-NEXT: [[X_NUMLEADINGZEROS:%.*]] = call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 true), !dbg [[DBG142:![0-9]+]]
|
||||
; LZCNT-NEXT: [[X_NUMACTIVEBITS:%.*]] = sub nuw nsw i32 32, [[X_NUMLEADINGZEROS]], !dbg [[DBG142]]
|
||||
; LZCNT-NEXT: [[X_LEADINGONEPOS:%.*]] = add nsw i32 [[X_NUMACTIVEBITS]], -1, !dbg [[DBG142]]
|
||||
; LZCNT-NEXT: [[LOOP_BACKEDGETAKENCOUNT:%.*]] = sub nuw nsw i32 31, [[X_LEADINGONEPOS]], !dbg [[DBG142]]
|
||||
; LZCNT-NEXT: [[X_MASKED:%.*]] = and i32 [[X:%.*]], -1, !dbg [[DBG142:![0-9]+]]
|
||||
; LZCNT-NEXT: [[X_MASKED_NUMLEADINGZEROS:%.*]] = call i32 @llvm.ctlz.i32(i32 [[X_MASKED]], i1 true), !dbg [[DBG142]]
|
||||
; LZCNT-NEXT: [[X_MASKED_NUMACTIVEBITS:%.*]] = sub nuw nsw i32 32, [[X_MASKED_NUMLEADINGZEROS]], !dbg [[DBG142]]
|
||||
; LZCNT-NEXT: [[X_MASKED_LEADINGONEPOS:%.*]] = add nsw i32 [[X_MASKED_NUMACTIVEBITS]], -1, !dbg [[DBG142]]
|
||||
; LZCNT-NEXT: [[LOOP_BACKEDGETAKENCOUNT:%.*]] = sub nuw nsw i32 31, [[X_MASKED_LEADINGONEPOS]], !dbg [[DBG142]]
|
||||
; LZCNT-NEXT: [[LOOP_TRIPCOUNT:%.*]] = add nuw nsw i32 [[LOOP_BACKEDGETAKENCOUNT]], 1, !dbg [[DBG142]]
|
||||
; LZCNT-NEXT: [[X_CURR:%.*]] = shl i32 [[X]], [[LOOP_BACKEDGETAKENCOUNT]], !dbg [[DBG142]]
|
||||
; LZCNT-NEXT: [[X_NEXT:%.*]] = shl i32 [[X_CURR]], 1, !dbg [[DBG142]]
|
||||
|
@ -648,10 +649,11 @@ end:
|
|||
define void @p9_constant_mask_signbit_canonical(i32 %x, i32* %p0, i32* %p1) {
|
||||
; LZCNT-LABEL: @p9_constant_mask_signbit_canonical(
|
||||
; LZCNT-NEXT: entry:
|
||||
; LZCNT-NEXT: [[X_NUMLEADINGZEROS:%.*]] = call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 true), !dbg [[DBG156:![0-9]+]]
|
||||
; LZCNT-NEXT: [[X_NUMACTIVEBITS:%.*]] = sub nuw nsw i32 32, [[X_NUMLEADINGZEROS]], !dbg [[DBG156]]
|
||||
; LZCNT-NEXT: [[X_LEADINGONEPOS:%.*]] = add nsw i32 [[X_NUMACTIVEBITS]], -1, !dbg [[DBG156]]
|
||||
; LZCNT-NEXT: [[LOOP_BACKEDGETAKENCOUNT:%.*]] = sub nuw nsw i32 31, [[X_LEADINGONEPOS]], !dbg [[DBG156]]
|
||||
; LZCNT-NEXT: [[X_MASKED:%.*]] = and i32 [[X:%.*]], -1, !dbg [[DBG156:![0-9]+]]
|
||||
; LZCNT-NEXT: [[X_MASKED_NUMLEADINGZEROS:%.*]] = call i32 @llvm.ctlz.i32(i32 [[X_MASKED]], i1 true), !dbg [[DBG156]]
|
||||
; LZCNT-NEXT: [[X_MASKED_NUMACTIVEBITS:%.*]] = sub nuw nsw i32 32, [[X_MASKED_NUMLEADINGZEROS]], !dbg [[DBG156]]
|
||||
; LZCNT-NEXT: [[X_MASKED_LEADINGONEPOS:%.*]] = add nsw i32 [[X_MASKED_NUMACTIVEBITS]], -1, !dbg [[DBG156]]
|
||||
; LZCNT-NEXT: [[LOOP_BACKEDGETAKENCOUNT:%.*]] = sub nuw nsw i32 31, [[X_MASKED_LEADINGONEPOS]], !dbg [[DBG156]]
|
||||
; LZCNT-NEXT: [[LOOP_TRIPCOUNT:%.*]] = add nuw nsw i32 [[LOOP_BACKEDGETAKENCOUNT]], 1, !dbg [[DBG156]]
|
||||
; LZCNT-NEXT: [[X_CURR:%.*]] = shl i32 [[X]], [[LOOP_BACKEDGETAKENCOUNT]], !dbg [[DBG156]]
|
||||
; LZCNT-NEXT: [[X_NEXT:%.*]] = shl i32 [[X_CURR]], 1, !dbg [[DBG156]]
|
||||
|
@ -991,10 +993,11 @@ end:
|
|||
define i32 @p14(i32 %x) {
|
||||
; LZCNT-LABEL: @p14(
|
||||
; LZCNT-NEXT: entry:
|
||||
; LZCNT-NEXT: [[X_NUMLEADINGZEROS:%.*]] = call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 true), !dbg [[DBG231:![0-9]+]]
|
||||
; LZCNT-NEXT: [[X_NUMACTIVEBITS:%.*]] = sub nuw nsw i32 32, [[X_NUMLEADINGZEROS]], !dbg [[DBG231]]
|
||||
; LZCNT-NEXT: [[X_LEADINGONEPOS:%.*]] = add nsw i32 [[X_NUMACTIVEBITS]], -1, !dbg [[DBG231]]
|
||||
; LZCNT-NEXT: [[LOOP_BACKEDGETAKENCOUNT:%.*]] = sub nuw nsw i32 31, [[X_LEADINGONEPOS]], !dbg [[DBG231]]
|
||||
; LZCNT-NEXT: [[X_MASKED:%.*]] = and i32 [[X:%.*]], -1, !dbg [[DBG231:![0-9]+]]
|
||||
; LZCNT-NEXT: [[X_MASKED_NUMLEADINGZEROS:%.*]] = call i32 @llvm.ctlz.i32(i32 [[X_MASKED]], i1 true), !dbg [[DBG231]]
|
||||
; LZCNT-NEXT: [[X_MASKED_NUMACTIVEBITS:%.*]] = sub nuw nsw i32 32, [[X_MASKED_NUMLEADINGZEROS]], !dbg [[DBG231]]
|
||||
; LZCNT-NEXT: [[X_MASKED_LEADINGONEPOS:%.*]] = add nsw i32 [[X_MASKED_NUMACTIVEBITS]], -1, !dbg [[DBG231]]
|
||||
; LZCNT-NEXT: [[LOOP_BACKEDGETAKENCOUNT:%.*]] = sub nuw nsw i32 31, [[X_MASKED_LEADINGONEPOS]], !dbg [[DBG231]]
|
||||
; LZCNT-NEXT: [[LOOP_TRIPCOUNT:%.*]] = add nuw nsw i32 [[LOOP_BACKEDGETAKENCOUNT]], 1, !dbg [[DBG231]]
|
||||
; LZCNT-NEXT: [[X_CURR:%.*]] = shl i32 [[X]], [[LOOP_BACKEDGETAKENCOUNT]], !dbg [[DBG231]]
|
||||
; LZCNT-NEXT: [[X_NEXT:%.*]] = shl i32 [[X_CURR]], 1, !dbg [[DBG231]]
|
||||
|
@ -1615,10 +1618,11 @@ end:
|
|||
define i32 @n30(i32 %x) {
|
||||
; LZCNT-LABEL: @n30(
|
||||
; LZCNT-NEXT: entry:
|
||||
; LZCNT-NEXT: [[X_NUMLEADINGZEROS:%.*]] = call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 true), !dbg [[DBG462:![0-9]+]]
|
||||
; LZCNT-NEXT: [[X_NUMACTIVEBITS:%.*]] = sub nuw nsw i32 32, [[X_NUMLEADINGZEROS]], !dbg [[DBG462]]
|
||||
; LZCNT-NEXT: [[X_LEADINGONEPOS:%.*]] = add nsw i32 [[X_NUMACTIVEBITS]], -1, !dbg [[DBG462]]
|
||||
; LZCNT-NEXT: [[LOOP_BACKEDGETAKENCOUNT:%.*]] = sub nuw nsw i32 31, [[X_LEADINGONEPOS]], !dbg [[DBG462]]
|
||||
; LZCNT-NEXT: [[X_MASKED:%.*]] = and i32 [[X:%.*]], -1, !dbg [[DBG462:![0-9]+]]
|
||||
; LZCNT-NEXT: [[X_MASKED_NUMLEADINGZEROS:%.*]] = call i32 @llvm.ctlz.i32(i32 [[X_MASKED]], i1 true), !dbg [[DBG462]]
|
||||
; LZCNT-NEXT: [[X_MASKED_NUMACTIVEBITS:%.*]] = sub nuw nsw i32 32, [[X_MASKED_NUMLEADINGZEROS]], !dbg [[DBG462]]
|
||||
; LZCNT-NEXT: [[X_MASKED_LEADINGONEPOS:%.*]] = add nsw i32 [[X_MASKED_NUMACTIVEBITS]], -1, !dbg [[DBG462]]
|
||||
; LZCNT-NEXT: [[LOOP_BACKEDGETAKENCOUNT:%.*]] = sub nuw nsw i32 31, [[X_MASKED_LEADINGONEPOS]], !dbg [[DBG462]]
|
||||
; LZCNT-NEXT: [[LOOP_TRIPCOUNT:%.*]] = add nuw nsw i32 [[LOOP_BACKEDGETAKENCOUNT]], 1, !dbg [[DBG462]]
|
||||
; LZCNT-NEXT: [[X_CURR:%.*]] = shl i32 [[X]], [[LOOP_BACKEDGETAKENCOUNT]], !dbg [[DBG462]]
|
||||
; LZCNT-NEXT: [[X_NEXT:%.*]] = shl i32 [[X_CURR]], 1, !dbg [[DBG462]]
|
||||
|
|
|
@ -17,12 +17,10 @@ define void @bound_check_partially_known_1(i32 %N) {
|
|||
; CHECK-NEXT: [[SCEVGEP4:%.*]] = getelementptr [[STRUCT_FOO]], %struct.foo* @global, i64 0, i32 0, i64 [[TMP1]]
|
||||
; CHECK-NEXT: [[SCEVGEP45:%.*]] = bitcast double* [[SCEVGEP4]] to i8*
|
||||
; CHECK-NEXT: [[BOUND1:%.*]] = icmp ult i8* bitcast (%struct.foo* @global to i8*), [[SCEVGEP23]]
|
||||
; CHECK-NEXT: [[FOUND_CONFLICT:%.*]] = and i1 false, [[BOUND1]]
|
||||
; CHECK-NEXT: [[BOUND06:%.*]] = icmp ult i8* [[SCEVGEP1]], [[SCEVGEP45]]
|
||||
; CHECK-NEXT: [[BOUND17:%.*]] = icmp ult i8* bitcast (double* getelementptr inbounds ([[STRUCT_FOO]], %struct.foo* @global, i64 0, i32 1, i64 0) to i8*), [[SCEVGEP23]]
|
||||
; CHECK-NEXT: [[FOUND_CONFLICT8:%.*]] = and i1 [[BOUND06]], [[BOUND17]]
|
||||
; CHECK-NEXT: [[CONFLICT_RDX:%.*]] = or i1 [[FOUND_CONFLICT]], [[FOUND_CONFLICT8]]
|
||||
; CHECK-NEXT: br i1 [[CONFLICT_RDX]], label %loop.ph.lver.orig, label %loop.ph
|
||||
; CHECK-NEXT: br i1 [[FOUND_CONFLICT8]], label %loop.ph.lver.orig, label %loop.ph
|
||||
;
|
||||
entry:
|
||||
%N.ext = zext i32 %N to i64
|
||||
|
|
|
@ -3,10 +3,11 @@
|
|||
; CHECK-LABEL: polly.preload.begin:
|
||||
; CHECK-NEXT: %0 = sext i32 %N to i64
|
||||
; CHECK-NEXT: %1 = icmp sge i64 %0, 514
|
||||
; CHECK-NEXT: %polly.preload.cond.result = and i1 %1, true
|
||||
; CHECK-NEXT: br label %polly.preload.cond
|
||||
;
|
||||
; CHECK-LABEL: polly.preload.cond:
|
||||
; CHECK-NEXT: br i1 %1, label %polly.preload.exec, label %polly.preload.merge
|
||||
; CHECK-NEXT: br i1 %polly.preload.cond.result, label %polly.preload.exec, label %polly.preload.merge
|
||||
;
|
||||
; CHECK-LABEL: polly.preload.merge:
|
||||
; CHECK-NEXT: %polly.preload.tmp6.merge = phi i32* [ %polly.access.BPLoc.load, %polly.preload.exec ], [ null, %polly.preload.cond ]
|
||||
|
|
|
@ -12,7 +12,8 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3
|
|||
; CHECK: entry:
|
||||
; CHECK: polly.split_new_and_old:
|
||||
; CHECK: %0 = icmp sge i64 %m, 150
|
||||
; CHECK: br i1 %0, label %polly.start, label %for.i
|
||||
; CHECK: %polly.rtc.result = and i1 %0, true
|
||||
; CHECK: br i1 %polly.rtc.result, label %polly.start, label %for.i
|
||||
|
||||
define void @foo(i64 %n, i64 %m, double* %A) {
|
||||
entry:
|
||||
|
|
|
@ -30,12 +30,13 @@
|
|||
; IR-NEXT: %21 = add nsw i64 %20, %19
|
||||
; IR-NEXT: %22 = icmp sge i64 %21, -2147483648
|
||||
; IR-NEXT: %23 = and i1 %18, %22
|
||||
; IR-NEXT: br label %polly.preload.cond1
|
||||
; IR-NEXT: %polly.preload.cond.result1 = and i1 %23, true
|
||||
; IR-NEXT: br label %polly.preload.cond2
|
||||
;
|
||||
; IR: polly.preload.cond1:
|
||||
; IR-NEXT: br i1 %23
|
||||
; IR: polly.preload.cond2:
|
||||
; IR-NEXT: br i1 %polly.preload.cond.result1
|
||||
;
|
||||
; IR: polly.preload.exec3:
|
||||
; IR: polly.preload.exec4:
|
||||
; IR-NEXT: %polly.access.polly.preload.tmp1.merge = getelementptr i32, i32* %polly.preload.tmp1.merge, i64 0
|
||||
; IR-NEXT: %polly.access.polly.preload.tmp1.merge.load = load i32, i32* %polly.access.polly.preload.tmp1.merge, align 4
|
||||
;
|
||||
|
|
|
@ -15,7 +15,8 @@
|
|||
; CHECK-NEXT: %5 = sext i1 %4 to i64
|
||||
; CHECK-NEXT: %6 = icmp eq i64 0, %5
|
||||
; CHECK-NEXT: %7 = and i1 %2, %6
|
||||
; CHECK-NEXT: br i1 %7, label %polly.start, label %for.body4
|
||||
; CHECK-NEXT: %polly.rtc.result = and i1 %7, true
|
||||
; CHECK-NEXT: br i1 %polly.rtc.result, label %polly.start, label %for.body4
|
||||
|
||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
; Check that without the option `-polly-allow-dereference-of-all-function-parameters`
|
||||
; we do generate the runtime check.
|
||||
; CODE-RTC: polly.preload.cond: ; preds = %polly.preload.begin
|
||||
; CODE-RTC-NEXT: br i1 %{{[a-zA-Z0-9]*}}, label %polly.preload.exec, label %polly.preload.merge
|
||||
; CODE-RTC-NEXT: br i1 %{{[a-zA-Z0-9\.]*}}, label %polly.preload.exec, label %polly.preload.merge
|
||||
|
||||
; Check that we don't generate a runtime check because we treat all
|
||||
; parameters as dereferencable.
|
||||
|
|
|
@ -25,10 +25,11 @@
|
|||
; CODEGEN-NEXT: store i32 %polly.access.I0.load, i32* %loadI1a.preload.s2a
|
||||
; CODEGEN-NEXT: %0 = sext i32 %polly.access.I0.load to i64
|
||||
; CODEGEN-NEXT: %1 = icmp eq i64 %0, 0
|
||||
; CODEGEN-NEXT: %polly.preload.cond.result = and i1 %1, true
|
||||
; CODEGEN-NEXT: br label %polly.preload.cond
|
||||
;
|
||||
; CODEGEN: polly.preload.cond:
|
||||
; CODEGEN-NEXT: br i1 %1, label %polly.preload.exec, label %polly.preload.merge
|
||||
; CODEGEN-NEXT: br i1 %polly.preload.cond.result, label %polly.preload.exec, label %polly.preload.merge
|
||||
;
|
||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
|
||||
|
|
Loading…
Reference in New Issue