mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-26 06:14:42 +00:00
ConstantFold, InstSimplify: undef >>a x can be either -1 or 0, choose 0
Zero is usually a nicer constant to have than -1. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223969 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ea9bcfc707
commit
72c6bdbf70
@ -1422,11 +1422,11 @@ static Value *SimplifyAShrInst(Value *Op0, Value *Op1, bool isExact,
|
||||
if (match(Op0, m_AllOnes()))
|
||||
return Op0;
|
||||
|
||||
// undef >>a X -> all ones
|
||||
// undef >>a X -> 0
|
||||
// undef >>a X -> undef (if it's exact)
|
||||
if (match(Op0, m_Undef()))
|
||||
return isExact ? UndefValue::get(Op0->getType())
|
||||
: Constant::getAllOnesValue(Op0->getType());
|
||||
: Constant::getNullValue(Op0->getType());
|
||||
|
||||
// (X << A) >> A -> X
|
||||
Value *X;
|
||||
|
@ -960,8 +960,9 @@ Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode,
|
||||
// X >>a undef -> undef
|
||||
if (isa<UndefValue>(C2))
|
||||
return C2;
|
||||
// undef >>a X -> all ones
|
||||
return Constant::getAllOnesValue(C1->getType());
|
||||
// TODO: undef >>a X -> undef if the shift is exact
|
||||
// undef >>a X -> 0
|
||||
return Constant::getNullValue(C1->getType());
|
||||
case Instruction::Shl:
|
||||
// X << undef -> undef
|
||||
if (isa<UndefValue>(C2))
|
||||
|
@ -84,14 +84,14 @@ define <4 x i32> @test5a_non_splat_vector(<4 x i32> %A) {
|
||||
|
||||
define i32 @test5b() {
|
||||
; CHECK-LABEL: @test5b(
|
||||
; CHECK: ret i32 -1
|
||||
; CHECK: ret i32 0
|
||||
%B = ashr i32 undef, 2 ;; top two bits must be equal, so not undef
|
||||
ret i32 %B
|
||||
}
|
||||
|
||||
define i32 @test5b2(i32 %A) {
|
||||
; CHECK-LABEL: @test5b2(
|
||||
; CHECK: ret i32 -1
|
||||
; CHECK: ret i32 0
|
||||
%B = ashr i32 undef, %A ;; top %A bits must be equal, so not undef
|
||||
ret i32 %B
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user