Skip to content
This repository was archived by the owner on Sep 15, 2025. It is now read-only.

Commit b53c56f

Browse files
SC llvm teamSC llvm team
authored andcommitted
Merged main:f7b09516e466 into amd-gfx:e631f76db5ef
Local branch amd-gfx e631f76 Merged main:beb89e7fc002 into amd-gfx:71a26b8a604d Remote branch main f7b0951 [LLVM] Add missing verifier checks for convergence control
2 parents e631f76 + f7b0951 commit b53c56f

File tree

12 files changed

+161
-68
lines changed

12 files changed

+161
-68
lines changed

clang/lib/CodeGen/CGBlocks.cpp

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -66,28 +66,6 @@ static llvm::Constant *buildDisposeHelper(CodeGenModule &CGM,
6666

6767
namespace {
6868

69-
/// Represents a captured entity that requires extra operations in order for
70-
/// this entity to be copied or destroyed correctly.
71-
struct BlockCaptureManagedEntity {
72-
BlockCaptureEntityKind CopyKind, DisposeKind;
73-
BlockFieldFlags CopyFlags, DisposeFlags;
74-
const BlockDecl::Capture *CI;
75-
const CGBlockInfo::Capture *Capture;
76-
77-
BlockCaptureManagedEntity(BlockCaptureEntityKind CopyType,
78-
BlockCaptureEntityKind DisposeType,
79-
BlockFieldFlags CopyFlags,
80-
BlockFieldFlags DisposeFlags,
81-
const BlockDecl::Capture &CI,
82-
const CGBlockInfo::Capture &Capture)
83-
: CopyKind(CopyType), DisposeKind(DisposeType), CopyFlags(CopyFlags),
84-
DisposeFlags(DisposeFlags), CI(&CI), Capture(&Capture) {}
85-
86-
bool operator<(const BlockCaptureManagedEntity &Other) const {
87-
return Capture->getOffset() < Other.Capture->getOffset();
88-
}
89-
};
90-
9169
enum class CaptureStrKind {
9270
// String for the copy helper.
9371
CopyHelper,

llvm/include/llvm/CodeGen/LiveInterval.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -326,11 +326,11 @@ namespace llvm {
326326
return VNI && VNI->id < getNumValNums() && VNI == getValNumInfo(VNI->id);
327327
}
328328

329-
/// getNextValue - Create a new value number and return it. MIIdx specifies
330-
/// the instruction that defines the value number.
331-
VNInfo *getNextValue(SlotIndex def, VNInfo::Allocator &VNInfoAllocator) {
329+
/// getNextValue - Create a new value number and return it.
330+
/// @p Def is the index of instruction that defines the value number.
331+
VNInfo *getNextValue(SlotIndex Def, VNInfo::Allocator &VNInfoAllocator) {
332332
VNInfo *VNI =
333-
new (VNInfoAllocator) VNInfo((unsigned)valnos.size(), def);
333+
new (VNInfoAllocator) VNInfo((unsigned)valnos.size(), Def);
334334
valnos.push_back(VNI);
335335
return VNI;
336336
}

llvm/include/llvm/Config/llvm-config.h.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
/* Indicate that this is LLVM compiled from the amd-gfx branch. */
1818
#define LLVM_HAVE_BRANCH_AMD_GFX
19-
#define LLVM_MAIN_REVISION 469633
19+
#define LLVM_MAIN_REVISION 469640
2020

2121
/* Define if LLVM_ENABLE_DUMP is enabled */
2222
#cmakedefine LLVM_ENABLE_DUMP

llvm/lib/IR/Verifier.cpp

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2535,6 +2535,23 @@ void Verifier::verifySiblingFuncletUnwinds() {
25352535
}
25362536
}
25372537

2538+
static bool isConvergenceControlIntrinsic(const CallBase &Call) {
2539+
switch (Call.getIntrinsicID()) {
2540+
case Intrinsic::experimental_convergence_anchor:
2541+
case Intrinsic::experimental_convergence_entry:
2542+
case Intrinsic::experimental_convergence_loop:
2543+
return true;
2544+
default:
2545+
return false;
2546+
}
2547+
}
2548+
2549+
static bool isControlledConvergent(const CallBase &Call) {
2550+
if (Call.countOperandBundlesOfType(LLVMContext::OB_convergencectrl))
2551+
return true;
2552+
return isConvergenceControlIntrinsic(Call);
2553+
}
2554+
25382555
void Verifier::verifyConvergenceControl(Function &F) {
25392556
DenseMap<BasicBlock *, SmallVector<CallBase *, 8>> LiveTokenMap;
25402557
DenseMap<const Cycle *, const CallBase *> CycleHearts;
@@ -2552,10 +2569,10 @@ void Verifier::verifyConvergenceControl(Function &F) {
25522569

25532570
Value *Token = Bundle.Inputs[0].get();
25542571
auto *Def = dyn_cast<CallBase>(Token);
2555-
Check(Def != nullptr,
2556-
"Convergence control tokens can only be produced by call "
2557-
"instructions.",
2558-
Token);
2572+
Check(Def && isConvergenceControlIntrinsic(*Def),
2573+
"Convergence control tokens can only be produced by calls to the "
2574+
"convergence control intrinsics.",
2575+
Token, CB);
25592576

25602577
Check(llvm::is_contained(LiveTokens, Token),
25612578
"Convergence region is not well-nested.", Token, CB);
@@ -2615,6 +2632,9 @@ void Verifier::verifyConvergenceControl(Function &F) {
26152632
if (!CB)
26162633
continue;
26172634

2635+
Check(CB->countOperandBundlesOfType(LLVMContext::OB_convergencectrl) <= 1,
2636+
"The 'convergencetrl' bundle can occur at most once on a call", CB);
2637+
26182638
auto Bundle = CB->getOperandBundle(LLVMContext::OB_convergencectrl);
26192639
if (Bundle)
26202640
checkBundle(*Bundle, CB, LiveTokens);
@@ -3375,20 +3395,6 @@ void Verifier::visitPHINode(PHINode &PN) {
33753395
visitInstruction(PN);
33763396
}
33773397

3378-
static bool isControlledConvergent(const CallBase &Call) {
3379-
if (Call.getOperandBundle(LLVMContext::OB_convergencectrl))
3380-
return true;
3381-
if (const auto *F = dyn_cast<Function>(Call.getCalledOperand())) {
3382-
switch (F->getIntrinsicID()) {
3383-
case Intrinsic::experimental_convergence_anchor:
3384-
case Intrinsic::experimental_convergence_entry:
3385-
case Intrinsic::experimental_convergence_loop:
3386-
return true;
3387-
}
3388-
}
3389-
return false;
3390-
}
3391-
33923398
void Verifier::visitCallBase(CallBase &Call) {
33933399
Check(Call.getCalledOperand()->getType()->isPointerTy(),
33943400
"Called function must be a pointer!", Call);

llvm/lib/Target/CSKY/CSKYInstrInfoF1.td

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,16 @@ defm FCMPZUO : FT_CMPZX<0b001011, "fcmpzuo">;
141141

142142
defm FRECIP : FT_MOV<0b011001, "frecip">;
143143

144+
// multiplication
145+
let Predicates = [HasFPUv2_SF] in {
146+
def : Pat<(f32 (fmul (fneg sFPR32Op:$vrx), sFPR32Op:$vry)),
147+
(FNMUL_S sFPR32Op:$vrx, sFPR32Op:$vry)>;
148+
}
149+
let Predicates = [HasFPUv2_DF] in {
150+
def : Pat<(f64 (fmul (fneg sFPR64Op:$vrx), sFPR64Op:$vry)),
151+
(FNMUL_D sFPR64Op:$vrx, sFPR64Op:$vry)>;
152+
}
153+
144154
//fmov, fmtvr, fmfvr
145155
defm FMOV : FT_MOV<0b000100, "fmov">;
146156
def FMFVRL : F_XZ_GF<3, 0b011001, (outs GPR:$rz), (ins sFPR32Op:$vrx),

llvm/lib/Target/CSKY/CSKYInstrInfoF2.td

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,16 @@ defm f2FNMULS : F2_XYZZ_T<0b010101, "fnmuls",
208208
defm f2FNMUL : F2_XYZ_T<0b010001, "fnmul",
209209
BinOpFrag<(fneg (fmul node:$LHS, node:$RHS))>>;
210210

211+
// multiplication
212+
let Predicates = [HasFPUv3_SF] in {
213+
def : Pat<(f32 (fmul (fneg FPR32Op:$vrx), FPR32Op:$vry)),
214+
(f2FNMUL_S FPR32Op:$vrx, FPR32Op:$vry)>;
215+
}
216+
let Predicates = [HasFPUv3_DF] in {
217+
def : Pat<(f64 (fmul (fneg FPR64Op:$vrx), FPR64Op:$vry)),
218+
(f2FNMUL_D FPR64Op:$vrx, FPR64Op:$vry)>;
219+
}
220+
211221
// fcvt
212222
def f2FFTOS32_S : F2_XZ_P<0b01000, 0b011011, "fftoi.f32.s32", [], (outs FPR32Op:$vrz), (ins FPR32Op:$vrx)>;
213223
def f2FFTOU32_S : F2_XZ_P<0b01000, 0b011010, "fftoi.f32.u32", [], (outs FPR32Op:$vrz), (ins FPR32Op:$vrx)>;

llvm/test/CodeGen/CSKY/fpu/base-d.ll

Lines changed: 49 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ define double @FADD_DOUBLE_I(double %x) {
2727
; CHECK-DF-NEXT: rts16
2828
; CHECK-DF-NEXT: .p2align 1
2929
; CHECK-DF-NEXT: # %bb.1:
30-
; CHECK-DF-NEXT: .p2align 2
30+
; CHECK-DF-NEXT: .p2align 2, 0x0
3131
; CHECK-DF-NEXT: .LCPI1_0:
3232
; CHECK-DF-NEXT: .quad 0xbff0000000000000 # double -1
3333
;
@@ -38,7 +38,7 @@ define double @FADD_DOUBLE_I(double %x) {
3838
; CHECK-DF2-NEXT: rts16
3939
; CHECK-DF2-NEXT: .p2align 1
4040
; CHECK-DF2-NEXT: # %bb.1:
41-
; CHECK-DF2-NEXT: .p2align 2
41+
; CHECK-DF2-NEXT: .p2align 2, 0x0
4242
; CHECK-DF2-NEXT: .LCPI1_0:
4343
; CHECK-DF2-NEXT: .quad 0xbff0000000000000 # double -1
4444
entry:
@@ -72,7 +72,7 @@ define double @FSUB_DOUBLE_I(double %x) {
7272
; CHECK-DF-NEXT: rts16
7373
; CHECK-DF-NEXT: .p2align 1
7474
; CHECK-DF-NEXT: # %bb.1:
75-
; CHECK-DF-NEXT: .p2align 2
75+
; CHECK-DF-NEXT: .p2align 2, 0x0
7676
; CHECK-DF-NEXT: .LCPI3_0:
7777
; CHECK-DF-NEXT: .quad 0x3ff0000000000000 # double 1
7878
;
@@ -83,7 +83,7 @@ define double @FSUB_DOUBLE_I(double %x) {
8383
; CHECK-DF2-NEXT: rts16
8484
; CHECK-DF2-NEXT: .p2align 1
8585
; CHECK-DF2-NEXT: # %bb.1:
86-
; CHECK-DF2-NEXT: .p2align 2
86+
; CHECK-DF2-NEXT: .p2align 2, 0x0
8787
; CHECK-DF2-NEXT: .LCPI3_0:
8888
; CHECK-DF2-NEXT: .quad 0x3ff0000000000000 # double 1
8989

@@ -108,29 +108,62 @@ entry:
108108
ret double %fmul
109109
}
110110

111+
define double @FNMUL_DOUBLE_a(double %x, double %y) {
112+
;
113+
; CHECK-DF-LABEL: FNMUL_DOUBLE_a:
114+
; CHECK-DF: # %bb.0: # %entry
115+
; CHECK-DF-NEXT: fnmuld vr0, vr1, vr0
116+
; CHECK-DF-NEXT: rts16
117+
;
118+
; CHECK-DF2-LABEL: FNMUL_DOUBLE_a:
119+
; CHECK-DF2: # %bb.0: # %entry
120+
; CHECK-DF2-NEXT: fnmul.64 vr0, vr1, vr0
121+
; CHECK-DF2-NEXT: rts16
122+
entry:
123+
%z = fneg double %y
124+
%fnmul = fmul double %z, %x
125+
ret double %fnmul
126+
}
127+
128+
define double @FNMUL_DOUBLE_b(double %x, double %y) {
129+
; CHECK-DF-LABEL: FNMUL_DOUBLE_b:
130+
; CHECK-DF: # %bb.0: # %entry
131+
; CHECK-DF-NEXT: fnmuld vr0, vr0, vr1
132+
; CHECK-DF-NEXT: rts16
133+
;
134+
; CHECK-DF2-LABEL: FNMUL_DOUBLE_b:
135+
; CHECK-DF2: # %bb.0: # %entry
136+
; CHECK-DF2-NEXT: fnmul.64 vr0, vr0, vr1
137+
; CHECK-DF2-NEXT: rts16
138+
entry:
139+
%z = fneg double %x
140+
%fnmul = fmul double %y, %z
141+
ret double %fnmul
142+
}
143+
111144
define double @FMUL_DOUBLE_I(double %x) {
112145
;
113146
; CHECK-DF-LABEL: FMUL_DOUBLE_I:
114147
; CHECK-DF: # %bb.0: # %entry
115-
; CHECK-DF-NEXT: grs32 a0, .LCPI5_0
148+
; CHECK-DF-NEXT: grs32 a0, .LCPI7_0
116149
; CHECK-DF-NEXT: fldd vr1, (a0, 0)
117150
; CHECK-DF-NEXT: fmuld vr0, vr0, vr1
118151
; CHECK-DF-NEXT: rts16
119152
; CHECK-DF-NEXT: .p2align 1
120153
; CHECK-DF-NEXT: # %bb.1:
121-
; CHECK-DF-NEXT: .p2align 2
122-
; CHECK-DF-NEXT: .LCPI5_0:
154+
; CHECK-DF-NEXT: .p2align 2, 0x0
155+
; CHECK-DF-NEXT: .LCPI7_0:
123156
; CHECK-DF-NEXT: .quad 0xc01c000000000000 # double -7
124157
;
125158
; CHECK-DF2-LABEL: FMUL_DOUBLE_I:
126159
; CHECK-DF2: # %bb.0: # %entry
127-
; CHECK-DF2-NEXT: flrw.64 vr1, [.LCPI5_0]
160+
; CHECK-DF2-NEXT: flrw.64 vr1, [.LCPI7_0]
128161
; CHECK-DF2-NEXT: fmul.64 vr0, vr0, vr1
129162
; CHECK-DF2-NEXT: rts16
130163
; CHECK-DF2-NEXT: .p2align 1
131164
; CHECK-DF2-NEXT: # %bb.1:
132-
; CHECK-DF2-NEXT: .p2align 2
133-
; CHECK-DF2-NEXT: .LCPI5_0:
165+
; CHECK-DF2-NEXT: .p2align 2, 0x0
166+
; CHECK-DF2-NEXT: .LCPI7_0:
134167
; CHECK-DF2-NEXT: .quad 0xc01c000000000000 # double -7
135168
entry:
136169
%fmul = fmul double %x, -7.0
@@ -159,25 +192,25 @@ define double @FDIV_DOUBLE_I(double %x) {
159192
;
160193
; CHECK-DF-LABEL: FDIV_DOUBLE_I:
161194
; CHECK-DF: # %bb.0: # %entry
162-
; CHECK-DF-NEXT: grs32 a0, .LCPI7_0
195+
; CHECK-DF-NEXT: grs32 a0, .LCPI9_0
163196
; CHECK-DF-NEXT: fldd vr1, (a0, 0)
164197
; CHECK-DF-NEXT: fdivd vr0, vr0, vr1
165198
; CHECK-DF-NEXT: rts16
166199
; CHECK-DF-NEXT: .p2align 1
167200
; CHECK-DF-NEXT: # %bb.1:
168-
; CHECK-DF-NEXT: .p2align 2
169-
; CHECK-DF-NEXT: .LCPI7_0:
201+
; CHECK-DF-NEXT: .p2align 2, 0x0
202+
; CHECK-DF-NEXT: .LCPI9_0:
170203
; CHECK-DF-NEXT: .quad 0xc01c000000000000 # double -7
171204
;
172205
; CHECK-DF2-LABEL: FDIV_DOUBLE_I:
173206
; CHECK-DF2: # %bb.0: # %entry
174-
; CHECK-DF2-NEXT: flrw.64 vr1, [.LCPI7_0]
207+
; CHECK-DF2-NEXT: flrw.64 vr1, [.LCPI9_0]
175208
; CHECK-DF2-NEXT: fdiv.64 vr0, vr0, vr1
176209
; CHECK-DF2-NEXT: rts16
177210
; CHECK-DF2-NEXT: .p2align 1
178211
; CHECK-DF2-NEXT: # %bb.1:
179-
; CHECK-DF2-NEXT: .p2align 2
180-
; CHECK-DF2-NEXT: .LCPI7_0:
212+
; CHECK-DF2-NEXT: .p2align 2, 0x0
213+
; CHECK-DF2-NEXT: .LCPI9_0:
181214
; CHECK-DF2-NEXT: .quad 0xc01c000000000000 # double -7
182215
entry:
183216
%fdiv = fdiv double %x, -7.0

llvm/test/CodeGen/CSKY/fpu/base-f.ll

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,40 @@ entry:
144144
ret float %fmul
145145
}
146146

147+
define float @fnmulRR_a(float %x, float %y) {
148+
;
149+
; CHECK-SF-LABEL: fnmulRR_a:
150+
; CHECK-SF: # %bb.0: # %entry
151+
; CHECK-SF-NEXT: fnmuls vr0, vr1, vr0
152+
; CHECK-SF-NEXT: rts16
153+
;
154+
; CHECK-SF2-LABEL: fnmulRR_a:
155+
; CHECK-SF2: # %bb.0: # %entry
156+
; CHECK-SF2-NEXT: fnmul.32 vr0, vr1, vr0
157+
; CHECK-SF2-NEXT: rts16
158+
159+
entry:
160+
%z = fneg float %y
161+
%fnmul = fmul float %z, %x
162+
ret float %fnmul
163+
}
164+
165+
define float @fnmulRR_b(float %x, float %y) {
166+
; CHECK-SF-LABEL: fnmulRR_b:
167+
; CHECK-SF: # %bb.0: # %entry
168+
; CHECK-SF-NEXT: fnmuls vr0, vr0, vr1
169+
; CHECK-SF-NEXT: rts16
170+
;
171+
; CHECK-SF2-LABEL: fnmulRR_b:
172+
; CHECK-SF2: # %bb.0: # %entry
173+
; CHECK-SF2-NEXT: fnmul.32 vr0, vr0, vr1
174+
; CHECK-SF2-NEXT: rts16
175+
entry:
176+
%z = fneg float %x
177+
%fnmul = fmul float %y, %z
178+
ret float %fnmul
179+
}
180+
147181
define float @fmulRI(float %x) {
148182
;
149183
; CHECK-SF-LABEL: fmulRI:

llvm/test/CodeGen/RISCV/rv64xtheadbb.ll

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -415,10 +415,6 @@ define signext i32 @cttz_i32(i32 signext %a) nounwind {
415415
; RV64XTHEADBB-NEXT: .LBB6_2:
416416
; RV64XTHEADBB-NEXT: li a0, 32
417417
; RV64XTHEADBB-NEXT: ret
418-
; RV64ZBB-LABEL: cttz_i32:
419-
; RV64ZBB: # %bb.0:
420-
; RV64ZBB-NEXT: ctzw a0, a0
421-
; RV64ZBB-NEXT: ret
422418
%1 = call i32 @llvm.cttz.i32(i32 %a, i1 false)
423419
ret i32 %1
424420
}

llvm/test/Verifier/convergencectrl-invalid.ll

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
; RUN: not llvm-as < %s -o /dev/null 2>&1 | FileCheck %s
22

3+
; CHECK: Convergence control tokens can only be produced by calls to the convergence control intrinsics.
4+
; CHECK-NEXT: %t04_tok1 = call token @produce_token()
5+
; CHECK-NEXT: call void @f() [ "convergencectrl"(token %t04_tok1) ]
6+
define void @wrong_token() {
7+
%t04_tok1 = call token @produce_token()
8+
call void @f() [ "convergencectrl"(token %t04_tok1) ]
9+
ret void
10+
}
11+
312
; CHECK: Expected convergent attribute on a controlled convergent call.
413
; CHECK-NEXT call void @g(){{.*}}%t05_tok1
514
define void @missing.attribute() {
@@ -8,6 +17,24 @@ define void @missing.attribute() {
817
ret void
918
}
1019

20+
; CHECK: The 'convergencectrl' bundle requires exactly one token use.
21+
; CHECK-NEXT: call void @g()
22+
define void @multiple_tokens() {
23+
%t06_tok1 = call token @llvm.experimental.convergence.anchor()
24+
%t06_tok2 = call token @llvm.experimental.convergence.anchor()
25+
call void @g() [ "convergencectrl"(token %t06_tok2, token %t06_tok1) ]
26+
ret void
27+
}
28+
29+
; CHECK: The 'convergencetrl' bundle can occur at most once on a call
30+
; CHECK-NEXT: call void @g()
31+
define void @multiple_bundles() {
32+
%t07_tok1 = call token @llvm.experimental.convergence.anchor()
33+
%t07_tok2 = call token @llvm.experimental.convergence.anchor()
34+
call void @g() [ "convergencectrl"(token %t07_tok2), "convergencectrl"(token %t07_tok1) ]
35+
ret void
36+
}
37+
1138
; CHECK: Cannot mix controlled and uncontrolled convergence in the same function
1239
; CHECK-NEXT call void @f()
1340
define void @mixed1() {
@@ -217,6 +244,8 @@ F:
217244
ret void
218245
}
219246

247+
declare token @produce_token()
248+
220249
declare void @f() convergent
221250
declare void @g()
222251

0 commit comments

Comments
 (0)