@@ -96,8 +96,8 @@ define i64 @test_sdiv_canonicalize_constexpr(i64 %L1) {
96
96
97
97
define i32 @sdiv_abs_nsw (i32 %x ) {
98
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]]
99
+ ; CHECK-NEXT: [[DOTINV :%.*]] = icmp sgt i32 [[X:%.*]], -1
100
+ ; CHECK-NEXT: [[R:%.*]] = select i1 [[DOTINV ]], i32 1, i32 -1
101
101
; CHECK-NEXT: ret i32 [[R]]
102
102
;
103
103
%a = call i32 @llvm.abs.i32 (i32 %x , i1 true )
@@ -107,15 +107,17 @@ define i32 @sdiv_abs_nsw(i32 %x) {
107
107
108
108
define <4 x i32 > @sdiv_abs_nsw_vec (<4 x i32 > %x ) {
109
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]]
110
+ ; CHECK-NEXT: [[DOTINV :%.*]] = icmp sgt <4 x i32> [[X:%.*]], <i32 -1, i32 -1, i32 -1, i32 -1>
111
+ ; CHECK-NEXT: [[R:%.*]] = select <4 x i1 > [[DOTINV ]], <4 x i32> <i32 1, i32 1, i32 1, i32 1>, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>
112
112
; CHECK-NEXT: ret <4 x i32> [[R]]
113
113
;
114
114
%a = call <4 x i32 > @llvm.abs.v4i32 (<4 x i32 > %x , i1 true )
115
115
%r = sdiv <4 x i32 > %x , %a
116
116
ret <4 x i32 > %r
117
117
}
118
118
119
+ ; Negative test - requires poison int min (nsw)
120
+
119
121
define i32 @sdiv_abs (i32 %x ) {
120
122
; CHECK-LABEL: @sdiv_abs(
121
123
; CHECK-NEXT: [[A:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
@@ -127,6 +129,8 @@ define i32 @sdiv_abs(i32 %x) {
127
129
ret i32 %r
128
130
}
129
131
132
+ ; Negative test
133
+
130
134
define i32 @sdiv_abs_extra_use (i32 %x ) {
131
135
; CHECK-LABEL: @sdiv_abs_extra_use(
132
136
; CHECK-NEXT: [[A:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
0 commit comments