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
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
%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
+}