[llvm] 534f856 - [InstCombine] Don't preserve context across div
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 17 06:39:11 PDT 2024
Author: Nikita Popov
Date: 2024-06-17T15:38:59+02:00
New Revision: 534f8569a3c9fccfd5cbc5f632b63ad0cf711098
URL: https://github.com/llvm/llvm-project/commit/534f8569a3c9fccfd5cbc5f632b63ad0cf711098
DIFF: https://github.com/llvm/llvm-project/commit/534f8569a3c9fccfd5cbc5f632b63ad0cf711098.diff
LOG: [InstCombine] Don't preserve context across div
We can't preserve the context across a non-speculatable instruction,
as this might introduce a trap. Alternatively, we could also
insert all the replacement instruction at the use-site, but that
would be a more intrusive change for the sake of this edge case.
Fixes https://github.com/llvm/llvm-project/issues/95547.
Added:
Modified:
llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
llvm/test/Transforms/InstCombine/trunc.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
index 1b4c319032cab..6a6bdba3fa70a 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
@@ -291,10 +291,12 @@ static bool canEvaluateTruncated(Value *V, Type *Ty, InstCombinerImpl &IC,
uint32_t BitWidth = Ty->getScalarSizeInBits();
assert(BitWidth < OrigBitWidth && "Unexpected bitwidths!");
APInt Mask = APInt::getBitsSetFrom(OrigBitWidth, BitWidth);
- if (IC.MaskedValueIsZero(I->getOperand(0), Mask, 0, CxtI) &&
- IC.MaskedValueIsZero(I->getOperand(1), Mask, 0, CxtI)) {
- return canEvaluateTruncated(I->getOperand(0), Ty, IC, CxtI) &&
- canEvaluateTruncated(I->getOperand(1), Ty, IC, CxtI);
+ // Do not preserve the original context instruction. Simplifying div/rem
+ // based on later context may introduce a trap.
+ if (IC.MaskedValueIsZero(I->getOperand(0), Mask, 0, I) &&
+ IC.MaskedValueIsZero(I->getOperand(1), Mask, 0, I)) {
+ return canEvaluateTruncated(I->getOperand(0), Ty, IC, I) &&
+ canEvaluateTruncated(I->getOperand(1), Ty, IC, I);
}
break;
}
diff --git a/llvm/test/Transforms/InstCombine/trunc.ll b/llvm/test/Transforms/InstCombine/trunc.ll
index 32e3a5d1f7691..0956fc655ec9a 100644
--- a/llvm/test/Transforms/InstCombine/trunc.ll
+++ b/llvm/test/Transforms/InstCombine/trunc.ll
@@ -1097,15 +1097,15 @@ define <2 x i1> @trunc_nuw_xor_vector(<2 x i8> %x, <2 x i8> %y) {
ret <2 x i1> %r
}
-; FIXME: This is a miscompile.
define void @pr95547(i32 %x) {
; CHECK-LABEL: @pr95547(
-; CHECK-NEXT: [[X_TRUNC:%.*]] = trunc i32 [[X:%.*]] to i8
-; CHECK-NEXT: [[DIV:%.*]] = udiv i8 11, [[X_TRUNC]]
+; CHECK-NEXT: [[X_TRUNC:%.*]] = trunc i32 [[X:%.*]] to i16
+; CHECK-NEXT: [[DIV:%.*]] = udiv i16 11, [[X_TRUNC]]
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[X]], 256
; CHECK-NEXT: br i1 [[CMP]], label [[LOOP:%.*]], label [[EXIT:%.*]]
; CHECK: loop:
-; CHECK-NEXT: call void @use.i8(i8 [[DIV]])
+; CHECK-NEXT: [[TRUNC:%.*]] = trunc nuw nsw i16 [[DIV]] to i8
+; CHECK-NEXT: call void @use.i8(i8 [[TRUNC]])
; CHECK-NEXT: br label [[LOOP]]
; CHECK: exit:
; CHECK-NEXT: ret void
More information about the llvm-commits
mailing list