[llvm] ff76627 - [InstCombine] Fix type mismatch between cond and value in `foldSelectToCopysign` (#76343)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 25 08:04:10 PST 2023
Author: Yingwei Zheng
Date: 2023-12-26T00:04:06+08:00
New Revision: ff76627aeb8d431d5451201d656bb38318908f0a
URL: https://github.com/llvm/llvm-project/commit/ff76627aeb8d431d5451201d656bb38318908f0a
DIFF: https://github.com/llvm/llvm-project/commit/ff76627aeb8d431d5451201d656bb38318908f0a.diff
LOG: [InstCombine] Fix type mismatch between cond and value in `foldSelectToCopysign` (#76343)
This patch fixes the miscompilation when we try to bitcast a floating point vector into an integer scalar.
Added:
Modified:
llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
llvm/test/Transforms/InstCombine/select.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
index 20bf00344b144b..3c6ce450c5bcfa 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
@@ -2363,6 +2363,9 @@ static Instruction *foldSelectToCopysign(SelectInst &Sel,
Value *FVal = Sel.getFalseValue();
Type *SelType = Sel.getType();
+ if (ICmpInst::makeCmpResultType(TVal->getType()) != Cond->getType())
+ return nullptr;
+
// Match select ?, TC, FC where the constants are equal but negated.
// TODO: Generalize to handle a negated variable operand?
const APFloat *TC, *FC;
diff --git a/llvm/test/Transforms/InstCombine/select.ll b/llvm/test/Transforms/InstCombine/select.ll
index 7583a75385a769..94aa012f868015 100644
--- a/llvm/test/Transforms/InstCombine/select.ll
+++ b/llvm/test/Transforms/InstCombine/select.ll
@@ -1735,6 +1735,21 @@ define float @copysign_type_mismatch(double %x) {
; Negative test
+define <2 x float> @copysign_type_mismatch2(<2 x float> %x) {
+; CHECK-LABEL: @copysign_type_mismatch2(
+; CHECK-NEXT: [[I:%.*]] = bitcast <2 x float> [[X:%.*]] to i64
+; CHECK-NEXT: [[ISPOS:%.*]] = icmp sgt i64 [[I]], -1
+; CHECK-NEXT: [[R:%.*]] = select i1 [[ISPOS]], <2 x float> <float 1.000000e+00, float 1.000000e+00>, <2 x float> <float -1.000000e+00, float -1.000000e+00>
+; CHECK-NEXT: ret <2 x float> [[R]]
+;
+ %i = bitcast <2 x float> %x to i64
+ %ispos = icmp sgt i64 %i, -1
+ %r = select i1 %ispos, <2 x float> <float 1.0, float 1.0>, <2 x float> <float -1.0, float -1.0>
+ ret <2 x float> %r
+}
+
+; Negative test
+
define float @copysign_wrong_cmp(float %x) {
; CHECK-LABEL: @copysign_wrong_cmp(
; CHECK-NEXT: [[I:%.*]] = bitcast float [[X:%.*]] to i32
More information about the llvm-commits
mailing list