forked from OSchip/llvm-project
ConstantFold: Shifting undef by zero results in undef
llvm-svn: 224553
This commit is contained in:
parent
174476ed96
commit
824e011ad7
|
@ -956,12 +956,18 @@ Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode,
|
|||
// X >>l undef -> undef
|
||||
if (isa<UndefValue>(C2))
|
||||
return C2;
|
||||
// undef >>l 0 -> undef
|
||||
if (match(C2, m_Zero()))
|
||||
return C1;
|
||||
// undef >>l X -> 0
|
||||
return Constant::getNullValue(C1->getType());
|
||||
case Instruction::AShr:
|
||||
// X >>a undef -> undef
|
||||
if (isa<UndefValue>(C2))
|
||||
return C2;
|
||||
// undef >>a 0 -> undef
|
||||
if (match(C2, m_Zero()))
|
||||
return C1;
|
||||
// TODO: undef >>a X -> undef if the shift is exact
|
||||
// undef >>a X -> 0
|
||||
return Constant::getNullValue(C1->getType());
|
||||
|
@ -969,6 +975,9 @@ Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode,
|
|||
// X << undef -> undef
|
||||
if (isa<UndefValue>(C2))
|
||||
return C2;
|
||||
// undef << 0 -> undef
|
||||
if (match(C2, m_Zero()))
|
||||
return C1;
|
||||
// undef << X -> 0
|
||||
return Constant::getNullValue(C1->getType());
|
||||
}
|
||||
|
|
|
@ -244,3 +244,24 @@ define i32 @test31(i32 %a) {
|
|||
%b = shl i32 undef, %a
|
||||
ret i32 %b
|
||||
}
|
||||
|
||||
; CHECK-LABEL: @test32
|
||||
; CHECK: ret i32 undef
|
||||
define i32 @test32(i32 %a) {
|
||||
%b = shl i32 undef, 0
|
||||
ret i32 %b
|
||||
}
|
||||
|
||||
; CHECK-LABEL: @test33
|
||||
; CHECK: ret i32 undef
|
||||
define i32 @test33(i32 %a) {
|
||||
%b = ashr i32 undef, 0
|
||||
ret i32 %b
|
||||
}
|
||||
|
||||
; CHECK-LABEL: @test34
|
||||
; CHECK: ret i32 undef
|
||||
define i32 @test34(i32 %a) {
|
||||
%b = lshr i32 undef, 0
|
||||
ret i32 %b
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue