1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 12:41:49 +01:00

IR: Make the X / undef -> undef fold match the comment

The constant folding for sdiv and udiv has a big discrepancy between the
comments and the code, which looks like a typo. Currently, we're folding
X / undef pretty inconsistently:

  0 / undef -> undef
  C / undef -> 0
  undef / undef -> 0

Whereas the comments state we do X / undef -> undef. The logic that
returns zero is actually commented as doing undef / X -> 0, despite that
the LHS isn't undef in many of the cases that hit it.

llvm-svn: 261813
This commit is contained in:
Justin Bogner 2016-02-25 01:02:18 +00:00
parent e684ff35db
commit 24f8ffc3c6
2 changed files with 22 additions and 1 deletions

View File

@ -948,7 +948,7 @@ Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode,
case Instruction::SDiv:
case Instruction::UDiv:
// X / undef -> undef
if (match(C1, m_Zero()))
if (isa<UndefValue>(C2))
return C2;
// undef / 0 -> undef
// undef / 1 -> undef

View File

@ -279,3 +279,24 @@ define i32 @test36(i32 %V) {
%b = extractelement <4 x i32> undef, i32 %V
ret i32 %b
}
; CHECK-LABEL: @test37
; CHECK: ret i32 undef
define i32 @test37() {
%b = udiv i32 undef, undef
ret i32 %b
}
; CHECK-LABEL: @test38
; CHECK: ret i32 undef
define i32 @test38(i32 %a) {
%b = udiv i32 %a, undef
ret i32 %b
}
; CHECK-LABEL: @test39
; CHECK: ret i32 undef
define i32 @test39() {
%b = udiv i32 0, undef
ret i32 %b
}