diff --git a/lib/Target/README.txt b/lib/Target/README.txt index c64d7e0e6e6..2c120896996 100644 --- a/lib/Target/README.txt +++ b/lib/Target/README.txt @@ -780,3 +780,29 @@ be done safely if "b" isn't modified between the strlen and memcpy of course. //===---------------------------------------------------------------------===// +define i32 @test2(float %X, float %Y) { +entry: + %tmp3 = fcmp uno float %X, %Y ; [#uses=1] + %tmp34 = zext i1 %tmp3 to i8 ; [#uses=1] + %tmp = xor i8 %tmp34, 1 ; [#uses=1] + %toBoolnot5 = zext i8 %tmp to i32 ; [#uses=1] + ret i32 %toBoolnot5 +} + +could be optimized further. Instcombine should use its bitwise analysis to +collapse the zext/xor/zext structure to an xor/zext and then remove the +xor by reversing the fcmp. + +Desired output: + +define i32 @test2(float %X, float %Y) { +entry: + %tmp3 = fcmp ord float %X, %Y ; [#uses=1] + %tmp34 = zext i1 %tmp3 to i32 ; [#uses=1] + ret i32 %tmp34 +} + +To fix this, we need to make CanEvaluateInDifferentType smarter. + +//===---------------------------------------------------------------------===// +