[llvm] r365538 - [PoisonChecking] Add validation rules for "exact" on sdiv/udiv
Philip Reames via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 9 11:56:41 PDT 2019
Author: reames
Date: Tue Jul 9 11:56:41 2019
New Revision: 365538
URL: http://llvm.org/viewvc/llvm-project?rev=365538&view=rev
Log:
[PoisonChecking] Add validation rules for "exact" on sdiv/udiv
As directly stated in the LangRef, no ambiguity here...
Modified:
llvm/trunk/lib/Transforms/Instrumentation/PoisonChecking.cpp
llvm/trunk/test/Instrumentation/PoisonChecking/basic-flag-validation.ll
Modified: llvm/trunk/lib/Transforms/Instrumentation/PoisonChecking.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/PoisonChecking.cpp?rev=365538&r1=365537&r2=365538&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Instrumentation/PoisonChecking.cpp (original)
+++ llvm/trunk/lib/Transforms/Instrumentation/PoisonChecking.cpp Tue Jul 9 11:56:41 2019
@@ -151,6 +151,24 @@ static void generatePoisonChecksForBinOp
}
break;
}
+ case Instruction::UDiv: {
+ if (I.isExact()) {
+ auto *Check =
+ B.CreateICmp(ICmpInst::ICMP_NE, B.CreateURem(LHS, RHS),
+ ConstantInt::get(LHS->getType(), 0));
+ Checks.push_back(Check);
+ }
+ break;
+ }
+ case Instruction::SDiv: {
+ if (I.isExact()) {
+ auto *Check =
+ B.CreateICmp(ICmpInst::ICMP_NE, B.CreateSRem(LHS, RHS),
+ ConstantInt::get(LHS->getType(), 0));
+ Checks.push_back(Check);
+ }
+ break;
+ }
};
}
Modified: llvm/trunk/test/Instrumentation/PoisonChecking/basic-flag-validation.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/PoisonChecking/basic-flag-validation.ll?rev=365538&r1=365537&r2=365538&view=diff
==============================================================================
--- llvm/trunk/test/Instrumentation/PoisonChecking/basic-flag-validation.ll (original)
+++ llvm/trunk/test/Instrumentation/PoisonChecking/basic-flag-validation.ll Tue Jul 9 11:56:41 2019
@@ -156,3 +156,46 @@ define i32 @mul_nsw_nuw(i32 %a, i32 %b)
ret i32 %res
}
+define i32 @sdiv_noflags(i32 %a, i32 %b) {
+; CHECK-LABEL: @sdiv_noflags(
+; CHECK-NEXT: [[RES:%.*]] = sdiv i32 [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT: ret i32 [[RES]]
+;
+ %res = sdiv i32 %a, %b
+ ret i32 %res
+}
+
+define i32 @sdiv_exact(i32 %a, i32 %b) {
+; CHECK-LABEL: @sdiv_exact(
+; CHECK-NEXT: [[TMP1:%.*]] = srem i32 [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
+; CHECK-NEXT: [[RES:%.*]] = sdiv exact i32 [[A]], [[B]]
+; CHECK-NEXT: [[TMP3:%.*]] = xor i1 [[TMP2]], true
+; CHECK-NEXT: call void @__poison_checker_assert(i1 [[TMP3]])
+; CHECK-NEXT: ret i32 [[RES]]
+;
+ %res = sdiv exact i32 %a, %b
+ ret i32 %res
+}
+
+define i32 @udiv_noflags(i32 %a, i32 %b) {
+; CHECK-LABEL: @udiv_noflags(
+; CHECK-NEXT: [[RES:%.*]] = udiv i32 [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT: ret i32 [[RES]]
+;
+ %res = udiv i32 %a, %b
+ ret i32 %res
+}
+
+define i32 @udiv_exact(i32 %a, i32 %b) {
+; CHECK-LABEL: @udiv_exact(
+; CHECK-NEXT: [[TMP1:%.*]] = urem i32 [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
+; CHECK-NEXT: [[RES:%.*]] = udiv exact i32 [[A]], [[B]]
+; CHECK-NEXT: [[TMP3:%.*]] = xor i1 [[TMP2]], true
+; CHECK-NEXT: call void @__poison_checker_assert(i1 [[TMP3]])
+; CHECK-NEXT: ret i32 [[RES]]
+;
+ %res = udiv exact i32 %a, %b
+ ret i32 %res
+}
More information about the llvm-commits
mailing list