diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp index 8701f7c28a39f..70f2997f2c2ad 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp @@ -610,8 +610,13 @@ static Value *foldLogOpOfMaskedICmps(Value *LHS, Value *RHS, bool IsAnd, APInt NewMask = *ConstB & *ConstD; if (NewMask == *ConstB) return LHS; - if (NewMask == *ConstD) + if (NewMask == *ConstD) { + if (IsLogical) { + if (auto *RHSI = dyn_cast(RHS)) + RHSI->dropPoisonGeneratingFlags(); + } return RHS; + } } if (Mask & AMask_NotAllOnes) { diff --git a/llvm/test/Transforms/InstCombine/sign-test-and-or.ll b/llvm/test/Transforms/InstCombine/sign-test-and-or.ll index 65363620563be..3e9ff63869d64 100644 --- a/llvm/test/Transforms/InstCombine/sign-test-and-or.ll +++ b/llvm/test/Transforms/InstCombine/sign-test-and-or.ll @@ -349,6 +349,29 @@ define i1 @test9_logical(i32 %a) { ret i1 %or.cond } +define i1 @test9_logical_samesign(i32 %a) { +; CHECK-LABEL: @test9_logical_samesign( +; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i32 [[A:%.*]], -1 +; CHECK-NEXT: ret i1 [[CMP2]] +; + %masked = and i32 %a, -1073741825 + %cmp1 = icmp eq i32 %masked, 0 + %cmp2 = icmp samesign sgt i32 %a, -1 + %or.cond = select i1 %cmp1, i1 true, i1 %cmp2 + ret i1 %or.cond +} + +define i1 @test_logical_or_icmp_icmp_samesign(i32 %a) { +; CHECK-LABEL: @test_logical_or_icmp_icmp_samesign( +; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i32 [[A:%.*]], -1 +; CHECK-NEXT: ret i1 [[CMP2]] +; + %cmp1 = icmp eq i32 %a, 0 + %cmp2 = icmp samesign sgt i32 %a, -1 + %or = select i1 %cmp1, i1 true, i1 %cmp2 + ret i1 %or +} + define i1 @test10(i32 %a) { ; CHECK-LABEL: @test10( ; CHECK-NEXT: [[OR_COND:%.*]] = icmp ult i32 [[A:%.*]], 2