diff --git a/llvm/test/Transforms/Reassociate/negation.ll b/llvm/test/Transforms/Reassociate/negation.ll index f443083ff3f112..d66cf87f1c7f2f 100644 --- a/llvm/test/Transforms/Reassociate/negation.ll +++ b/llvm/test/Transforms/Reassociate/negation.ll @@ -1,5 +1,5 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt < %s -reassociate -instcombine -S | FileCheck %s +; RUN: opt < %s -reassociate -S | FileCheck %s ; Test that we can turn things like X*-(Y*Z) -> X*-1*Y*Z. @@ -44,3 +44,34 @@ define <2 x i32> @negate_vec_undefs(<2 x i32> %a, <2 x i32> %b, <2 x i32> %z) { ret <2 x i32> %f } +; FIXME: Replacing x with a partial undef negation is a miscompile. + +define <2 x i32> @PR57683(<2 x i32> %x) { +; CHECK-LABEL: @PR57683( +; CHECK-NEXT: [[PARTIAL_NEG:%.*]] = sub <2 x i32> , [[X:%.*]] +; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <2 x i32> [[PARTIAL_NEG]], <2 x i32> [[X]], <2 x i32> +; CHECK-NEXT: [[SUB:%.*]] = add <2 x i32> [[PARTIAL_NEG]], +; CHECK-NEXT: [[R:%.*]] = add <2 x i32> [[SUB]], [[SHUF]] +; CHECK-NEXT: ret <2 x i32> [[R]] +; + %partial_neg = sub <2 x i32> , %x + %shuf = shufflevector <2 x i32> %partial_neg, <2 x i32> %x, <2 x i32> + %sub = sub <2 x i32> , %x + %r = add <2 x i32> %sub, %shuf + ret <2 x i32> %r +} + +define <2 x float> @PR57683_FP(<2 x float> %x) { +; CHECK-LABEL: @PR57683_FP( +; CHECK-NEXT: [[PARTIAL_NEG:%.*]] = fsub reassoc nsz <2 x float> , [[X:%.*]] +; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <2 x float> [[PARTIAL_NEG]], <2 x float> [[X]], <2 x i32> +; CHECK-NEXT: [[SUB:%.*]] = fadd reassoc nsz <2 x float> [[PARTIAL_NEG]], +; CHECK-NEXT: [[R:%.*]] = fadd reassoc nsz <2 x float> [[SUB]], [[SHUF]] +; CHECK-NEXT: ret <2 x float> [[R]] +; + %partial_neg = fsub reassoc nsz <2 x float> , %x + %shuf = shufflevector <2 x float> %partial_neg, <2 x float> %x, <2 x i32> + %sub = fsub reassoc nsz <2 x float> , %x + %r = fadd reassoc nsz <2 x float> %sub, %shuf + ret <2 x float> %r +}