3
3
; RUN: | FileCheck -check-prefixes=RV32,RV32I %s
4
4
; RUN: llc -mtriple=riscv32 -mattr=+f -target-abi=ilp32 -verify-machineinstrs < %s \
5
5
; RUN: | FileCheck -check-prefixes=RV32,RV32IF %s
6
+ ; RUN: llc -mtriple=riscv32 -mattr=+zicond -target-abi=ilp32 -verify-machineinstrs < %s \
7
+ ; RUN: | FileCheck -check-prefixes=RV32,RV32ZICOND %s
6
8
; RUN: llc -mtriple=riscv64 -target-abi=lp64 -verify-machineinstrs < %s \
7
9
; RUN: | FileCheck -check-prefixes=RV64,RV64I %s
8
10
; RUN: llc -mtriple=riscv64 -mattr=+f,+d -target-abi=lp64 -verify-machineinstrs < %s \
9
11
; RUN: | FileCheck -check-prefixes=RV64,RV64IFD %s
12
+ ; RUN: llc -mtriple=riscv64 -mattr=+zicond -target-abi=lp64 -verify-machineinstrs < %s \
13
+ ; RUN: | FileCheck -check-prefixes=RV64,RV64ZICOND %s
10
14
11
15
;; This tests how good we are at materialising constants using `select`. The aim
12
16
;; is that we do so without a branch if possible (at the moment our lowering of
@@ -59,25 +63,59 @@ define signext i32 @select_const_int_pow2_zero(i1 zeroext %a) nounwind {
59
63
}
60
64
61
65
define signext i32 @select_const_int_harder (i1 zeroext %a ) nounwind {
62
- ; RV32 -LABEL: select_const_int_harder:
63
- ; RV32 : # %bb.0:
64
- ; RV32 -NEXT: bnez a0, .LBB3_2
65
- ; RV32 -NEXT: # %bb.1:
66
- ; RV32 -NEXT: li a0, 38
67
- ; RV32 -NEXT: ret
68
- ; RV32 -NEXT: .LBB3_2:
69
- ; RV32 -NEXT: li a0, 6
70
- ; RV32 -NEXT: ret
66
+ ; RV32I -LABEL: select_const_int_harder:
67
+ ; RV32I : # %bb.0:
68
+ ; RV32I -NEXT: bnez a0, .LBB3_2
69
+ ; RV32I -NEXT: # %bb.1:
70
+ ; RV32I -NEXT: li a0, 38
71
+ ; RV32I -NEXT: ret
72
+ ; RV32I -NEXT: .LBB3_2:
73
+ ; RV32I -NEXT: li a0, 6
74
+ ; RV32I -NEXT: ret
71
75
;
72
- ; RV64-LABEL: select_const_int_harder:
73
- ; RV64: # %bb.0:
74
- ; RV64-NEXT: bnez a0, .LBB3_2
75
- ; RV64-NEXT: # %bb.1:
76
- ; RV64-NEXT: li a0, 38
77
- ; RV64-NEXT: ret
78
- ; RV64-NEXT: .LBB3_2:
79
- ; RV64-NEXT: li a0, 6
80
- ; RV64-NEXT: ret
76
+ ; RV32IF-LABEL: select_const_int_harder:
77
+ ; RV32IF: # %bb.0:
78
+ ; RV32IF-NEXT: bnez a0, .LBB3_2
79
+ ; RV32IF-NEXT: # %bb.1:
80
+ ; RV32IF-NEXT: li a0, 38
81
+ ; RV32IF-NEXT: ret
82
+ ; RV32IF-NEXT: .LBB3_2:
83
+ ; RV32IF-NEXT: li a0, 6
84
+ ; RV32IF-NEXT: ret
85
+ ;
86
+ ; RV32ZICOND-LABEL: select_const_int_harder:
87
+ ; RV32ZICOND: # %bb.0:
88
+ ; RV32ZICOND-NEXT: li a1, 32
89
+ ; RV32ZICOND-NEXT: czero.nez a0, a1, a0
90
+ ; RV32ZICOND-NEXT: addi a0, a0, 6
91
+ ; RV32ZICOND-NEXT: ret
92
+ ;
93
+ ; RV64I-LABEL: select_const_int_harder:
94
+ ; RV64I: # %bb.0:
95
+ ; RV64I-NEXT: bnez a0, .LBB3_2
96
+ ; RV64I-NEXT: # %bb.1:
97
+ ; RV64I-NEXT: li a0, 38
98
+ ; RV64I-NEXT: ret
99
+ ; RV64I-NEXT: .LBB3_2:
100
+ ; RV64I-NEXT: li a0, 6
101
+ ; RV64I-NEXT: ret
102
+ ;
103
+ ; RV64IFD-LABEL: select_const_int_harder:
104
+ ; RV64IFD: # %bb.0:
105
+ ; RV64IFD-NEXT: bnez a0, .LBB3_2
106
+ ; RV64IFD-NEXT: # %bb.1:
107
+ ; RV64IFD-NEXT: li a0, 38
108
+ ; RV64IFD-NEXT: ret
109
+ ; RV64IFD-NEXT: .LBB3_2:
110
+ ; RV64IFD-NEXT: li a0, 6
111
+ ; RV64IFD-NEXT: ret
112
+ ;
113
+ ; RV64ZICOND-LABEL: select_const_int_harder:
114
+ ; RV64ZICOND: # %bb.0:
115
+ ; RV64ZICOND-NEXT: li a1, 32
116
+ ; RV64ZICOND-NEXT: czero.nez a0, a1, a0
117
+ ; RV64ZICOND-NEXT: addi a0, a0, 6
118
+ ; RV64ZICOND-NEXT: ret
81
119
%1 = select i1 %a , i32 6 , i32 38
82
120
ret i32 %1
83
121
}
@@ -106,6 +144,14 @@ define float @select_const_fp(i1 zeroext %a) nounwind {
106
144
; RV32IF-NEXT: fmv.x.w a0, fa5
107
145
; RV32IF-NEXT: ret
108
146
;
147
+ ; RV32ZICOND-LABEL: select_const_fp:
148
+ ; RV32ZICOND: # %bb.0:
149
+ ; RV32ZICOND-NEXT: lui a1, 1024
150
+ ; RV32ZICOND-NEXT: czero.nez a0, a1, a0
151
+ ; RV32ZICOND-NEXT: lui a1, 263168
152
+ ; RV32ZICOND-NEXT: add a0, a0, a1
153
+ ; RV32ZICOND-NEXT: ret
154
+ ;
109
155
; RV64I-LABEL: select_const_fp:
110
156
; RV64I: # %bb.0:
111
157
; RV64I-NEXT: mv a1, a0
@@ -128,6 +174,14 @@ define float @select_const_fp(i1 zeroext %a) nounwind {
128
174
; RV64IFD-NEXT: fmv.w.x fa5, a0
129
175
; RV64IFD-NEXT: fmv.x.w a0, fa5
130
176
; RV64IFD-NEXT: ret
177
+ ;
178
+ ; RV64ZICOND-LABEL: select_const_fp:
179
+ ; RV64ZICOND: # %bb.0:
180
+ ; RV64ZICOND-NEXT: lui a1, 1024
181
+ ; RV64ZICOND-NEXT: czero.nez a0, a1, a0
182
+ ; RV64ZICOND-NEXT: lui a1, 263168
183
+ ; RV64ZICOND-NEXT: add a0, a0, a1
184
+ ; RV64ZICOND-NEXT: ret
131
185
%1 = select i1 %a , float 3 .0 , float 4 .0
132
186
ret float %1
133
187
}
@@ -391,38 +445,98 @@ define i32 @select_ne_10001_10002(i32 signext %a, i32 signext %b) {
391
445
}
392
446
393
447
define i32 @select_slt_zero_constant1_constant2 (i32 signext %x ) {
394
- ; RV32 -LABEL: select_slt_zero_constant1_constant2:
395
- ; RV32 : # %bb.0:
396
- ; RV32 -NEXT: srai a0, a0, 31
397
- ; RV32 -NEXT: andi a0, a0, 10
398
- ; RV32 -NEXT: addi a0, a0, -3
399
- ; RV32 -NEXT: ret
448
+ ; RV32I -LABEL: select_slt_zero_constant1_constant2:
449
+ ; RV32I : # %bb.0:
450
+ ; RV32I -NEXT: srai a0, a0, 31
451
+ ; RV32I -NEXT: andi a0, a0, 10
452
+ ; RV32I -NEXT: addi a0, a0, -3
453
+ ; RV32I -NEXT: ret
400
454
;
401
- ; RV64-LABEL: select_slt_zero_constant1_constant2:
402
- ; RV64: # %bb.0:
403
- ; RV64-NEXT: srai a0, a0, 63
404
- ; RV64-NEXT: andi a0, a0, 10
405
- ; RV64-NEXT: addi a0, a0, -3
406
- ; RV64-NEXT: ret
455
+ ; RV32IF-LABEL: select_slt_zero_constant1_constant2:
456
+ ; RV32IF: # %bb.0:
457
+ ; RV32IF-NEXT: srai a0, a0, 31
458
+ ; RV32IF-NEXT: andi a0, a0, 10
459
+ ; RV32IF-NEXT: addi a0, a0, -3
460
+ ; RV32IF-NEXT: ret
461
+ ;
462
+ ; RV32ZICOND-LABEL: select_slt_zero_constant1_constant2:
463
+ ; RV32ZICOND: # %bb.0:
464
+ ; RV32ZICOND-NEXT: slti a0, a0, 0
465
+ ; RV32ZICOND-NEXT: li a1, -10
466
+ ; RV32ZICOND-NEXT: czero.nez a0, a1, a0
467
+ ; RV32ZICOND-NEXT: addi a0, a0, 7
468
+ ; RV32ZICOND-NEXT: ret
469
+ ;
470
+ ; RV64I-LABEL: select_slt_zero_constant1_constant2:
471
+ ; RV64I: # %bb.0:
472
+ ; RV64I-NEXT: srai a0, a0, 63
473
+ ; RV64I-NEXT: andi a0, a0, 10
474
+ ; RV64I-NEXT: addi a0, a0, -3
475
+ ; RV64I-NEXT: ret
476
+ ;
477
+ ; RV64IFD-LABEL: select_slt_zero_constant1_constant2:
478
+ ; RV64IFD: # %bb.0:
479
+ ; RV64IFD-NEXT: srai a0, a0, 63
480
+ ; RV64IFD-NEXT: andi a0, a0, 10
481
+ ; RV64IFD-NEXT: addi a0, a0, -3
482
+ ; RV64IFD-NEXT: ret
483
+ ;
484
+ ; RV64ZICOND-LABEL: select_slt_zero_constant1_constant2:
485
+ ; RV64ZICOND: # %bb.0:
486
+ ; RV64ZICOND-NEXT: slti a0, a0, 0
487
+ ; RV64ZICOND-NEXT: li a1, -10
488
+ ; RV64ZICOND-NEXT: czero.nez a0, a1, a0
489
+ ; RV64ZICOND-NEXT: addi a0, a0, 7
490
+ ; RV64ZICOND-NEXT: ret
407
491
%cmp = icmp slt i32 %x , 0
408
492
%cond = select i1 %cmp , i32 7 , i32 -3
409
493
ret i32 %cond
410
494
}
411
495
412
496
define i32 @select_sgt_negative_one_constant1_constant2 (i32 signext %x ) {
413
- ; RV32 -LABEL: select_sgt_negative_one_constant1_constant2:
414
- ; RV32 : # %bb.0:
415
- ; RV32 -NEXT: srai a0, a0, 31
416
- ; RV32 -NEXT: andi a0, a0, -10
417
- ; RV32 -NEXT: addi a0, a0, 7
418
- ; RV32 -NEXT: ret
497
+ ; RV32I -LABEL: select_sgt_negative_one_constant1_constant2:
498
+ ; RV32I : # %bb.0:
499
+ ; RV32I -NEXT: srai a0, a0, 31
500
+ ; RV32I -NEXT: andi a0, a0, -10
501
+ ; RV32I -NEXT: addi a0, a0, 7
502
+ ; RV32I -NEXT: ret
419
503
;
420
- ; RV64-LABEL: select_sgt_negative_one_constant1_constant2:
421
- ; RV64: # %bb.0:
422
- ; RV64-NEXT: srai a0, a0, 63
423
- ; RV64-NEXT: andi a0, a0, -10
424
- ; RV64-NEXT: addi a0, a0, 7
425
- ; RV64-NEXT: ret
504
+ ; RV32IF-LABEL: select_sgt_negative_one_constant1_constant2:
505
+ ; RV32IF: # %bb.0:
506
+ ; RV32IF-NEXT: srai a0, a0, 31
507
+ ; RV32IF-NEXT: andi a0, a0, -10
508
+ ; RV32IF-NEXT: addi a0, a0, 7
509
+ ; RV32IF-NEXT: ret
510
+ ;
511
+ ; RV32ZICOND-LABEL: select_sgt_negative_one_constant1_constant2:
512
+ ; RV32ZICOND: # %bb.0:
513
+ ; RV32ZICOND-NEXT: slti a0, a0, 0
514
+ ; RV32ZICOND-NEXT: li a1, -10
515
+ ; RV32ZICOND-NEXT: czero.eqz a0, a1, a0
516
+ ; RV32ZICOND-NEXT: addi a0, a0, 7
517
+ ; RV32ZICOND-NEXT: ret
518
+ ;
519
+ ; RV64I-LABEL: select_sgt_negative_one_constant1_constant2:
520
+ ; RV64I: # %bb.0:
521
+ ; RV64I-NEXT: srai a0, a0, 63
522
+ ; RV64I-NEXT: andi a0, a0, -10
523
+ ; RV64I-NEXT: addi a0, a0, 7
524
+ ; RV64I-NEXT: ret
525
+ ;
526
+ ; RV64IFD-LABEL: select_sgt_negative_one_constant1_constant2:
527
+ ; RV64IFD: # %bb.0:
528
+ ; RV64IFD-NEXT: srai a0, a0, 63
529
+ ; RV64IFD-NEXT: andi a0, a0, -10
530
+ ; RV64IFD-NEXT: addi a0, a0, 7
531
+ ; RV64IFD-NEXT: ret
532
+ ;
533
+ ; RV64ZICOND-LABEL: select_sgt_negative_one_constant1_constant2:
534
+ ; RV64ZICOND: # %bb.0:
535
+ ; RV64ZICOND-NEXT: slti a0, a0, 0
536
+ ; RV64ZICOND-NEXT: li a1, -10
537
+ ; RV64ZICOND-NEXT: czero.eqz a0, a1, a0
538
+ ; RV64ZICOND-NEXT: addi a0, a0, 7
539
+ ; RV64ZICOND-NEXT: ret
426
540
%cmp = icmp sgt i32 %x , -1
427
541
%cond = select i1 %cmp , i32 7 , i32 -3
428
542
ret i32 %cond
0 commit comments