Skip to content

Commit 7e294e6

Browse files
committed
[DAG] canCreateUndefOrPoison - add freeze(assertsext/zext(x,bt)) -> assertsext/zext(freeze(x),vt) support
These are guaranteed not to create undef/poison (although they may pass through) - the associated ISD::VALUETYPE node is also guaranteed never to generate poison
1 parent a36348c commit 7e294e6

File tree

2 files changed

+18
-15
lines changed

2 files changed

+18
-15
lines changed

llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -4508,6 +4508,9 @@ bool SelectionDAG::isGuaranteedNotToBeUndefOrPoison(SDValue Op,
45084508
return true;
45094509

45104510
switch (Opcode) {
4511+
case ISD::VALUETYPE:
4512+
return true;
4513+
45114514
case ISD::UNDEF:
45124515
return PoisonOnly;
45134516

@@ -4564,6 +4567,8 @@ bool SelectionDAG::canCreateUndefOrPoison(SDValue Op, const APInt &DemandedElts,
45644567

45654568
unsigned Opcode = Op.getOpcode();
45664569
switch (Opcode) {
4570+
case ISD::AssertSext:
4571+
case ISD::AssertZext:
45674572
case ISD::FREEZE:
45684573
case ISD::AND:
45694574
case ISD::OR:

llvm/test/CodeGen/RISCV/rv64zbb.ll

+13-15
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ declare i32 @llvm.ctlz.i32(i32, i1)
99
define signext i32 @ctlz_i32(i32 signext %a) nounwind {
1010
; RV64I-LABEL: ctlz_i32:
1111
; RV64I: # %bb.0:
12-
; RV64I-NEXT: sext.w a1, a0
13-
; RV64I-NEXT: beqz a1, .LBB0_2
12+
; RV64I-NEXT: beqz a0, .LBB0_2
1413
; RV64I-NEXT: # %bb.1: # %cond.false
1514
; RV64I-NEXT: addi sp, sp, -16
1615
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
@@ -63,8 +62,7 @@ define signext i32 @ctlz_i32(i32 signext %a) nounwind {
6362
define signext i32 @log2_i32(i32 signext %a) nounwind {
6463
; RV64I-LABEL: log2_i32:
6564
; RV64I: # %bb.0:
66-
; RV64I-NEXT: sext.w a1, a0
67-
; RV64I-NEXT: beqz a1, .LBB1_2
65+
; RV64I-NEXT: beqz a0, .LBB1_2
6866
; RV64I-NEXT: # %bb.1: # %cond.false
6967
; RV64I-NEXT: addi sp, sp, -16
7068
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
@@ -368,34 +366,34 @@ declare i32 @llvm.cttz.i32(i32, i1)
368366
define signext i32 @cttz_i32(i32 signext %a) nounwind {
369367
; RV64I-LABEL: cttz_i32:
370368
; RV64I: # %bb.0:
369+
; RV64I-NEXT: beqz a0, .LBB6_4
370+
; RV64I-NEXT: # %bb.1: # %cond.false
371371
; RV64I-NEXT: addi sp, sp, -16
372372
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
373373
; RV64I-NEXT: sd s0, 0(sp) # 8-byte Folded Spill
374-
; RV64I-NEXT: sext.w s0, a0
375-
; RV64I-NEXT: beqz s0, .LBB6_3
376-
; RV64I-NEXT: # %bb.1: # %cond.false
377-
; RV64I-NEXT: neg a1, a0
378-
; RV64I-NEXT: and a0, a0, a1
374+
; RV64I-NEXT: mv s0, a0
375+
; RV64I-NEXT: neg a0, a0
376+
; RV64I-NEXT: and a0, s0, a0
379377
; RV64I-NEXT: lui a1, 30667
380378
; RV64I-NEXT: addiw a1, a1, 1329
381379
; RV64I-NEXT: call __muldi3@plt
382380
; RV64I-NEXT: mv a1, a0
383381
; RV64I-NEXT: li a0, 32
384-
; RV64I-NEXT: beqz s0, .LBB6_4
382+
; RV64I-NEXT: beqz s0, .LBB6_3
385383
; RV64I-NEXT: # %bb.2: # %cond.false
386384
; RV64I-NEXT: srliw a0, a1, 27
387385
; RV64I-NEXT: lui a1, %hi(.LCPI6_0)
388386
; RV64I-NEXT: addi a1, a1, %lo(.LCPI6_0)
389387
; RV64I-NEXT: add a0, a1, a0
390388
; RV64I-NEXT: lbu a0, 0(a0)
391-
; RV64I-NEXT: j .LBB6_4
392-
; RV64I-NEXT: .LBB6_3:
393-
; RV64I-NEXT: li a0, 32
394-
; RV64I-NEXT: .LBB6_4: # %cond.end
389+
; RV64I-NEXT: .LBB6_3: # %cond.false
395390
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
396391
; RV64I-NEXT: ld s0, 0(sp) # 8-byte Folded Reload
397392
; RV64I-NEXT: addi sp, sp, 16
398393
; RV64I-NEXT: ret
394+
; RV64I-NEXT: .LBB6_4:
395+
; RV64I-NEXT: li a0, 32
396+
; RV64I-NEXT: ret
399397
;
400398
; RV64ZBB-LABEL: cttz_i32:
401399
; RV64ZBB: # %bb.0:
@@ -928,7 +926,7 @@ define i32 @abs_i32(i32 %x) {
928926
define signext i32 @abs_i32_sext(i32 signext %x) {
929927
; RV64I-LABEL: abs_i32_sext:
930928
; RV64I: # %bb.0:
931-
; RV64I-NEXT: sraiw a1, a0, 31
929+
; RV64I-NEXT: srai a1, a0, 31
932930
; RV64I-NEXT: xor a0, a0, a1
933931
; RV64I-NEXT: subw a0, a0, a1
934932
; RV64I-NEXT: ret

0 commit comments

Comments
 (0)