|
1 | 1 | ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
2 | 2 | ; RUN: opt < %s -instcombine -S | FileCheck %s
|
3 | 3 |
|
| 4 | +declare void @use(i32) |
| 5 | +declare i32 @llvm.abs.i32(i32, i1) |
| 6 | +declare <4 x i32> @llvm.abs.v4i32(<4 x i32>, i1) |
| 7 | + |
4 | 8 | define i32 @test_sdiv_canonicalize_op0(i32 %x, i32 %y) {
|
5 | 9 | ; CHECK-LABEL: @test_sdiv_canonicalize_op0(
|
6 | 10 | ; CHECK-NEXT: [[SDIV1:%.*]] = sdiv i32 [[X:%.*]], [[Y:%.*]]
|
@@ -89,3 +93,49 @@ define i64 @test_sdiv_canonicalize_constexpr(i64 %L1) {
|
89 | 93 | %B4 = sdiv i64 %L1, %B8
|
90 | 94 | ret i64 %B4
|
91 | 95 | }
|
| 96 | + |
| 97 | +define i32 @sdiv_abs_nsw(i32 %x) { |
| 98 | +; CHECK-LABEL: @sdiv_abs_nsw( |
| 99 | +; CHECK-NEXT: [[A:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true) |
| 100 | +; CHECK-NEXT: [[R:%.*]] = sdiv i32 [[A]], [[X]] |
| 101 | +; CHECK-NEXT: ret i32 [[R]] |
| 102 | +; |
| 103 | + %a = call i32 @llvm.abs.i32(i32 %x, i1 true) |
| 104 | + %r = sdiv i32 %a, %x |
| 105 | + ret i32 %r |
| 106 | +} |
| 107 | + |
| 108 | +define <4 x i32> @sdiv_abs_nsw_vec(<4 x i32> %x) { |
| 109 | +; CHECK-LABEL: @sdiv_abs_nsw_vec( |
| 110 | +; CHECK-NEXT: [[A:%.*]] = call <4 x i32> @llvm.abs.v4i32(<4 x i32> [[X:%.*]], i1 true) |
| 111 | +; CHECK-NEXT: [[R:%.*]] = sdiv <4 x i32> [[X]], [[A]] |
| 112 | +; CHECK-NEXT: ret <4 x i32> [[R]] |
| 113 | +; |
| 114 | + %a = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %x, i1 true) |
| 115 | + %r = sdiv <4 x i32> %x, %a |
| 116 | + ret <4 x i32> %r |
| 117 | +} |
| 118 | + |
| 119 | +define i32 @sdiv_abs(i32 %x) { |
| 120 | +; CHECK-LABEL: @sdiv_abs( |
| 121 | +; CHECK-NEXT: [[A:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false) |
| 122 | +; CHECK-NEXT: [[R:%.*]] = sdiv i32 [[A]], [[X]] |
| 123 | +; CHECK-NEXT: ret i32 [[R]] |
| 124 | +; |
| 125 | + %a = call i32 @llvm.abs.i32(i32 %x, i1 false) |
| 126 | + %r = sdiv i32 %a, %x |
| 127 | + ret i32 %r |
| 128 | +} |
| 129 | + |
| 130 | +define i32 @sdiv_abs_extra_use(i32 %x) { |
| 131 | +; CHECK-LABEL: @sdiv_abs_extra_use( |
| 132 | +; CHECK-NEXT: [[A:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true) |
| 133 | +; CHECK-NEXT: call void @use(i32 [[A]]) |
| 134 | +; CHECK-NEXT: [[R:%.*]] = sdiv i32 [[A]], [[X]] |
| 135 | +; CHECK-NEXT: ret i32 [[R]] |
| 136 | +; |
| 137 | + %a = call i32 @llvm.abs.i32(i32 %x, i1 true) |
| 138 | + call void @use(i32 %a) |
| 139 | + %r = sdiv i32 %a, %x |
| 140 | + ret i32 %r |
| 141 | +} |
0 commit comments