Skip to content

Commit 69a4779

Browse files
committed
[OPENMP] Fixed codegen for 'reduction' clause.
Fixed codegen for reduction operations min, max, && and ||. Codegen for them is quite similar and I was confused by this similarity. Also added a call to kmpc_end_reduce() in atomic part of reduction codegen (call to kmpc_end_reduce_nowait() is not required). Differential Revision: http://reviews.llvm.org/D9513 llvm-svn: 236689
1 parent 28b8ea1 commit 69a4779

File tree

5 files changed

+118
-114
lines changed

5 files changed

+118
-114
lines changed

clang/lib/CodeGen/CGOpenMPRuntime.cpp

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2121,6 +2121,7 @@ void CGOpenMPRuntime::emitReduction(CodeGenFunction &CGF, SourceLocation Loc,
21212121
// ...
21222122
// Atomic(<LHSExprs>[i] = RedOp<i>(*<LHSExprs>[i], *<RHSExprs>[i]));
21232123
// ...
2124+
// [__kmpc_end_reduce(<loc>, <gtid>, &<lock>);]
21242125
// break;
21252126
// default:;
21262127
// }
@@ -2221,28 +2222,43 @@ void CGOpenMPRuntime::emitReduction(CodeGenFunction &CGF, SourceLocation Loc,
22212222

22222223
{
22232224
CodeGenFunction::RunCleanupsScope Scope(CGF);
2225+
if (!WithNowait) {
2226+
// Add emission of __kmpc_end_reduce(<loc>, <gtid>, &<lock>);
2227+
llvm::Value *EndArgs[] = {
2228+
IdentTLoc, // ident_t *<loc>
2229+
ThreadId, // i32 <gtid>
2230+
Lock // kmp_critical_name *&<lock>
2231+
};
2232+
CGF.EHStack
2233+
.pushCleanup<CallEndCleanup<std::extent<decltype(EndArgs)>::value>>(
2234+
NormalAndEHCleanup,
2235+
createRuntimeFunction(OMPRTL__kmpc_end_reduce),
2236+
llvm::makeArrayRef(EndArgs));
2237+
}
22242238
auto I = LHSExprs.begin();
22252239
for (auto *E : ReductionOps) {
22262240
const Expr *XExpr = nullptr;
22272241
const Expr *EExpr = nullptr;
22282242
const Expr *UpExpr = nullptr;
22292243
BinaryOperatorKind BO = BO_Comma;
2230-
// Try to emit update expression as a simple atomic.
2231-
if (auto *ACO = dyn_cast<AbstractConditionalOperator>(E)) {
2232-
// If this is a conditional operator, analyze it's condition for
2233-
// min/max reduction operator.
2234-
E = ACO->getCond();
2235-
}
22362244
if (auto *BO = dyn_cast<BinaryOperator>(E)) {
22372245
if (BO->getOpcode() == BO_Assign) {
22382246
XExpr = BO->getLHS();
22392247
UpExpr = BO->getRHS();
22402248
}
22412249
}
2242-
// Analyze RHS part of the whole expression.
2243-
if (UpExpr) {
2250+
// Try to emit update expression as a simple atomic.
2251+
auto *RHSExpr = UpExpr;
2252+
if (RHSExpr) {
2253+
// Analyze RHS part of the whole expression.
2254+
if (auto *ACO = dyn_cast<AbstractConditionalOperator>(
2255+
RHSExpr->IgnoreParenImpCasts())) {
2256+
// If this is a conditional operator, analyze its condition for
2257+
// min/max reduction operator.
2258+
RHSExpr = ACO->getCond();
2259+
}
22442260
if (auto *BORHS =
2245-
dyn_cast<BinaryOperator>(UpExpr->IgnoreParenImpCasts())) {
2261+
dyn_cast<BinaryOperator>(RHSExpr->IgnoreParenImpCasts())) {
22462262
EExpr = BORHS->getRHS();
22472263
BO = BORHS->getOpcode();
22482264
}

clang/lib/Sema/SemaOpenMP.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5676,7 +5676,7 @@ OMPClause *Sema::ActOnOpenMPReductionClause(
56765676
BuildBinOp(DSAStack->getCurScope(), ReductionId.getLocStart(), BOK,
56775677
LHSDRE, RHSDRE);
56785678
if (ReductionOp.isUsable()) {
5679-
if (BOK != BO_LOr && BOK != BO_LAnd) {
5679+
if (BOK != BO_LT && BOK != BO_GT) {
56805680
ReductionOp =
56815681
BuildBinOp(DSAStack->getCurScope(), ReductionId.getLocStart(),
56825682
BO_Assign, LHSDRE, ReductionOp.get());

clang/test/OpenMP/for_reduction_codegen.cpp

Lines changed: 40 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ int main() {
9595
// LAMBDA: [[G_PRIV_VAL:%.+]] = load double, double* [[G_PRIVATE_ADDR]]
9696
// LAMBDA: fadd double
9797
// LAMBDA: cmpxchg i64*
98+
// LAMBDA: call void @__kmpc_end_reduce(
9899
// LAMBDA: br label %[[REDUCTION_DONE]]
99100
// LAMBDA: [[REDUCTION_DONE]]
100101
// LAMBDA: ret void
@@ -154,6 +155,7 @@ int main() {
154155
// BLOCKS: [[G_PRIV_VAL:%.+]] = load double, double* [[G_PRIVATE_ADDR]]
155156
// BLOCKS: fadd double
156157
// BLOCKS: cmpxchg i64*
158+
// BLOCKS: call void @__kmpc_end_reduce(
157159
// BLOCKS: br label %[[REDUCTION_DONE]]
158160
// BLOCKS: [[REDUCTION_DONE]]
159161
// BLOCKS: ret void
@@ -273,17 +275,15 @@ int main() {
273275
// var1 = var1.operator &&(var1_reduction);
274276
// CHECK: [[TO_FLOAT:%.+]] = call float @{{.+}}([[S_FLOAT_TY]]* [[VAR1_REF]])
275277
// CHECK: [[VAR1_BOOL:%.+]] = fcmp une float [[TO_FLOAT]], 0.0
276-
// CHECK: br i1 [[VAR1_BOOL]], label %[[TRUE:.+]], label %[[FALSE:.+]]
278+
// CHECK: br i1 [[VAR1_BOOL]], label %[[TRUE:.+]], label %[[END2:.+]]
277279
// CHECK: [[TRUE]]
278280
// CHECK: [[TO_FLOAT:%.+]] = call float @{{.+}}([[S_FLOAT_TY]]* [[VAR1_PRIV]])
279281
// CHECK: [[VAR1_REDUCTION_BOOL:%.+]] = fcmp une float [[TO_FLOAT]], 0.0
280-
// CHECK: br i1 [[VAR1_REDUCTION_BOOL]], label %[[TRUE2:.+]], label %[[FALSE2:.+]]
281-
// CHECK: [[TRUE2]]
282-
// CHECK: br label %[[END2:.+]]
283-
// CHECK: [[FALSE2]]
284282
// CHECK: br label %[[END2]]
285283
// CHECK: [[END2]]
286-
// CHECK: [[COND_LVALUE:%.+]] = phi [[S_FLOAT_TY]]* [ [[VAR1_REF]], %[[TRUE2]] ], [ [[VAR1_PRIV]], %[[FALSE2]] ]
284+
// CHECK: [[COND_LVALUE:%.+]] = phi i1 [ false, %{{.+}} ], [ [[VAR1_REDUCTION_BOOL]], %[[TRUE]] ]
285+
// CHECK: [[CONV:%.+]] = uitofp i1 [[COND_LVALUE]] to float
286+
// CHECK: call void @{{.+}}([[S_FLOAT_TY]]* [[COND_LVALUE:%.+]], float [[CONV]])
287287
// CHECK: [[BC1:%.+]] = bitcast [[S_FLOAT_TY]]* [[VAR1_REF]] to i8*
288288
// CHECK: [[BC2:%.+]] = bitcast [[S_FLOAT_TY]]* [[COND_LVALUE]] to i8*
289289
// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[BC1]], i8* [[BC2]], i64 4, i32 4, i1 false)
@@ -292,7 +292,8 @@ int main() {
292292
// CHECK: [[T_VAR1_VAL:%.+]] = load float, float* [[T_VAR1_REF]],
293293
// CHECK: [[T_VAR1_PRIV_VAL:%.+]] = load float, float* [[T_VAR1_PRIV]],
294294
// CHECK: [[CMP:%.+]] = fcmp olt float [[T_VAR1_VAL]], [[T_VAR1_PRIV_VAL]]
295-
// CHECK: [[UP:%.+]] = uitofp i1 [[CMP]] to float
295+
// CHECK: br i1 [[CMP]]
296+
// CHECK: [[UP:%.+]] = phi float
296297
// CHECK: store float [[UP]], float* [[T_VAR1_REF]],
297298

298299
// __kmpc_end_reduce(<loc>, <gtid>, &<lock>);
@@ -333,17 +334,15 @@ int main() {
333334
// CHECK: call void @__kmpc_critical(
334335
// CHECK: [[TO_FLOAT:%.+]] = call float @{{.+}}([[S_FLOAT_TY]]* [[VAR1_REF]])
335336
// CHECK: [[VAR1_BOOL:%.+]] = fcmp une float [[TO_FLOAT]], 0.0
336-
// CHECK: br i1 [[VAR1_BOOL]], label %[[TRUE:.+]], label %[[FALSE:.+]]
337+
// CHECK: br i1 [[VAR1_BOOL]], label %[[TRUE:.+]], label %[[END2:.+]]
337338
// CHECK: [[TRUE]]
338339
// CHECK: [[TO_FLOAT:%.+]] = call float @{{.+}}([[S_FLOAT_TY]]* [[VAR1_PRIV]])
339340
// CHECK: [[VAR1_REDUCTION_BOOL:%.+]] = fcmp une float [[TO_FLOAT]], 0.0
340-
// CHECK: br i1 [[VAR1_REDUCTION_BOOL]], label %[[TRUE2:.+]], label %[[FALSE2:.+]]
341-
// CHECK: [[TRUE2]]
342-
// CHECK: br label %[[END2:.+]]
343-
// CHECK: [[FALSE2]]
344341
// CHECK: br label %[[END2]]
345342
// CHECK: [[END2]]
346-
// CHECK: [[COND_LVALUE:%.+]] = phi [[S_FLOAT_TY]]* [ [[VAR1_REF]], %[[TRUE2]] ], [ [[VAR1_PRIV]], %[[FALSE2]] ]
343+
// CHECK: [[COND_LVALUE:%.+]] = phi i1 [ false, %{{.+}} ], [ [[VAR1_REDUCTION_BOOL]], %[[TRUE]] ]
344+
// CHECK: [[CONV:%.+]] = uitofp i1 [[COND_LVALUE]] to float
345+
// CHECK: call void @{{.+}}([[S_FLOAT_TY]]* [[COND_LVALUE:%.+]], float [[CONV]])
347346
// CHECK: [[BC1:%.+]] = bitcast [[S_FLOAT_TY]]* [[VAR1_REF]] to i8*
348347
// CHECK: [[BC2:%.+]] = bitcast [[S_FLOAT_TY]]* [[COND_LVALUE]] to i8*
349348
// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[BC1]], i8* [[BC2]], i64 4, i32 4, i1 false)
@@ -356,9 +355,10 @@ int main() {
356355
// CHECK: [[OLD1:%.+]] = bitcast i32 %{{.+}} to float
357356
// CHECK: br label %[[CONT:.+]]
358357
// CHECK: [[CONT]]
359-
// CHECK: [[ORIG_OLD:%.+]] = phi float [ [[OLD1]], %{{.+}} ], [ [[OLD2:%.+]], %[[CONT]] ]
358+
// CHECK: [[ORIG_OLD:%.+]] = phi float [ [[OLD1]], %{{.+}} ], [ [[OLD2:%.+]], %{{.+}} ]
360359
// CHECK: [[CMP:%.+]] = fcmp olt float
361-
// CHECK: [[UP:%.+]] = uitofp i1 [[CMP]] to float
360+
// CHECK: br i1 [[CMP]]
361+
// CHECK: [[UP:%.+]] = phi float
362362
// CHECK: [[ORIG_OLD_INT:%.+]] = bitcast float [[ORIG_OLD]] to i32
363363
// CHECK: [[UP_INT:%.+]] = bitcast float [[UP]] to i32
364364
// CHECK: [[T_VAR1_REF_INT:%.+]] = bitcast float* [[T_VAR1_REF]] to i32*
@@ -369,6 +369,9 @@ int main() {
369369
// CHECK: br i1 [[SUCCESS_FAIL]], label %[[ATOMIC_DONE:.+]], label %[[CONT]]
370370
// CHECK: [[ATOMIC_DONE]]
371371

372+
// __kmpc_end_reduce(<loc>, <gtid>, &<lock>);
373+
// CHECK: call void @__kmpc_end_reduce(%{{.+}}* [[REDUCTION_LOC]], i32 [[GTID]], [8 x i32]* [[REDUCTION_LOCK]])
374+
372375
// break;
373376
// CHECK: br label %[[RED_DONE]]
374377
// CHECK: [[RED_DONE]]
@@ -437,17 +440,15 @@ int main() {
437440
// var1_lhs = var1_lhs.operator &&(var1_rhs);
438441
// CHECK: [[TO_FLOAT:%.+]] = call float @{{.+}}([[S_FLOAT_TY]]* [[VAR1_LHS]])
439442
// CHECK: [[VAR1_BOOL:%.+]] = fcmp une float [[TO_FLOAT]], 0.0
440-
// CHECK: br i1 [[VAR1_BOOL]], label %[[TRUE:.+]], label %[[FALSE:.+]]
443+
// CHECK: br i1 [[VAR1_BOOL]], label %[[TRUE:.+]], label %[[END2:.+]]
441444
// CHECK: [[TRUE]]
442445
// CHECK: [[TO_FLOAT:%.+]] = call float @{{.+}}([[S_FLOAT_TY]]* [[VAR1_RHS]])
443446
// CHECK: [[VAR1_REDUCTION_BOOL:%.+]] = fcmp une float [[TO_FLOAT]], 0.0
444-
// CHECK: br i1 [[VAR1_REDUCTION_BOOL]], label %[[TRUE2:.+]], label %[[FALSE2:.+]]
445-
// CHECK: [[TRUE2]]
446-
// CHECK: br label %[[END2:.+]]
447-
// CHECK: [[FALSE2]]
448447
// CHECK: br label %[[END2]]
449448
// CHECK: [[END2]]
450-
// CHECK: [[COND_LVALUE:%.+]] = phi [[S_FLOAT_TY]]* [ [[VAR1_LHS]], %[[TRUE2]] ], [ [[VAR1_RHS]], %[[FALSE2]] ]
449+
// CHECK: [[COND_LVALUE:%.+]] = phi i1 [ false, %{{.+}} ], [ [[VAR1_REDUCTION_BOOL]], %[[TRUE]] ]
450+
// CHECK: [[CONV:%.+]] = uitofp i1 [[COND_LVALUE]] to float
451+
// CHECK: call void @{{.+}}([[S_FLOAT_TY]]* [[COND_LVALUE:%.+]], float [[CONV]])
451452
// CHECK: [[BC1:%.+]] = bitcast [[S_FLOAT_TY]]* [[VAR1_LHS]] to i8*
452453
// CHECK: [[BC2:%.+]] = bitcast [[S_FLOAT_TY]]* [[COND_LVALUE]] to i8*
453454
// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[BC1]], i8* [[BC2]], i64 4, i32 4, i1 false)
@@ -456,7 +457,8 @@ int main() {
456457
// CHECK: [[T_VAR1_LHS_VAL:%.+]] = load float, float* [[T_VAR1_LHS]],
457458
// CHECK: [[T_VAR1_RHS_VAL:%.+]] = load float, float* [[T_VAR1_RHS]],
458459
// CHECK: [[CMP:%.+]] = fcmp olt float [[T_VAR1_LHS_VAL]], [[T_VAR1_RHS_VAL]]
459-
// CHECK: [[UP:%.+]] = uitofp i1 [[CMP]] to float
460+
// CHECK: br i1 [[CMP]]
461+
// CHECK: [[UP:%.+]] = phi float
460462
// CHECK: store float [[UP]], float* [[T_VAR1_LHS]],
461463
// CHECK: ret void
462464

@@ -552,17 +554,15 @@ int main() {
552554
// var1 = var1.operator &&(var1_reduction);
553555
// CHECK: [[TO_INT:%.+]] = call i{{[0-9]+}} @{{.+}}([[S_INT_TY]]* [[VAR1_REF]])
554556
// CHECK: [[VAR1_BOOL:%.+]] = icmp ne i{{[0-9]+}} [[TO_INT]], 0
555-
// CHECK: br i1 [[VAR1_BOOL]], label %[[TRUE:.+]], label %[[FALSE:.+]]
557+
// CHECK: br i1 [[VAR1_BOOL]], label %[[TRUE:.+]], label %[[END2:.+]]
556558
// CHECK: [[TRUE]]
557559
// CHECK: [[TO_INT:%.+]] = call i{{[0-9]+}} @{{.+}}([[S_INT_TY]]* [[VAR1_PRIV]])
558560
// CHECK: [[VAR1_REDUCTION_BOOL:%.+]] = icmp ne i{{[0-9]+}} [[TO_INT]], 0
559-
// CHECK: br i1 [[VAR1_REDUCTION_BOOL]], label %[[TRUE2:.+]], label %[[FALSE2:.+]]
560-
// CHECK: [[TRUE2]]
561-
// CHECK: br label %[[END2:.+]]
562-
// CHECK: [[FALSE2]]
563561
// CHECK: br label %[[END2]]
564562
// CHECK: [[END2]]
565-
// CHECK: [[COND_LVALUE:%.+]] = phi [[S_INT_TY]]* [ [[VAR1_REF]], %[[TRUE2]] ], [ [[VAR1_PRIV]], %[[FALSE2]] ]
563+
// CHECK: [[COND_LVALUE:%.+]] = phi i1 [ false, %{{.+}} ], [ [[VAR1_REDUCTION_BOOL]], %[[TRUE]] ]
564+
// CHECK: [[CONV:%.+]] = zext i1 [[COND_LVALUE]] to i32
565+
// CHECK: call void @{{.+}}([[S_INT_TY]]* [[COND_LVALUE:%.+]], i32 [[CONV]])
566566
// CHECK: [[BC1:%.+]] = bitcast [[S_INT_TY]]* [[VAR1_REF]] to i8*
567567
// CHECK: [[BC2:%.+]] = bitcast [[S_INT_TY]]* [[COND_LVALUE]] to i8*
568568
// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[BC1]], i8* [[BC2]], i64 4, i32 4, i1 false)
@@ -571,7 +571,8 @@ int main() {
571571
// CHECK: [[T_VAR1_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[T_VAR1_REF]],
572572
// CHECK: [[T_VAR1_PRIV_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[T_VAR1_PRIV]],
573573
// CHECK: [[CMP:%.+]] = icmp slt i{{[0-9]+}} [[T_VAR1_VAL]], [[T_VAR1_PRIV_VAL]]
574-
// CHECK: [[UP:%.+]] = zext i1 [[CMP]] to i{{[0-9]+}}
574+
// CHECK: br i1 [[CMP]]
575+
// CHECK: [[UP:%.+]] = phi i32
575576
// CHECK: store i{{[0-9]+}} [[UP]], i{{[0-9]+}}* [[T_VAR1_REF]],
576577

577578
// __kmpc_end_reduce_nowait(<loc>, <gtid>, &<lock>);
@@ -597,17 +598,15 @@ int main() {
597598
// CHECK: call void @__kmpc_critical(
598599
// CHECK: [[TO_INT:%.+]] = call i{{[0-9]+}} @{{.+}}([[S_INT_TY]]* [[VAR1_REF]])
599600
// CHECK: [[VAR1_BOOL:%.+]] = icmp ne i{{[0-9]+}} [[TO_INT]], 0
600-
// CHECK: br i1 [[VAR1_BOOL]], label %[[TRUE:.+]], label %[[FALSE:.+]]
601+
// CHECK: br i1 [[VAR1_BOOL]], label %[[TRUE:.+]], label %[[END2:.+]]
601602
// CHECK: [[TRUE]]
602603
// CHECK: [[TO_INT:%.+]] = call i{{[0-9]+}} @{{.+}}([[S_INT_TY]]* [[VAR1_PRIV]])
603604
// CHECK: [[VAR1_REDUCTION_BOOL:%.+]] = icmp ne i{{[0-9]+}} [[TO_INT]], 0
604-
// CHECK: br i1 [[VAR1_REDUCTION_BOOL]], label %[[TRUE2:.+]], label %[[FALSE2:.+]]
605-
// CHECK: [[TRUE2]]
606-
// CHECK: br label %[[END2:.+]]
607-
// CHECK: [[FALSE2]]
608605
// CHECK: br label %[[END2]]
609606
// CHECK: [[END2]]
610-
// CHECK: [[COND_LVALUE:%.+]] = phi [[S_INT_TY]]* [ [[VAR1_REF]], %[[TRUE2]] ], [ [[VAR1_PRIV]], %[[FALSE2]] ]
607+
// CHECK: [[COND_LVALUE:%.+]] = phi i1 [ false, %{{.+}} ], [ [[VAR1_REDUCTION_BOOL]], %[[TRUE]] ]
608+
// CHECK: [[CONV:%.+]] = zext i1 [[COND_LVALUE]] to i32
609+
// CHECK: call void @{{.+}}([[S_INT_TY]]* [[COND_LVALUE:%.+]], i32 [[CONV]])
611610
// CHECK: [[BC1:%.+]] = bitcast [[S_INT_TY]]* [[VAR1_REF]] to i8*
612611
// CHECK: [[BC2:%.+]] = bitcast [[S_INT_TY]]* [[COND_LVALUE]] to i8*
613612
// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[BC1]], i8* [[BC2]], i64 4, i32 4, i1 false)
@@ -683,17 +682,15 @@ int main() {
683682
// var1_lhs = var1_lhs.operator &&(var1_rhs);
684683
// CHECK: [[TO_INT:%.+]] = call i{{[0-9]+}} @{{.+}}([[S_INT_TY]]* [[VAR1_LHS]])
685684
// CHECK: [[VAR1_BOOL:%.+]] = icmp ne i{{[0-9]+}} [[TO_INT]], 0
686-
// CHECK: br i1 [[VAR1_BOOL]], label %[[TRUE:.+]], label %[[FALSE:.+]]
685+
// CHECK: br i1 [[VAR1_BOOL]], label %[[TRUE:.+]], label %[[END2:.+]]
687686
// CHECK: [[TRUE]]
688687
// CHECK: [[TO_INT:%.+]] = call i{{[0-9]+}} @{{.+}}([[S_INT_TY]]* [[VAR1_RHS]])
689688
// CHECK: [[VAR1_REDUCTION_BOOL:%.+]] = icmp ne i{{[0-9]+}} [[TO_INT]], 0
690-
// CHECK: br i1 [[VAR1_REDUCTION_BOOL]], label %[[TRUE2:.+]], label %[[FALSE2:.+]]
691-
// CHECK: [[TRUE2]]
692-
// CHECK: br label %[[END2:.+]]
693-
// CHECK: [[FALSE2]]
694689
// CHECK: br label %[[END2]]
695690
// CHECK: [[END2]]
696-
// CHECK: [[COND_LVALUE:%.+]] = phi [[S_INT_TY]]* [ [[VAR1_LHS]], %[[TRUE2]] ], [ [[VAR1_RHS]], %[[FALSE2]] ]
691+
// CHECK: [[COND_LVALUE:%.+]] = phi i1 [ false, %{{.+}} ], [ [[VAR1_REDUCTION_BOOL]], %[[TRUE]] ]
692+
// CHECK: [[CONV:%.+]] = zext i1 [[COND_LVALUE]] to i32
693+
// CHECK: call void @{{.+}}([[S_INT_TY]]* [[COND_LVALUE:%.+]], i32 [[CONV]])
697694
// CHECK: [[BC1:%.+]] = bitcast [[S_INT_TY]]* [[VAR1_LHS]] to i8*
698695
// CHECK: [[BC2:%.+]] = bitcast [[S_INT_TY]]* [[COND_LVALUE]] to i8*
699696
// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[BC1]], i8* [[BC2]], i64 4, i32 4, i1 false)
@@ -702,7 +699,8 @@ int main() {
702699
// CHECK: [[T_VAR1_LHS_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[T_VAR1_LHS]],
703700
// CHECK: [[T_VAR1_RHS_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[T_VAR1_RHS]],
704701
// CHECK: [[CMP:%.+]] = icmp slt i{{[0-9]+}} [[T_VAR1_LHS_VAL]], [[T_VAR1_RHS_VAL]]
705-
// CHECK: [[UP:%.+]] = zext i1 [[CMP]] to i{{[0-9]+}}
702+
// CHECK: br i1 [[CMP]]
703+
// CHECK: [[UP:%.+]] = phi i32
706704
// CHECK: store i{{[0-9]+}} [[UP]], i{{[0-9]+}}* [[T_VAR1_LHS]],
707705
// CHECK: ret void
708706

0 commit comments

Comments
 (0)