Skip to content

Commit a745106

Browse files
authored
[RISCV][GISel] Lower G_SSHLSAT and G_USHLSAT (#155642)
1 parent 3c94613 commit a745106

File tree

4 files changed

+311
-5
lines changed

4 files changed

+311
-5
lines changed

llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,8 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
154154
getActionDefinitionsBuilder({G_SADDO, G_SSUBO}).minScalar(0, sXLen).lower();
155155

156156
// TODO: Use Vector Single-Width Saturating Instructions for vector types.
157-
getActionDefinitionsBuilder({G_UADDSAT, G_SADDSAT, G_USUBSAT, G_SSUBSAT})
157+
getActionDefinitionsBuilder(
158+
{G_UADDSAT, G_SADDSAT, G_USUBSAT, G_SSUBSAT, G_SSHLSAT, G_USHLSAT})
158159
.lower();
159160

160161
getActionDefinitionsBuilder({G_SHL, G_ASHR, G_LSHR})

llvm/test/CodeGen/RISCV/GlobalISel/legalizer-info-validation.mir

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -445,11 +445,13 @@
445445
# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected
446446
# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected
447447
# DEBUG-NEXT: G_USHLSAT (opcode {{[0-9]+}}): 2 type indices, 0 imm indices
448-
# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined
449-
# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined
448+
# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}}
449+
# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected
450+
# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected
450451
# DEBUG-NEXT: G_SSHLSAT (opcode {{[0-9]+}}): 2 type indices, 0 imm indices
451-
# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined
452-
# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined
452+
# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}}
453+
# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected
454+
# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected
453455
# DEBUG-NEXT: G_SMULFIX (opcode {{[0-9]+}}): 1 type index, 1 imm index
454456
# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined
455457
# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined

llvm/test/CodeGen/RISCV/GlobalISel/legalizer/legalize-sat-rv32.mir

Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,3 +391,183 @@ body: |
391391
PseudoRET implicit $x10
392392
393393
...
394+
---
395+
name: sshlsat_i32
396+
body: |
397+
bb.1:
398+
liveins: $x10, $x11
399+
400+
; CHECK-LABEL: name: sshlsat_i32
401+
; CHECK: liveins: $x10, $x11
402+
; CHECK-NEXT: {{ $}}
403+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $x10
404+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x11
405+
; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY]], [[COPY1]](s32)
406+
; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[COPY1]](s32)
407+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 -2147483648
408+
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 2147483647
409+
; CHECK-NEXT: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
410+
; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(slt), [[COPY]](s32), [[C2]]
411+
; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT [[ICMP]](s32), [[C]], [[C1]]
412+
; CHECK-NEXT: [[ICMP1:%[0-9]+]]:_(s32) = G_ICMP intpred(ne), [[COPY]](s32), [[ASHR]]
413+
; CHECK-NEXT: [[SELECT1:%[0-9]+]]:_(s32) = G_SELECT [[ICMP1]](s32), [[SELECT]], [[SHL]]
414+
; CHECK-NEXT: $x10 = COPY [[SELECT1]](s32)
415+
; CHECK-NEXT: PseudoRET implicit $x10
416+
%0:_(s32) = COPY $x10
417+
%1:_(s32) = COPY $x11
418+
%2:_(s32) = G_SSHLSAT %0, %1(s32)
419+
$x10 = COPY %2(s32)
420+
PseudoRET implicit $x10
421+
422+
...
423+
---
424+
name: sshlsat_i64
425+
body: |
426+
bb.1:
427+
liveins: $x10, $x11
428+
; CHECK-LABEL: name: sshlsat_i64
429+
; CHECK: liveins: $x10, $x11
430+
; CHECK-NEXT: {{ $}}
431+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $x10
432+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x11
433+
; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $x12
434+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 32
435+
; CHECK-NEXT: [[SUB:%[0-9]+]]:_(s32) = G_SUB [[COPY2]], [[C]]
436+
; CHECK-NEXT: [[SUB1:%[0-9]+]]:_(s32) = G_SUB [[C]], [[COPY2]]
437+
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
438+
; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[COPY2]](s32), [[C]]
439+
; CHECK-NEXT: [[ICMP1:%[0-9]+]]:_(s32) = G_ICMP intpred(eq), [[COPY2]](s32), [[C1]]
440+
; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY]], [[COPY2]](s32)
441+
; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[COPY]], [[SUB1]](s32)
442+
; CHECK-NEXT: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[COPY2]](s32)
443+
; CHECK-NEXT: [[OR:%[0-9]+]]:_(s32) = G_OR [[LSHR]], [[SHL1]]
444+
; CHECK-NEXT: [[SHL2:%[0-9]+]]:_(s32) = G_SHL [[COPY]], [[SUB]](s32)
445+
; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT [[ICMP]](s32), [[SHL]], [[C1]]
446+
; CHECK-NEXT: [[SELECT1:%[0-9]+]]:_(s32) = G_SELECT [[ICMP]](s32), [[OR]], [[SHL2]]
447+
; CHECK-NEXT: [[SELECT2:%[0-9]+]]:_(s32) = G_SELECT [[ICMP1]](s32), [[COPY1]], [[SELECT1]]
448+
; CHECK-NEXT: [[ICMP2:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[COPY2]](s32), [[C]]
449+
; CHECK-NEXT: [[ICMP3:%[0-9]+]]:_(s32) = G_ICMP intpred(eq), [[COPY2]](s32), [[C1]]
450+
; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SELECT2]], [[COPY2]](s32)
451+
; CHECK-NEXT: [[LSHR1:%[0-9]+]]:_(s32) = G_LSHR [[SELECT]], [[COPY2]](s32)
452+
; CHECK-NEXT: [[SHL3:%[0-9]+]]:_(s32) = G_SHL [[SELECT2]], [[SUB1]](s32)
453+
; CHECK-NEXT: [[OR1:%[0-9]+]]:_(s32) = G_OR [[LSHR1]], [[SHL3]]
454+
; CHECK-NEXT: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 31
455+
; CHECK-NEXT: [[ASHR1:%[0-9]+]]:_(s32) = G_ASHR [[SELECT2]], [[C2]](s32)
456+
; CHECK-NEXT: [[ASHR2:%[0-9]+]]:_(s32) = G_ASHR [[SELECT2]], [[SUB]](s32)
457+
; CHECK-NEXT: [[SELECT3:%[0-9]+]]:_(s32) = G_SELECT [[ICMP2]](s32), [[OR1]], [[ASHR2]]
458+
; CHECK-NEXT: [[SELECT4:%[0-9]+]]:_(s32) = G_SELECT [[ICMP3]](s32), [[SELECT]], [[SELECT3]]
459+
; CHECK-NEXT: [[SELECT5:%[0-9]+]]:_(s32) = G_SELECT [[ICMP2]](s32), [[ASHR]], [[ASHR1]]
460+
; CHECK-NEXT: [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 -2147483648
461+
; CHECK-NEXT: [[C4:%[0-9]+]]:_(s32) = G_CONSTANT i32 -1
462+
; CHECK-NEXT: [[C5:%[0-9]+]]:_(s32) = G_CONSTANT i32 2147483647
463+
; CHECK-NEXT: [[ICMP4:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[COPY]](s32), [[C1]]
464+
; CHECK-NEXT: [[ICMP5:%[0-9]+]]:_(s32) = G_ICMP intpred(slt), [[COPY1]](s32), [[C1]]
465+
; CHECK-NEXT: [[ICMP6:%[0-9]+]]:_(s32) = G_ICMP intpred(eq), [[COPY1]](s32), [[C1]]
466+
; CHECK-NEXT: [[SELECT6:%[0-9]+]]:_(s32) = G_SELECT [[ICMP6]](s32), [[ICMP4]], [[ICMP5]]
467+
; CHECK-NEXT: [[SELECT7:%[0-9]+]]:_(s32) = G_SELECT [[SELECT6]](s32), [[C1]], [[C4]]
468+
; CHECK-NEXT: [[SELECT8:%[0-9]+]]:_(s32) = G_SELECT [[SELECT6]](s32), [[C3]], [[C5]]
469+
; CHECK-NEXT: [[XOR:%[0-9]+]]:_(s32) = G_XOR [[COPY]], [[SELECT4]]
470+
; CHECK-NEXT: [[XOR1:%[0-9]+]]:_(s32) = G_XOR [[COPY1]], [[SELECT5]]
471+
; CHECK-NEXT: [[OR2:%[0-9]+]]:_(s32) = G_OR [[XOR]], [[XOR1]]
472+
; CHECK-NEXT: [[ICMP7:%[0-9]+]]:_(s32) = G_ICMP intpred(ne), [[OR2]](s32), [[C1]]
473+
; CHECK-NEXT: [[SELECT9:%[0-9]+]]:_(s32) = G_SELECT [[ICMP7]](s32), [[SELECT7]], [[SELECT]]
474+
; CHECK-NEXT: [[SELECT10:%[0-9]+]]:_(s32) = G_SELECT [[ICMP7]](s32), [[SELECT8]], [[SELECT2]]
475+
; CHECK-NEXT: $x10 = COPY [[SELECT9]](s32)
476+
; CHECK-NEXT: $x11 = COPY [[SELECT10]](s32)
477+
; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11
478+
%2:_(s32) = COPY $x10
479+
%3:_(s32) = COPY $x11
480+
%0:_(s64) = G_MERGE_VALUES %2(s32), %3(s32)
481+
%4:_(s32) = COPY $x12
482+
%5:_(s32) = COPY $x13
483+
%1:_(s64) = G_MERGE_VALUES %4(s32), %5(s32)
484+
%6:_(s64) = G_SSHLSAT %0, %1(s64)
485+
%7:_(s32), %8:_(s32) = G_UNMERGE_VALUES %6(s64)
486+
$x10 = COPY %7(s32)
487+
$x11 = COPY %8(s32)
488+
PseudoRET implicit $x10, implicit $x11
489+
490+
...
491+
---
492+
name: ushlsat_i32
493+
body: |
494+
bb.1:
495+
liveins: $x10, $x11
496+
497+
; CHECK-LABEL: name: ushlsat_i32
498+
; CHECK: liveins: $x10, $x11
499+
; CHECK-NEXT: {{ $}}
500+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $x10
501+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x11
502+
; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY]], [[COPY1]](s32)
503+
; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[SHL]], [[COPY1]](s32)
504+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 -1
505+
; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ne), [[COPY]](s32), [[LSHR]]
506+
; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT [[ICMP]](s32), [[C]], [[SHL]]
507+
; CHECK-NEXT: $x10 = COPY [[SELECT]](s32)
508+
; CHECK-NEXT: PseudoRET implicit $x10
509+
%0:_(s32) = COPY $x10
510+
%1:_(s32) = COPY $x11
511+
%2:_(s32) = G_USHLSAT %0, %1(s32)
512+
$x10 = COPY %2(s32)
513+
PseudoRET implicit $x10
514+
515+
...
516+
---
517+
name: ushlsat_i64
518+
body: |
519+
bb.1:
520+
liveins: $x10, $x11
521+
; CHECK-LABEL: name: ushlsat_i64
522+
; CHECK: liveins: $x10, $x11
523+
; CHECK-NEXT: {{ $}}
524+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $x10
525+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x11
526+
; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $x12
527+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 32
528+
; CHECK-NEXT: [[SUB:%[0-9]+]]:_(s32) = G_SUB [[COPY2]], [[C]]
529+
; CHECK-NEXT: [[SUB1:%[0-9]+]]:_(s32) = G_SUB [[C]], [[COPY2]]
530+
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
531+
; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[COPY2]](s32), [[C]]
532+
; CHECK-NEXT: [[ICMP1:%[0-9]+]]:_(s32) = G_ICMP intpred(eq), [[COPY2]](s32), [[C1]]
533+
; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY]], [[COPY2]](s32)
534+
; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[COPY]], [[SUB1]](s32)
535+
; CHECK-NEXT: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[COPY2]](s32)
536+
; CHECK-NEXT: [[OR:%[0-9]+]]:_(s32) = G_OR [[LSHR]], [[SHL1]]
537+
; CHECK-NEXT: [[SHL2:%[0-9]+]]:_(s32) = G_SHL [[COPY]], [[SUB]](s32)
538+
; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT [[ICMP]](s32), [[SHL]], [[C1]]
539+
; CHECK-NEXT: [[SELECT1:%[0-9]+]]:_(s32) = G_SELECT [[ICMP]](s32), [[OR]], [[SHL2]]
540+
; CHECK-NEXT: [[SELECT2:%[0-9]+]]:_(s32) = G_SELECT [[ICMP1]](s32), [[COPY1]], [[SELECT1]]
541+
; CHECK-NEXT: [[ICMP2:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[COPY2]](s32), [[C]]
542+
; CHECK-NEXT: [[ICMP3:%[0-9]+]]:_(s32) = G_ICMP intpred(eq), [[COPY2]](s32), [[C1]]
543+
; CHECK-NEXT: [[LSHR1:%[0-9]+]]:_(s32) = G_LSHR [[SELECT2]], [[COPY2]](s32)
544+
; CHECK-NEXT: [[LSHR2:%[0-9]+]]:_(s32) = G_LSHR [[SELECT]], [[COPY2]](s32)
545+
; CHECK-NEXT: [[SHL3:%[0-9]+]]:_(s32) = G_SHL [[SELECT2]], [[SUB1]](s32)
546+
; CHECK-NEXT: [[OR1:%[0-9]+]]:_(s32) = G_OR [[LSHR2]], [[SHL3]]
547+
; CHECK-NEXT: [[LSHR3:%[0-9]+]]:_(s32) = G_LSHR [[SELECT2]], [[SUB]](s32)
548+
; CHECK-NEXT: [[SELECT3:%[0-9]+]]:_(s32) = G_SELECT [[ICMP2]](s32), [[OR1]], [[LSHR3]]
549+
; CHECK-NEXT: [[SELECT4:%[0-9]+]]:_(s32) = G_SELECT [[ICMP3]](s32), [[SELECT]], [[SELECT3]]
550+
; CHECK-NEXT: [[SELECT5:%[0-9]+]]:_(s32) = G_SELECT [[ICMP2]](s32), [[LSHR1]], [[C1]]
551+
; CHECK-NEXT: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 -1
552+
; CHECK-NEXT: [[XOR:%[0-9]+]]:_(s32) = G_XOR [[COPY]], [[SELECT4]]
553+
; CHECK-NEXT: [[XOR1:%[0-9]+]]:_(s32) = G_XOR [[COPY1]], [[SELECT5]]
554+
; CHECK-NEXT: [[OR2:%[0-9]+]]:_(s32) = G_OR [[XOR]], [[XOR1]]
555+
; CHECK-NEXT: [[ICMP4:%[0-9]+]]:_(s32) = G_ICMP intpred(ne), [[OR2]](s32), [[C1]]
556+
; CHECK-NEXT: [[SELECT6:%[0-9]+]]:_(s32) = G_SELECT [[ICMP4]](s32), [[C2]], [[SELECT]]
557+
; CHECK-NEXT: [[SELECT7:%[0-9]+]]:_(s32) = G_SELECT [[ICMP4]](s32), [[C2]], [[SELECT2]]
558+
; CHECK-NEXT: $x10 = COPY [[SELECT6]](s32)
559+
; CHECK-NEXT: $x11 = COPY [[SELECT7]](s32)
560+
; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11
561+
%2:_(s32) = COPY $x10
562+
%3:_(s32) = COPY $x11
563+
%0:_(s64) = G_MERGE_VALUES %2(s32), %3(s32)
564+
%4:_(s32) = COPY $x12
565+
%5:_(s32) = COPY $x13
566+
%1:_(s64) = G_MERGE_VALUES %4(s32), %5(s32)
567+
%6:_(s64) = G_USHLSAT %0, %1(s64)
568+
%7:_(s32), %8:_(s32) = G_UNMERGE_VALUES %6(s64)
569+
$x10 = COPY %7(s32)
570+
$x11 = COPY %8(s32)
571+
PseudoRET implicit $x10, implicit $x11
572+
573+
...

llvm/test/CodeGen/RISCV/GlobalISel/legalizer/legalize-sat-rv64.mir

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,3 +350,126 @@ body: |
350350
PseudoRET implicit $x10
351351
352352
...
353+
---
354+
name: sshlsat_i32
355+
body: |
356+
bb.1:
357+
liveins: $x10, $x11
358+
359+
; CHECK-LABEL: name: sshlsat_i32
360+
; CHECK: liveins: $x10, $x11
361+
; CHECK-NEXT: {{ $}}
362+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10
363+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11
364+
; CHECK-NEXT: [[SLLW:%[0-9]+]]:_(s64) = G_SLLW [[COPY]], [[COPY1]]
365+
; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[SLLW]](s64)
366+
; CHECK-NEXT: [[SRAW:%[0-9]+]]:_(s64) = G_SRAW [[SLLW]], [[COPY1]]
367+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 -2147483648
368+
; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[C]](s64)
369+
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 2147483647
370+
; CHECK-NEXT: [[TRUNC2:%[0-9]+]]:_(s32) = G_TRUNC [[C1]](s64)
371+
; CHECK-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
372+
; CHECK-NEXT: [[SEXT_INREG:%[0-9]+]]:_(s64) = G_SEXT_INREG [[COPY]], 32
373+
; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s64) = G_ICMP intpred(slt), [[SEXT_INREG]](s64), [[C2]]
374+
; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT [[ICMP]](s64), [[TRUNC1]], [[TRUNC2]]
375+
; CHECK-NEXT: [[SEXT_INREG1:%[0-9]+]]:_(s64) = G_SEXT_INREG [[SRAW]], 32
376+
; CHECK-NEXT: [[ICMP1:%[0-9]+]]:_(s64) = G_ICMP intpred(ne), [[SEXT_INREG]](s64), [[SEXT_INREG1]]
377+
; CHECK-NEXT: [[SELECT1:%[0-9]+]]:_(s32) = G_SELECT [[ICMP1]](s64), [[SELECT]], [[TRUNC]]
378+
; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[SELECT1]](s32)
379+
; CHECK-NEXT: $x10 = COPY [[ANYEXT]](s64)
380+
; CHECK-NEXT: PseudoRET implicit $x10
381+
%0:_(s64) = COPY $x10
382+
%1:_(s32) = G_TRUNC %0(s64)
383+
%2:_(s64) = COPY $x11
384+
%3:_(s32) = G_TRUNC %2(s64)
385+
%4:_(s32) = G_SSHLSAT %1, %3(s32)
386+
%5:_(s64) = G_ANYEXT %4(s32)
387+
$x10 = COPY %5(s64)
388+
PseudoRET implicit $x10
389+
390+
...
391+
---
392+
name: sshlsat_i64
393+
body: |
394+
bb.1:
395+
liveins: $x10, $x11
396+
; CHECK-LABEL: name: sshlsat_i64
397+
; CHECK: liveins: $x10, $x11
398+
; CHECK-NEXT: {{ $}}
399+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10
400+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11
401+
; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s64) = G_SHL [[COPY]], [[COPY1]](s64)
402+
; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(s64) = G_ASHR [[SHL]], [[COPY1]](s64)
403+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 -9223372036854775808
404+
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 9223372036854775807
405+
; CHECK-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
406+
; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s64) = G_ICMP intpred(slt), [[COPY]](s64), [[C2]]
407+
; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(s64) = G_SELECT [[ICMP]](s64), [[C]], [[C1]]
408+
; CHECK-NEXT: [[ICMP1:%[0-9]+]]:_(s64) = G_ICMP intpred(ne), [[COPY]](s64), [[ASHR]]
409+
; CHECK-NEXT: [[SELECT1:%[0-9]+]]:_(s64) = G_SELECT [[ICMP1]](s64), [[SELECT]], [[SHL]]
410+
; CHECK-NEXT: $x10 = COPY [[SELECT1]](s64)
411+
; CHECK-NEXT: PseudoRET implicit $x10
412+
%0:_(s64) = COPY $x10
413+
%1:_(s64) = COPY $x11
414+
%2:_(s64) = G_SSHLSAT %0, %1(s64)
415+
$x10 = COPY %2(s64)
416+
PseudoRET implicit $x10
417+
418+
...
419+
---
420+
name: ushlsat_i32
421+
body: |
422+
bb.1:
423+
liveins: $x10, $x11
424+
425+
; CHECK-LABEL: name: ushlsat_i32
426+
; CHECK: liveins: $x10, $x11
427+
; CHECK-NEXT: {{ $}}
428+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10
429+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11
430+
; CHECK-NEXT: [[SLLW:%[0-9]+]]:_(s64) = G_SLLW [[COPY]], [[COPY1]]
431+
; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[SLLW]](s64)
432+
; CHECK-NEXT: [[SRLW:%[0-9]+]]:_(s64) = G_SRLW [[SLLW]], [[COPY1]]
433+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 -1
434+
; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[C]](s64)
435+
; CHECK-NEXT: [[SEXT_INREG:%[0-9]+]]:_(s64) = G_SEXT_INREG [[COPY]], 32
436+
; CHECK-NEXT: [[SEXT_INREG1:%[0-9]+]]:_(s64) = G_SEXT_INREG [[SRLW]], 32
437+
; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s64) = G_ICMP intpred(ne), [[SEXT_INREG]](s64), [[SEXT_INREG1]]
438+
; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT [[ICMP]](s64), [[TRUNC1]], [[TRUNC]]
439+
; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[SELECT]](s32)
440+
; CHECK-NEXT: $x10 = COPY [[ANYEXT]](s64)
441+
; CHECK-NEXT: PseudoRET implicit $x10
442+
%0:_(s64) = COPY $x10
443+
%1:_(s32) = G_TRUNC %0(s64)
444+
%2:_(s64) = COPY $x11
445+
%3:_(s32) = G_TRUNC %2(s64)
446+
%4:_(s32) = G_USHLSAT %1, %3(s32)
447+
%5:_(s64) = G_ANYEXT %4(s32)
448+
$x10 = COPY %5(s64)
449+
PseudoRET implicit $x10
450+
451+
...
452+
---
453+
name: ushlsat_i64
454+
body: |
455+
bb.1:
456+
liveins: $x10, $x11
457+
; CHECK-LABEL: name: ushlsat_i64
458+
; CHECK: liveins: $x10, $x11
459+
; CHECK-NEXT: {{ $}}
460+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10
461+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11
462+
; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s64) = G_SHL [[COPY]], [[COPY1]](s64)
463+
; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s64) = G_LSHR [[SHL]], [[COPY1]](s64)
464+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 -1
465+
; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s64) = G_ICMP intpred(ne), [[COPY]](s64), [[LSHR]]
466+
; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(s64) = G_SELECT [[ICMP]](s64), [[C]], [[SHL]]
467+
; CHECK-NEXT: $x10 = COPY [[SELECT]](s64)
468+
; CHECK-NEXT: PseudoRET implicit $x10
469+
%0:_(s64) = COPY $x10
470+
%1:_(s64) = COPY $x11
471+
%2:_(s64) = G_USHLSAT %0, %1(s64)
472+
$x10 = COPY %2(s64)
473+
PseudoRET implicit $x10
474+
475+
...

0 commit comments

Comments
 (0)