|
1 | 1 | ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
2 |
| -; RUN: opt < %s -reassociate -instcombine -S | FileCheck %s |
| 2 | +; RUN: opt < %s -reassociate -S | FileCheck %s |
3 | 3 |
|
4 | 4 | ; Test that we can turn things like X*-(Y*Z) -> X*-1*Y*Z.
|
5 | 5 |
|
@@ -44,3 +44,34 @@ define <2 x i32> @negate_vec_undefs(<2 x i32> %a, <2 x i32> %b, <2 x i32> %z) {
|
44 | 44 | ret <2 x i32> %f
|
45 | 45 | }
|
46 | 46 |
|
| 47 | +; FIXME: Replacing x with a partial undef negation is a miscompile. |
| 48 | + |
| 49 | +define <2 x i32> @PR57683(<2 x i32> %x) { |
| 50 | +; CHECK-LABEL: @PR57683( |
| 51 | +; CHECK-NEXT: [[PARTIAL_NEG:%.*]] = sub <2 x i32> <i32 poison, i32 0>, [[X:%.*]] |
| 52 | +; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <2 x i32> [[PARTIAL_NEG]], <2 x i32> [[X]], <2 x i32> <i32 1, i32 3> |
| 53 | +; CHECK-NEXT: [[SUB:%.*]] = add <2 x i32> [[PARTIAL_NEG]], <i32 1, i32 1> |
| 54 | +; CHECK-NEXT: [[R:%.*]] = add <2 x i32> [[SUB]], [[SHUF]] |
| 55 | +; CHECK-NEXT: ret <2 x i32> [[R]] |
| 56 | +; |
| 57 | + %partial_neg = sub <2 x i32> <i32 poison, i32 0>, %x |
| 58 | + %shuf = shufflevector <2 x i32> %partial_neg, <2 x i32> %x, <2 x i32> <i32 1, i32 3> |
| 59 | + %sub = sub <2 x i32> <i32 1, i32 1>, %x |
| 60 | + %r = add <2 x i32> %sub, %shuf |
| 61 | + ret <2 x i32> %r |
| 62 | +} |
| 63 | + |
| 64 | +define <2 x float> @PR57683_FP(<2 x float> %x) { |
| 65 | +; CHECK-LABEL: @PR57683_FP( |
| 66 | +; CHECK-NEXT: [[PARTIAL_NEG:%.*]] = fsub reassoc nsz <2 x float> <float poison, float 0.000000e+00>, [[X:%.*]] |
| 67 | +; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <2 x float> [[PARTIAL_NEG]], <2 x float> [[X]], <2 x i32> <i32 1, i32 3> |
| 68 | +; CHECK-NEXT: [[SUB:%.*]] = fadd reassoc nsz <2 x float> [[PARTIAL_NEG]], <float 1.000000e+00, float 1.000000e+00> |
| 69 | +; CHECK-NEXT: [[R:%.*]] = fadd reassoc nsz <2 x float> [[SUB]], [[SHUF]] |
| 70 | +; CHECK-NEXT: ret <2 x float> [[R]] |
| 71 | +; |
| 72 | + %partial_neg = fsub reassoc nsz <2 x float> <float poison, float 0.0>, %x |
| 73 | + %shuf = shufflevector <2 x float> %partial_neg, <2 x float> %x, <2 x i32> <i32 1, i32 3> |
| 74 | + %sub = fsub reassoc nsz <2 x float> <float 1.0, float 1.0>, %x |
| 75 | + %r = fadd reassoc nsz <2 x float> %sub, %shuf |
| 76 | + ret <2 x float> %r |
| 77 | +} |
0 commit comments