Skip to content

Commit f7e238b

Browse files
committed
[ValueTracking] Add rotate idiom to haveNoCommonBitsSet special cases
1 parent 6d98d2a commit f7e238b

File tree

2 files changed

+21
-8
lines changed

2 files changed

+21
-8
lines changed

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,19 @@ static bool haveNoCommonBitsSetSpecialCases(const Value *LHS, const Value *RHS,
229229
return true;
230230
}
231231

232+
// Look for: (X << V) op (Y >> (BitWidth - V))
233+
// or (X >> V) op (Y << (BitWidth - V))
234+
{
235+
const Value *V;
236+
const APInt *R;
237+
if (((match(RHS, m_Shl(m_Value(), m_Sub(m_APInt(R), m_Value(V)))) &&
238+
match(LHS, m_LShr(m_Value(), m_Specific(V)))) ||
239+
(match(RHS, m_LShr(m_Value(), m_Sub(m_APInt(R), m_Value(V)))) &&
240+
match(LHS, m_Shl(m_Value(), m_Specific(V))))) &&
241+
R->uge(LHS->getType()->getScalarType()->getIntegerBitWidth()))
242+
return true;
243+
}
244+
232245
return false;
233246
}
234247

llvm/test/Transforms/InstCombine/rotate.ll

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ define i32 @rotl_i32(i32 %x, i32 %y) {
191191
; CHECK-NEXT: [[SUB:%.*]] = sub i32 32, [[Y:%.*]]
192192
; CHECK-NEXT: [[SHL:%.*]] = shl i32 [[X:%.*]], [[Y]]
193193
; CHECK-NEXT: [[SHR:%.*]] = lshr i32 [[X]], [[SUB]]
194-
; CHECK-NEXT: [[R:%.*]] = or i32 [[SHR]], [[SHL]]
194+
; CHECK-NEXT: [[R:%.*]] = or disjoint i32 [[SHR]], [[SHL]]
195195
; CHECK-NEXT: ret i32 [[R]]
196196
;
197197
%sub = sub i32 32, %y
@@ -208,7 +208,7 @@ define i37 @rotr_i37(i37 %x, i37 %y) {
208208
; CHECK-NEXT: [[SUB:%.*]] = sub i37 37, [[Y:%.*]]
209209
; CHECK-NEXT: [[SHL:%.*]] = shl i37 [[X:%.*]], [[SUB]]
210210
; CHECK-NEXT: [[SHR:%.*]] = lshr i37 [[X]], [[Y]]
211-
; CHECK-NEXT: [[R:%.*]] = or i37 [[SHR]], [[SHL]]
211+
; CHECK-NEXT: [[R:%.*]] = or disjoint i37 [[SHR]], [[SHL]]
212212
; CHECK-NEXT: ret i37 [[R]]
213213
;
214214
%sub = sub i37 37, %y
@@ -225,7 +225,7 @@ define i8 @rotr_i8_commute(i8 %x, i8 %y) {
225225
; CHECK-NEXT: [[SUB:%.*]] = sub i8 8, [[Y:%.*]]
226226
; CHECK-NEXT: [[SHL:%.*]] = shl i8 [[X:%.*]], [[SUB]]
227227
; CHECK-NEXT: [[SHR:%.*]] = lshr i8 [[X]], [[Y]]
228-
; CHECK-NEXT: [[R:%.*]] = or i8 [[SHL]], [[SHR]]
228+
; CHECK-NEXT: [[R:%.*]] = or disjoint i8 [[SHL]], [[SHR]]
229229
; CHECK-NEXT: ret i8 [[R]]
230230
;
231231
%sub = sub i8 8, %y
@@ -242,7 +242,7 @@ define <4 x i32> @rotl_v4i32(<4 x i32> %x, <4 x i32> %y) {
242242
; CHECK-NEXT: [[SUB:%.*]] = sub <4 x i32> splat (i32 32), [[Y:%.*]]
243243
; CHECK-NEXT: [[SHL:%.*]] = shl <4 x i32> [[X:%.*]], [[Y]]
244244
; CHECK-NEXT: [[SHR:%.*]] = lshr <4 x i32> [[X]], [[SUB]]
245-
; CHECK-NEXT: [[R:%.*]] = or <4 x i32> [[SHL]], [[SHR]]
245+
; CHECK-NEXT: [[R:%.*]] = or disjoint <4 x i32> [[SHL]], [[SHR]]
246246
; CHECK-NEXT: ret <4 x i32> [[R]]
247247
;
248248
%sub = sub <4 x i32> <i32 32, i32 32, i32 32, i32 32>, %y
@@ -259,7 +259,7 @@ define <3 x i42> @rotr_v3i42(<3 x i42> %x, <3 x i42> %y) {
259259
; CHECK-NEXT: [[SUB:%.*]] = sub <3 x i42> splat (i42 42), [[Y:%.*]]
260260
; CHECK-NEXT: [[SHL:%.*]] = shl <3 x i42> [[X:%.*]], [[SUB]]
261261
; CHECK-NEXT: [[SHR:%.*]] = lshr <3 x i42> [[X]], [[Y]]
262-
; CHECK-NEXT: [[R:%.*]] = or <3 x i42> [[SHR]], [[SHL]]
262+
; CHECK-NEXT: [[R:%.*]] = or disjoint <3 x i42> [[SHR]], [[SHL]]
263263
; CHECK-NEXT: ret <3 x i42> [[R]]
264264
;
265265
%sub = sub <3 x i42> <i42 42, i42 42, i42 42>, %y
@@ -838,7 +838,7 @@ define i24 @rotl_select_weird_type(i24 %x, i24 %shamt) {
838838
; CHECK-NEXT: [[SUB:%.*]] = sub i24 24, [[SHAMT]]
839839
; CHECK-NEXT: [[SHR:%.*]] = lshr i24 [[X:%.*]], [[SUB]]
840840
; CHECK-NEXT: [[SHL:%.*]] = shl i24 [[X]], [[SHAMT]]
841-
; CHECK-NEXT: [[OR:%.*]] = or i24 [[SHL]], [[SHR]]
841+
; CHECK-NEXT: [[OR:%.*]] = or disjoint i24 [[SHL]], [[SHR]]
842842
; CHECK-NEXT: [[R:%.*]] = select i1 [[CMP]], i24 [[X]], i24 [[OR]]
843843
; CHECK-NEXT: ret i24 [[R]]
844844
;
@@ -987,7 +987,7 @@ define i32 @rotl_i32_add(i32 %x, i32 %y) {
987987
; CHECK-NEXT: [[SUB:%.*]] = sub i32 32, [[Y:%.*]]
988988
; CHECK-NEXT: [[SHL:%.*]] = shl i32 [[X:%.*]], [[Y]]
989989
; CHECK-NEXT: [[SHR:%.*]] = lshr i32 [[X]], [[SUB]]
990-
; CHECK-NEXT: [[R:%.*]] = add i32 [[SHR]], [[SHL]]
990+
; CHECK-NEXT: [[R:%.*]] = or disjoint i32 [[SHR]], [[SHL]]
991991
; CHECK-NEXT: ret i32 [[R]]
992992
;
993993
%sub = sub i32 32, %y
@@ -1002,7 +1002,7 @@ define i32 @rotr_i32_add(i32 %x, i32 %y) {
10021002
; CHECK-NEXT: [[SUB:%.*]] = sub i32 32, [[Y:%.*]]
10031003
; CHECK-NEXT: [[SHL:%.*]] = lshr i32 [[X:%.*]], [[Y]]
10041004
; CHECK-NEXT: [[SHR:%.*]] = shl i32 [[X]], [[SUB]]
1005-
; CHECK-NEXT: [[R:%.*]] = add i32 [[SHR]], [[SHL]]
1005+
; CHECK-NEXT: [[R:%.*]] = or disjoint i32 [[SHR]], [[SHL]]
10061006
; CHECK-NEXT: ret i32 [[R]]
10071007
;
10081008
%sub = sub i32 32, %y

0 commit comments

Comments
 (0)