[llvm] 92dc4ff - [ValueTracking] Check for known bits conflict for shl nsw (PR62908)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Wed May 24 01:54:40 PDT 2023
Author: Nikita Popov
Date: 2023-05-24T10:54:10+02:00
New Revision: 92dc4fff87e46d262b7c40b31e2d3fb22211296d
URL: https://github.com/llvm/llvm-project/commit/92dc4fff87e46d262b7c40b31e2d3fb22211296d
DIFF: https://github.com/llvm/llvm-project/commit/92dc4fff87e46d262b7c40b31e2d3fb22211296d.diff
LOG: [ValueTracking] Check for known bits conflict for shl nsw (PR62908)
I removed the conflict check from computeKnownBitsFromShiftOperator()
in D150648 assuming that this is now handled on the KnownBits side.
However, the nsw handling is still inside ValueTracking, so we
still need to handle conflicts there. Restore the check closer to
where it is relevant.
Fixes https://github.com/llvm/llvm-project/issues/62908.
Added:
llvm/test/Transforms/JumpThreading/pr62908.ll
Modified:
llvm/lib/Analysis/ValueTracking.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index 5439419d3f2cc..90dbfcb85fb2c 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -1363,6 +1363,8 @@ static void computeKnownBitsFromOperator(const Operator *I,
Result.Zero.setSignBit();
if (KnownVal.One.isSignBitSet())
Result.One.setSignBit();
+ if (Result.hasConflict())
+ Result.setAllZero();
}
return Result;
};
diff --git a/llvm/test/Transforms/JumpThreading/pr62908.ll b/llvm/test/Transforms/JumpThreading/pr62908.ll
new file mode 100644
index 0000000000000..4c389ee040b90
--- /dev/null
+++ b/llvm/test/Transforms/JumpThreading/pr62908.ll
@@ -0,0 +1,30 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
+; RUN: opt -S -passes=jump-threading < %s | FileCheck %s
+
+; Make sure this does not crash due to conflicting known bits.
+
+define i32 @test() {
+; CHECK-LABEL: define i32 @test() {
+; CHECK-NEXT: end:
+; CHECK-NEXT: ret i32 0
+;
+entry:
+ br label %join
+
+unreachable:
+ %sh_prom = zext i32 -1 to i64
+ %shl = shl nsw i64 -1, %sh_prom
+ %conv = trunc i64 %shl to i32
+ br label %join
+
+join:
+ %phi = phi i32 [ %conv, %unreachable ], [ 0, %entry ]
+ %cmp = icmp eq i32 %phi, 0
+ br i1 %cmp, label %end, label %if
+
+if:
+ br label %end
+
+end:
+ ret i32 0
+}
More information about the llvm-commits
mailing list