Skip to content

Commit 9ed1bd4

Browse files
committed
Remove some of the complexity-based canonicalization
The idea behind is that the canonicalization allows us to handle less pattern, because we know that some will be canonicalized away. This is indeed very useful to e.g. know that constants are always on the right. However, the fact that arguments are also canonicalized to the right seems like it may be doing more damage than good: This means that writing tests to cover both commuted forms requires special care ("thwart complexity-based canonicalization"). I think we should consider dropping this canonicalization to make testing simpler.
1 parent 11ebc9d commit 9ed1bd4

File tree

260 files changed

+2346
-2340
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

260 files changed

+2346
-2340
lines changed

llvm/include/llvm/Transforms/InstCombine/InstCombiner.h

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -132,21 +132,18 @@ class LLVM_LIBRARY_VISIBILITY InstCombiner {
132132
/// This routine maps IR values to various complexity ranks:
133133
/// 0 -> undef
134134
/// 1 -> Constants
135-
/// 2 -> Other non-instructions
136-
/// 3 -> Arguments
137-
/// 4 -> Cast and (f)neg/not instructions
138-
/// 5 -> Other instructions
135+
/// 2 -> Cast and (f)neg/not instructions
136+
/// 3 -> Other instructions and arguments
139137
static unsigned getComplexity(Value *V) {
140-
if (isa<Instruction>(V)) {
141-
if (isa<CastInst>(V) || match(V, m_Neg(PatternMatch::m_Value())) ||
142-
match(V, m_Not(PatternMatch::m_Value())) ||
143-
match(V, m_FNeg(PatternMatch::m_Value())))
144-
return 4;
145-
return 5;
146-
}
147-
if (isa<Argument>(V))
148-
return 3;
149-
return isa<Constant>(V) ? (isa<UndefValue>(V) ? 0 : 1) : 2;
138+
if (isa<Constant>(V))
139+
return isa<UndefValue>(V) ? 0 : 1;
140+
141+
if (isa<CastInst>(V) || match(V, m_Neg(PatternMatch::m_Value())) ||
142+
match(V, m_Not(PatternMatch::m_Value())) ||
143+
match(V, m_FNeg(PatternMatch::m_Value())))
144+
return 2;
145+
146+
return 3;
150147
}
151148

152149
/// Predicate canonicalization reduces the number of patterns that need to be

llvm/test/Transforms/IndVarSimplify/rewrite-loop-exit-value.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,8 @@ define i16 @pr57336(i16 %end, i16 %m) mustprogress {
165165
; CHECK: for.body:
166166
; CHECK-NEXT: [[INC8:%.*]] = phi i16 [ [[INC:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY:%.*]] ]
167167
; CHECK-NEXT: [[INC]] = add nuw nsw i16 [[INC8]], 1
168-
; CHECK-NEXT: [[MUL:%.*]] = mul nsw i16 [[INC8]], [[M:%.*]]
169-
; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp sgt i16 [[MUL]], [[END:%.*]]
168+
; CHECK-NEXT: [[MUL:%.*]] = mul nsw i16 [[M:%.*]], [[INC8]]
169+
; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp slt i16 [[END:%.*]], [[MUL]]
170170
; CHECK-NEXT: br i1 [[CMP_NOT]], label [[CRIT_EDGE:%.*]], label [[FOR_BODY]]
171171
; CHECK: crit_edge:
172172
; CHECK-NEXT: [[TMP0:%.*]] = add i16 [[END]], 1
@@ -254,7 +254,7 @@ define i32 @vscale_slt_with_vp_umin2(ptr nocapture %A, i32 %n) mustprogress vsca
254254
; CHECK-NEXT: entry:
255255
; CHECK-NEXT: [[VSCALE:%.*]] = call i32 @llvm.vscale.i32()
256256
; CHECK-NEXT: [[VF:%.*]] = shl nuw nsw i32 [[VSCALE]], 2
257-
; CHECK-NEXT: [[CMP4:%.*]] = icmp slt i32 [[VF]], [[N:%.*]]
257+
; CHECK-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[N:%.*]], [[VF]]
258258
; CHECK-NEXT: br i1 [[CMP4]], label [[FOR_BODY_PREHEADER:%.*]], label [[EARLY_EXIT:%.*]]
259259
; CHECK: for.body.preheader:
260260
; CHECK-NEXT: br label [[FOR_BODY:%.*]]

llvm/test/Transforms/InstCombine/2004-11-27-SetCCForCastLargerAndConstant.ll

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ define i1 @gt_unsigned_to_small_negative(i8 %SB) {
272272
define i1 @different_size_zext_zext_ugt(i7 %x, i4 %y) {
273273
; CHECK-LABEL: @different_size_zext_zext_ugt(
274274
; CHECK-NEXT: [[TMP1:%.*]] = zext i4 [[Y:%.*]] to i7
275-
; CHECK-NEXT: [[R:%.*]] = icmp ult i7 [[TMP1]], [[X:%.*]]
275+
; CHECK-NEXT: [[R:%.*]] = icmp ugt i7 [[X:%.*]], [[TMP1]]
276276
; CHECK-NEXT: ret i1 [[R]]
277277
;
278278
%zx = zext i7 %x to i25
@@ -284,7 +284,7 @@ define i1 @different_size_zext_zext_ugt(i7 %x, i4 %y) {
284284
define <2 x i1> @different_size_zext_zext_ugt_commute(<2 x i4> %x, <2 x i7> %y) {
285285
; CHECK-LABEL: @different_size_zext_zext_ugt_commute(
286286
; CHECK-NEXT: [[TMP1:%.*]] = zext <2 x i4> [[X:%.*]] to <2 x i7>
287-
; CHECK-NEXT: [[R:%.*]] = icmp ugt <2 x i7> [[TMP1]], [[Y:%.*]]
287+
; CHECK-NEXT: [[R:%.*]] = icmp ult <2 x i7> [[Y:%.*]], [[TMP1]]
288288
; CHECK-NEXT: ret <2 x i1> [[R]]
289289
;
290290
%zx = zext <2 x i4> %x to <2 x i25>
@@ -296,7 +296,7 @@ define <2 x i1> @different_size_zext_zext_ugt_commute(<2 x i4> %x, <2 x i7> %y)
296296
define i1 @different_size_zext_zext_ult(i4 %x, i7 %y) {
297297
; CHECK-LABEL: @different_size_zext_zext_ult(
298298
; CHECK-NEXT: [[TMP1:%.*]] = zext i4 [[X:%.*]] to i7
299-
; CHECK-NEXT: [[R:%.*]] = icmp ult i7 [[TMP1]], [[Y:%.*]]
299+
; CHECK-NEXT: [[R:%.*]] = icmp ugt i7 [[Y:%.*]], [[TMP1]]
300300
; CHECK-NEXT: ret i1 [[R]]
301301
;
302302
%zx = zext i4 %x to i25
@@ -308,7 +308,7 @@ define i1 @different_size_zext_zext_ult(i4 %x, i7 %y) {
308308
define i1 @different_size_zext_zext_eq(i4 %x, i7 %y) {
309309
; CHECK-LABEL: @different_size_zext_zext_eq(
310310
; CHECK-NEXT: [[TMP1:%.*]] = zext i4 [[X:%.*]] to i7
311-
; CHECK-NEXT: [[R:%.*]] = icmp eq i7 [[TMP1]], [[Y:%.*]]
311+
; CHECK-NEXT: [[R:%.*]] = icmp eq i7 [[Y:%.*]], [[TMP1]]
312312
; CHECK-NEXT: ret i1 [[R]]
313313
;
314314
%zx = zext i4 %x to i25
@@ -320,7 +320,7 @@ define i1 @different_size_zext_zext_eq(i4 %x, i7 %y) {
320320
define i1 @different_size_zext_zext_ne_commute(i7 %x, i4 %y) {
321321
; CHECK-LABEL: @different_size_zext_zext_ne_commute(
322322
; CHECK-NEXT: [[TMP1:%.*]] = zext i4 [[Y:%.*]] to i7
323-
; CHECK-NEXT: [[R:%.*]] = icmp ne i7 [[TMP1]], [[X:%.*]]
323+
; CHECK-NEXT: [[R:%.*]] = icmp ne i7 [[X:%.*]], [[TMP1]]
324324
; CHECK-NEXT: ret i1 [[R]]
325325
;
326326
%zx = zext i7 %x to i25
@@ -332,7 +332,7 @@ define i1 @different_size_zext_zext_ne_commute(i7 %x, i4 %y) {
332332
define i1 @different_size_zext_zext_slt(i7 %x, i4 %y) {
333333
; CHECK-LABEL: @different_size_zext_zext_slt(
334334
; CHECK-NEXT: [[TMP1:%.*]] = zext i4 [[Y:%.*]] to i7
335-
; CHECK-NEXT: [[R:%.*]] = icmp ugt i7 [[TMP1]], [[X:%.*]]
335+
; CHECK-NEXT: [[R:%.*]] = icmp ult i7 [[X:%.*]], [[TMP1]]
336336
; CHECK-NEXT: ret i1 [[R]]
337337
;
338338
%zx = zext i7 %x to i25
@@ -344,7 +344,7 @@ define i1 @different_size_zext_zext_slt(i7 %x, i4 %y) {
344344
define i1 @different_size_zext_zext_sgt(i7 %x, i4 %y) {
345345
; CHECK-LABEL: @different_size_zext_zext_sgt(
346346
; CHECK-NEXT: [[TMP1:%.*]] = zext i4 [[Y:%.*]] to i7
347-
; CHECK-NEXT: [[R:%.*]] = icmp ult i7 [[TMP1]], [[X:%.*]]
347+
; CHECK-NEXT: [[R:%.*]] = icmp ugt i7 [[X:%.*]], [[TMP1]]
348348
; CHECK-NEXT: ret i1 [[R]]
349349
;
350350
%zx = zext i7 %x to i25
@@ -356,7 +356,7 @@ define i1 @different_size_zext_zext_sgt(i7 %x, i4 %y) {
356356
define i1 @different_size_sext_sext_sgt(i7 %x, i4 %y) {
357357
; CHECK-LABEL: @different_size_sext_sext_sgt(
358358
; CHECK-NEXT: [[TMP1:%.*]] = sext i4 [[Y:%.*]] to i7
359-
; CHECK-NEXT: [[R:%.*]] = icmp slt i7 [[TMP1]], [[X:%.*]]
359+
; CHECK-NEXT: [[R:%.*]] = icmp sgt i7 [[X:%.*]], [[TMP1]]
360360
; CHECK-NEXT: ret i1 [[R]]
361361
;
362362
%sx = sext i7 %x to i25
@@ -368,7 +368,7 @@ define i1 @different_size_sext_sext_sgt(i7 %x, i4 %y) {
368368
define i1 @different_size_sext_sext_sle(i7 %x, i4 %y) {
369369
; CHECK-LABEL: @different_size_sext_sext_sle(
370370
; CHECK-NEXT: [[TMP1:%.*]] = sext i4 [[Y:%.*]] to i7
371-
; CHECK-NEXT: [[R:%.*]] = icmp sge i7 [[TMP1]], [[X:%.*]]
371+
; CHECK-NEXT: [[R:%.*]] = icmp sle i7 [[X:%.*]], [[TMP1]]
372372
; CHECK-NEXT: ret i1 [[R]]
373373
;
374374
%sx = sext i7 %x to i25
@@ -380,7 +380,7 @@ define i1 @different_size_sext_sext_sle(i7 %x, i4 %y) {
380380
define i1 @different_size_sext_sext_eq(i7 %x, i4 %y) {
381381
; CHECK-LABEL: @different_size_sext_sext_eq(
382382
; CHECK-NEXT: [[TMP1:%.*]] = sext i4 [[Y:%.*]] to i7
383-
; CHECK-NEXT: [[R:%.*]] = icmp eq i7 [[TMP1]], [[X:%.*]]
383+
; CHECK-NEXT: [[R:%.*]] = icmp eq i7 [[X:%.*]], [[TMP1]]
384384
; CHECK-NEXT: ret i1 [[R]]
385385
;
386386
%sx = sext i7 %x to i25
@@ -392,7 +392,7 @@ define i1 @different_size_sext_sext_eq(i7 %x, i4 %y) {
392392
define i1 @different_size_sext_sext_ule(i7 %x, i4 %y) {
393393
; CHECK-LABEL: @different_size_sext_sext_ule(
394394
; CHECK-NEXT: [[TMP1:%.*]] = sext i4 [[Y:%.*]] to i7
395-
; CHECK-NEXT: [[R:%.*]] = icmp uge i7 [[TMP1]], [[X:%.*]]
395+
; CHECK-NEXT: [[R:%.*]] = icmp ule i7 [[X:%.*]], [[TMP1]]
396396
; CHECK-NEXT: ret i1 [[R]]
397397
;
398398
%sx = sext i7 %x to i25
@@ -423,7 +423,7 @@ define i1 @different_size_sext_sext_ule_extra_use1(i7 %x, i4 %y) {
423423
; CHECK-NEXT: [[SY:%.*]] = sext i4 [[Y:%.*]] to i25
424424
; CHECK-NEXT: call void @use(i25 [[SY]])
425425
; CHECK-NEXT: [[TMP1:%.*]] = sext i4 [[Y]] to i7
426-
; CHECK-NEXT: [[R:%.*]] = icmp uge i7 [[TMP1]], [[X:%.*]]
426+
; CHECK-NEXT: [[R:%.*]] = icmp ule i7 [[X:%.*]], [[TMP1]]
427427
; CHECK-NEXT: ret i1 [[R]]
428428
;
429429
%sx = sext i7 %x to i25
@@ -438,7 +438,7 @@ define i1 @different_size_sext_sext_ule_extra_use2(i7 %x, i4 %y) {
438438
; CHECK-NEXT: [[SX:%.*]] = sext i7 [[X:%.*]] to i25
439439
; CHECK-NEXT: call void @use(i25 [[SX]])
440440
; CHECK-NEXT: [[TMP1:%.*]] = sext i4 [[Y:%.*]] to i7
441-
; CHECK-NEXT: [[R:%.*]] = icmp uge i7 [[TMP1]], [[X]]
441+
; CHECK-NEXT: [[R:%.*]] = icmp ule i7 [[X]], [[TMP1]]
442442
; CHECK-NEXT: ret i1 [[R]]
443443
;
444444
%sx = sext i7 %x to i25

llvm/test/Transforms/InstCombine/2010-11-23-Distributed.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ define i32 @foo(i32 %x, i32 %y) {
1616
define i1 @bar(i64 %x, i64 %y) {
1717
; CHECK-LABEL: @bar(
1818
; CHECK-NEXT: [[Y1:%.*]] = xor i64 [[X:%.*]], -1
19-
; CHECK-NEXT: [[B:%.*]] = and i64 [[Y1]], [[Y:%.*]]
19+
; CHECK-NEXT: [[B:%.*]] = and i64 [[Y:%.*]], [[Y1]]
2020
; CHECK-NEXT: [[R:%.*]] = icmp eq i64 [[B]], 0
2121
; CHECK-NEXT: ret i1 [[R]]
2222
;

llvm/test/Transforms/InstCombine/abs-1.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ define i32 @nabs_canonical_9(i32 %a, i32 %b) {
306306
; CHECK-LABEL: @nabs_canonical_9(
307307
; CHECK-NEXT: [[T1:%.*]] = sub i32 [[A:%.*]], [[B:%.*]]
308308
; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[T1]], i1 false)
309-
; CHECK-NEXT: [[TMP2:%.*]] = add i32 [[TMP1]], [[A]]
309+
; CHECK-NEXT: [[TMP2:%.*]] = add i32 [[A]], [[TMP1]]
310310
; CHECK-NEXT: [[ADD:%.*]] = sub i32 [[B]], [[TMP2]]
311311
; CHECK-NEXT: ret i32 [[ADD]]
312312
;
@@ -417,7 +417,7 @@ declare void @extra_use_i1(i1)
417417
define i8 @shifty_abs_too_many_uses(i8 %x) {
418418
; CHECK-LABEL: @shifty_abs_too_many_uses(
419419
; CHECK-NEXT: [[SIGNBIT:%.*]] = ashr i8 [[X:%.*]], 7
420-
; CHECK-NEXT: [[ADD:%.*]] = add i8 [[SIGNBIT]], [[X]]
420+
; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X]], [[SIGNBIT]]
421421
; CHECK-NEXT: [[ABS:%.*]] = xor i8 [[ADD]], [[SIGNBIT]]
422422
; CHECK-NEXT: call void @extra_use(i8 [[SIGNBIT]])
423423
; CHECK-NEXT: ret i8 [[ABS]]

llvm/test/Transforms/InstCombine/add-mask-neg.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ define i32 @dec_commute_mask_neg_i32(i32 %X) {
4949
define i32 @dec_mask_neg_multiuse_i32(i32 %X) {
5050
; CHECK-LABEL: @dec_mask_neg_multiuse_i32(
5151
; CHECK-NEXT: [[NEG:%.*]] = sub i32 0, [[X:%.*]]
52-
; CHECK-NEXT: [[MASK:%.*]] = and i32 [[NEG]], [[X]]
52+
; CHECK-NEXT: [[MASK:%.*]] = and i32 [[X]], [[NEG]]
5353
; CHECK-NEXT: [[DEC:%.*]] = add i32 [[MASK]], -1
5454
; CHECK-NEXT: call void @use(i32 [[NEG]])
5555
; CHECK-NEXT: ret i32 [[DEC]]
@@ -64,7 +64,7 @@ define i32 @dec_mask_neg_multiuse_i32(i32 %X) {
6464
define i32 @dec_mask_multiuse_neg_i32(i32 %X) {
6565
; CHECK-LABEL: @dec_mask_multiuse_neg_i32(
6666
; CHECK-NEXT: [[NEG:%.*]] = sub i32 0, [[X:%.*]]
67-
; CHECK-NEXT: [[MASK:%.*]] = and i32 [[NEG]], [[X]]
67+
; CHECK-NEXT: [[MASK:%.*]] = and i32 [[X]], [[NEG]]
6868
; CHECK-NEXT: [[DEC:%.*]] = add i32 [[MASK]], -1
6969
; CHECK-NEXT: call void @use(i32 [[MASK]])
7070
; CHECK-NEXT: ret i32 [[DEC]]
@@ -105,7 +105,7 @@ define <2 x i32> @dec_mask_neg_v2i32_poison(<2 x i32> %X) {
105105
define <2 x i32> @dec_mask_multiuse_neg_multiuse_v2i32(<2 x i32> %X) {
106106
; CHECK-LABEL: @dec_mask_multiuse_neg_multiuse_v2i32(
107107
; CHECK-NEXT: [[NEG:%.*]] = sub <2 x i32> zeroinitializer, [[X:%.*]]
108-
; CHECK-NEXT: [[MASK:%.*]] = and <2 x i32> [[NEG]], [[X]]
108+
; CHECK-NEXT: [[MASK:%.*]] = and <2 x i32> [[X]], [[NEG]]
109109
; CHECK-NEXT: [[DEC:%.*]] = add <2 x i32> [[MASK]], <i32 -1, i32 -1>
110110
; CHECK-NEXT: call void @usev(<2 x i32> [[NEG]])
111111
; CHECK-NEXT: call void @usev(<2 x i32> [[MASK]])

0 commit comments

Comments
 (0)