Skip to content

Commit 5843911

Browse files
author
Nimit Sachdeva
committed
add multi use tests
1 parent 501a574 commit 5843911

File tree

2 files changed

+59
-1
lines changed

2 files changed

+59
-1
lines changed

llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
#include "llvm/Support/KnownBits.h"
4343
#include "llvm/Transforms/InstCombine/InstCombiner.h"
4444
#include <cassert>
45+
#include <cstddef>
4546
#include <utility>
4647

4748
#define DEBUG_TYPE "instcombine"
@@ -2007,6 +2008,8 @@ Value *InstCombinerImpl::foldSelectWithConstOpToBinOp(ICmpInst *Cmp,
20072008
/// Likewise, for vector arguments as well.
20082009
static Instruction *foldICmpUSubSatWithAndForMostSignificantBitCmp(
20092010
SelectInst &SI, ICmpInst *ICI, InstCombiner::BuilderTy &Builder) {
2011+
if (!SI.hasOneUse() || !ICI->hasOneUse())
2012+
return nullptr;
20102013
CmpPredicate Pred;
20112014
Value *A, *B;
20122015
const APInt *Constant1, *Constant2;
@@ -2320,7 +2323,7 @@ foldOverflowingAddSubSelect(SelectInst &SI, InstCombiner::BuilderTy &Builder) {
23202323
// X + Y overflows ? (X <s 0 ? INTMIN : INTMAX) : X + Y --> sadd_sat X, Y
23212324
// X + Y overflows ? (X <s 1 ? INTMIN : INTMAX) : X + Y --> sadd_sat X, Y
23222325
// X + Y overflows ? (X >s 0 ? INTMAX : INTMIN) : X + Y --> sadd_sat X, Y
2323-
// X + Y overflows ? (X >s -1 ? INTMAX : INTMIN) : X + Y --> sadd_sat X, Y
2326+
// X + Y overflows ? (X >s -1 ? INTMAX : INTMIN) : X + Y --> sadd_sat X, Yf
23242327
// X + Y overflows ? (Y <s 0 ? INTMIN : INTMAX) : X + Y --> sadd_sat X, Y
23252328
// X + Y overflows ? (Y <s 1 ? INTMIN : INTMAX) : X + Y --> sadd_sat X, Y
23262329
// X + Y overflows ? (Y >s 0 ? INTMAX : INTMIN) : X + Y --> sadd_sat X, Y

llvm/test/Transforms/InstCombine/usub_sat_to_msb_mask.ll

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,3 +197,58 @@ define <4 x i32> @vector_ne_test(<4 x i32> %a, <4 x i32> %b) {
197197
<4 x i32> splat (i32 -2147483648)
198198
ret <4 x i32> %res
199199
}
200+
201+
declare i1 @id_i1(i1)
202+
203+
204+
define i1 @multi_use_icmp(i32 %a, i32 %b) {
205+
; CHECK-LABEL: define i1 @multi_use_icmp(
206+
; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
207+
; CHECK-NEXT: [[A_SUB:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[A]], i32 5)
208+
; CHECK-NEXT: [[B_SUB:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[B]], i32 7)
209+
; CHECK-NEXT: [[OR:%.*]] = or i32 [[A_SUB]], [[B_SUB]]
210+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[OR]], 0
211+
; CHECK-NEXT: [[CMP_OPAQUE:%.*]] = call i1 @id_i1(i1 [[CMP]])
212+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i32 0, i32 -2147483648
213+
; CHECK-NEXT: [[EXTRA:%.*]] = xor i1 [[CMP_OPAQUE]], true
214+
; CHECK-NEXT: [[SEL_OPAQUE:%.*]] = call i32 @id_i32(i32 [[SEL]])
215+
; CHECK-NEXT: [[SEL_NZ:%.*]] = icmp ne i32 [[SEL_OPAQUE]], 0
216+
; CHECK-NEXT: [[R:%.*]] = and i1 [[SEL_NZ]], [[EXTRA]]
217+
; CHECK-NEXT: ret i1 [[R]]
218+
;
219+
%a_sub = call i32 @llvm.usub.sat.i32(i32 %a, i32 5)
220+
%b_sub = call i32 @llvm.usub.sat.i32(i32 %b, i32 7)
221+
%or = or i32 %a_sub, %b_sub
222+
%cmp = icmp eq i32 %or, 0
223+
%cmp_opaque = call i1 @id_i1(i1 %cmp)
224+
%sel = select i1 %cmp, i32 0, i32 -2147483648
225+
%extra = xor i1 %cmp_opaque, true
226+
%sel_opaque = call i32 @id_i32(i32 %sel)
227+
%sel_is_nonzero = icmp ne i32 %sel_opaque, 0
228+
%r = and i1 %extra, %sel_is_nonzero
229+
ret i1 %r
230+
}
231+
232+
233+
declare i32 @id_i32(i32)
234+
235+
define i32 @multi_use_select(i32 %a, i32 %b) {
236+
; CHECK-LABEL: define i32 @multi_use_select(
237+
; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
238+
; CHECK-NEXT: [[A_SUB:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[A]], i32 224)
239+
; CHECK-NEXT: [[B_SUB:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[B]], i32 240)
240+
; CHECK-NEXT: [[OR:%.*]] = or i32 [[A_SUB]], [[B_SUB]]
241+
; CHECK-NEXT: [[SEL:%.*]] = and i32 [[OR]], -2147483648
242+
; CHECK-NEXT: [[SEL_OPAQUE:%.*]] = call i32 @id_i32(i32 [[SEL]])
243+
; CHECK-NEXT: ret i32 [[SEL_OPAQUE]]
244+
;
245+
%a_sub = call i32 @llvm.usub.sat.i32(i32 %a, i32 -2147483425)
246+
%b_sub = call i32 @llvm.usub.sat.i32(i32 %b, i32 -2147483409)
247+
%or = or i32 %a_sub, %b_sub
248+
%cmp = icmp eq i32 %or, 0
249+
%sel = select i1 %cmp, i32 0, i32 -2147483648
250+
%sel_opaque = call i32 @id_i32(i32 %sel)
251+
ret i32 %sel_opaque
252+
}
253+
254+

0 commit comments

Comments
 (0)