Index: llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
===================================================================
--- llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
+++ llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
@@ -130,24 +130,10 @@
return false;
}
-static bool readsExecAsData(const MachineInstr &MI) {
- if (MI.isCompare())
- return true;
-
- switch (MI.getOpcode()) {
- default:
- break;
- case AMDGPU::V_READFIRSTLANE_B32:
- return true;
- }
-
- return false;
-}
-
bool SIInstrInfo::isIgnorableUse(const MachineOperand &MO) const {
// Any implicit use of exec by VALU is not a real register read.
return MO.getReg() == AMDGPU::EXEC && MO.isImplicit() &&
- isVALU(*MO.getParent()) && !readsExecAsData(*MO.getParent());
+ isVALU(*MO.getParent());
}
bool SIInstrInfo::areLoadsFromSameBasePtr(SDNode *Load0, SDNode *Load1,
Index: llvm/lib/Target/AMDGPU/VOPCInstructions.td
===================================================================
--- llvm/lib/Target/AMDGPU/VOPCInstructions.td
+++ llvm/lib/Target/AMDGPU/VOPCInstructions.td
@@ -89,6 +89,7 @@
let mayLoad = 0;
let mayStore = 0;
let hasSideEffects = 0;
+ let isConvergent = 1;
let ReadsModeReg = isFloatType
.ret;
@@ -216,7 +217,7 @@
VCMPXNoSDstTable<1, opName#"_e32"> {
let Defs = !if(DefExec, [VCC, EXEC], [VCC]);
let SchedRW = P.Schedule;
- let isConvergent = DefExec;
+ let isConvergent = 1;
let isCompare = 1;
let isCommutable = 1;
}
@@ -228,13 +229,14 @@
let SchedRW = P.Schedule;
let isCompare = 1;
let isCommutable = 1;
+ let isConvergent = 1;
}
foreach _ = BoolToList.ret in
def _sdwa : VOPC_SDWA_Pseudo {
let Defs = !if(DefExec, [EXEC], []);
let SchedRW = P.Schedule;
- let isConvergent = DefExec;
+ let isConvergent = 1;
let isCompare = 1;
}
}
@@ -254,6 +256,7 @@
let isConvergent = 1;
let isCompare = 1;
let isCommutable = 1;
+ let isConvergent = 1;
let SubtargetPredicate = HasNoSdstCMPX;
}
@@ -264,6 +267,7 @@
let SchedRW = P_NoSDst.Schedule;
let isCompare = 1;
let isCommutable = 1;
+ let isConvergent = 1;
let SubtargetPredicate = HasNoSdstCMPX;
}
@@ -668,13 +672,14 @@
let Defs = !if(DefExec, !if(DefVcc, [VCC, EXEC], [EXEC]),
!if(DefVcc, [VCC], []));
let SchedRW = p.Schedule;
- let isConvergent = DefExec;
+ let isConvergent = 1;
}
def _e64 : VOP3_Pseudo.ret>,
VCMPXNoSDstTable<1, opName#"_e64"> {
let Defs = !if(DefExec, [EXEC], []);
let SchedRW = p.Schedule;
+ let isConvergent = 1;
}
foreach _ = BoolToList.ret in
@@ -682,7 +687,7 @@
let Defs = !if(DefExec, !if(DefVcc, [VCC, EXEC], [EXEC]),
!if(DefVcc, [VCC], []));
let SchedRW = p.Schedule;
- let isConvergent = DefExec;
+ let isConvergent = 1;
}
}
@@ -705,6 +710,7 @@
let Defs = [EXEC];
let SchedRW = P_NoSDst.Schedule;
let SubtargetPredicate = HasNoSdstCMPX;
+ let isConvergent = 1;
}
foreach _ = BoolToList.ret in
Index: llvm/test/CodeGen/AMDGPU/undefined-subreg-liverange.ll
===================================================================
--- llvm/test/CodeGen/AMDGPU/undefined-subreg-liverange.ll
+++ llvm/test/CodeGen/AMDGPU/undefined-subreg-liverange.ll
@@ -52,13 +52,10 @@
; CHECK-NEXT: v_mov_b32_e32 v2, 0x7fc00000
; CHECK-NEXT: buffer_store_dword v2, off, s[0:3], 0
; CHECK-NEXT: buffer_store_dwordx4 v[0:3], off, s[0:3], 0
-; CHECK-NEXT: v_cmp_ne_u32_e32 vcc, 0, v1
-; CHECK-NEXT: s_waitcnt expcnt(0)
-; CHECK-NEXT: v_cndmask_b32_e64 v1, 0, 1, vcc
-; CHECK-NEXT: v_cmp_ne_u32_e64 s[0:1], 1, v1
+; CHECK-NEXT: v_cmp_ne_u32_e64 s[0:1], 0, v1
; CHECK-NEXT: .LBB1_1: ; %bb9
; CHECK-NEXT: ; =>This Inner Loop Header: Depth=1
-; CHECK-NEXT: s_and_b64 vcc, exec, s[0:1]
+; CHECK-NEXT: s_andn2_b64 vcc, exec, s[0:1]
; CHECK-NEXT: s_cbranch_vccnz .LBB1_1
; CHECK-NEXT: ; %bb.2: ; %bb11
; CHECK-NEXT: s_mov_b32 s3, 0xf000