Skip to content

Commit c6c8688

Browse files
committed
Use i64 type for the selector and select values.
1 parent 6a7961f commit c6c8688

File tree

3 files changed

+32
-22
lines changed

3 files changed

+32
-22
lines changed

flang/lib/Optimizer/CodeGen/CodeGen.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3573,7 +3573,15 @@ struct SelectOpConversionBase : public fir::FIROpConversion<OP> {
35733573
llvm::SmallVector<mlir::ValueRange> destinationsOperands;
35743574
mlir::Block *defaultDestination;
35753575
mlir::ValueRange defaultOperands;
3576-
llvm::SmallVector<int32_t> caseValues;
3576+
// LLVM::SwitchOp selector type and the case values types
3577+
// must have the same bit width, so cast the selector to i64,
3578+
// and use i64 for the case values. It is hard to imagine
3579+
// a computed GO TO with the number of labels in the label-list
3580+
// bigger than INT_MAX, but let's use i64 to be on the safe side.
3581+
// Moreover, fir.select operation is more relaxed than
3582+
// a Fortran computed GO TO, so it may specify such a case value
3583+
// even if there is just a single label/case.
3584+
llvm::SmallVector<int64_t> caseValues;
35773585

35783586
for (unsigned t = 0; t != conds; ++t) {
35793587
mlir::Block *dest = select.getSuccessor(t);
@@ -3600,16 +3608,14 @@ struct SelectOpConversionBase : public fir::FIROpConversion<OP> {
36003608
defaultDestination = *convertedBlock;
36013609
}
36023610

3603-
// LLVM::SwitchOp takes a i32 type for the selector.
3604-
if (select.getSelector().getType() != rewriter.getI32Type())
3605-
selector =
3606-
this->integerCast(loc, rewriter, rewriter.getI32Type(), selector);
3611+
selector =
3612+
this->integerCast(loc, rewriter, rewriter.getI64Type(), selector);
36073613

36083614
rewriter.replaceOpWithNewOp<mlir::LLVM::SwitchOp>(
36093615
select, selector,
36103616
/*defaultDestination=*/defaultDestination,
36113617
/*defaultOperands=*/defaultOperands,
3612-
/*caseValues=*/caseValues,
3618+
/*caseValues=*/rewriter.getI64VectorAttr(caseValues),
36133619
/*caseDestinations=*/destinations,
36143620
/*caseOperands=*/destinationsOperands,
36153621
/*branchWeights=*/llvm::ArrayRef<std::int32_t>());

flang/test/Fir/convert-to-llvm.fir

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -338,8 +338,7 @@ func.func @select(%arg : index, %arg2 : i32) -> i32 {
338338
// CHECK: %[[C0:.*]] = llvm.mlir.constant(1 : i32) : i32
339339
// CHECK: %[[C1:.*]] = llvm.mlir.constant(2 : i32) : i32
340340
// CHECK: %[[C2:.*]] = llvm.mlir.constant(3 : i32) : i32
341-
// CHECK: %[[SELECTOR:.*]] = llvm.trunc %[[SELECTVALUE]] : i{{.*}} to i32
342-
// CHECK: llvm.switch %[[SELECTOR]] : i32, ^bb5 [
341+
// CHECK: llvm.switch %[[SELECTVALUE]] : i64, ^bb5 [
343342
// CHECK: 1: ^bb1(%[[C0]] : i32),
344343
// CHECK: 2: ^bb2(%[[C2]], %[[SELECTVALUE]], %[[ARG1]] : i32, [[IDX]], i32),
345344
// CHECK: 3: ^bb3(%[[ARG1]], %[[C2]] : i32, i32),
@@ -384,7 +383,8 @@ func.func @select_rank(%arg : i32, %arg2 : i32) -> i32 {
384383
// CHECK: %[[C0:.*]] = llvm.mlir.constant(1 : i32) : i32
385384
// CHECK: %[[C1:.*]] = llvm.mlir.constant(2 : i32) : i32
386385
// CHECK: %[[C2:.*]] = llvm.mlir.constant(3 : i32) : i32
387-
// CHECK: llvm.switch %[[SELECTVALUE]] : i32, ^bb5 [
386+
// CHECK: %[[SELECTOR:.*]] = llvm.sext %[[SELECTVALUE]] : i{{.*}} to i64
387+
// CHECK: llvm.switch %[[SELECTOR]] : i64, ^bb5 [
388388
// CHECK: 1: ^bb1(%[[C0]] : i32),
389389
// CHECK: 2: ^bb2(%[[C2]], %[[SELECTVALUE]], %[[ARG1]] : i32, i32, i32),
390390
// CHECK: 3: ^bb3(%[[ARG1]], %[[C2]] : i32, i32),
@@ -2891,32 +2891,36 @@ func.func @select_with_cast(%arg1 : i8, %arg2 : i16, %arg3: i64, %arg4: index) -
28912891
^bb3:
28922892
fir.select %arg4 : index [ 1, ^bb4, unit, ^bb4 ]
28932893
^bb4:
2894+
fir.select %arg3 : i64 [ 4294967296, ^bb5, unit, ^bb5 ]
2895+
^bb5:
28942896
return
28952897
}
28962898
// CHECK-LABEL: llvm.func @select_with_cast(
28972899
// CHECK-SAME: %[[ARG0:.*]]: i8,
28982900
// CHECK-SAME: %[[ARG1:.*]]: i16,
28992901
// CHECK-SAME: %[[ARG2:.*]]: i64,
29002902
// CHECK-SAME: %[[ARG3:.*]]: i64) {
2901-
// CHECK: %[[VAL_0:.*]] = llvm.sext %[[ARG0]] : i8 to i32
2902-
// CHECK: llvm.switch %[[VAL_0]] : i32, ^bb1 [
2903+
// CHECK: %[[VAL_0:.*]] = llvm.sext %[[ARG0]] : i8 to i64
2904+
// CHECK: llvm.switch %[[VAL_0]] : i64, ^bb1 [
29032905
// CHECK: 1: ^bb1
29042906
// CHECK: ]
29052907
// CHECK: ^bb1:
2906-
// CHECK: %[[VAL_1:.*]] = llvm.sext %[[ARG1]] : i16 to i32
2907-
// CHECK: llvm.switch %[[VAL_1]] : i32, ^bb2 [
2908+
// CHECK: %[[VAL_1:.*]] = llvm.sext %[[ARG1]] : i16 to i64
2909+
// CHECK: llvm.switch %[[VAL_1]] : i64, ^bb2 [
29082910
// CHECK: 1: ^bb2
29092911
// CHECK: ]
29102912
// CHECK: ^bb2:
2911-
// CHECK: %[[VAL_2:.*]] = llvm.trunc %[[ARG2]] : i64 to i32
2912-
// CHECK: llvm.switch %[[VAL_2]] : i32, ^bb3 [
2913+
// CHECK: llvm.switch %[[ARG2]] : i64, ^bb3 [
29132914
// CHECK: 1: ^bb3
29142915
// CHECK: ]
29152916
// CHECK: ^bb3:
2916-
// CHECK: %[[VAL_3:.*]] = llvm.trunc %[[ARG3]] : i64 to i32
2917-
// CHECK: llvm.switch %[[VAL_3]] : i32, ^bb4 [
2917+
// CHECK: llvm.switch %[[ARG3]] : i64, ^bb4 [
29182918
// CHECK: 1: ^bb4
29192919
// CHECK: ]
29202920
// CHECK: ^bb4:
2921+
// CHECK: llvm.switch %[[ARG2]] : i64, ^bb5 [
2922+
// CHECK: 4294967296: ^bb5
2923+
// CHECK: ]
2924+
// CHECK: ^bb5:
29212925
// CHECK: llvm.return
29222926
// CHECK: }

flang/test/Fir/select.fir

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
func.func @f(%a : i32) -> i32 {
88
%1 = arith.constant 1 : i32
99
%2 = arith.constant 42 : i32
10-
// CHECK: switch i32 %{{.*}}, label %{{.*}} [
11-
// CHECK: i32 1, label %{{.*}}
10+
// CHECK: switch i64 %{{.*}}, label %{{.*}} [
11+
// CHECK: i64 1, label %{{.*}}
1212
// CHECK: ]
1313
fir.select %a : i32 [1, ^bb2(%1:i32), unit, ^bb3(%2:i32)]
1414
^bb2(%3 : i32) :
@@ -24,9 +24,9 @@ func.func @g(%a : i32) -> i32 {
2424
%1 = arith.constant 1 : i32
2525
%2 = arith.constant 42 : i32
2626

27-
// CHECK: switch i32 %{{.*}}, label %{{.*}} [
28-
// CHECK: i32 1, label %{{.*}}
29-
// CHECK: i32 -1, label %{{.*}}
27+
// CHECK: switch i64 %{{.*}}, label %{{.*}} [
28+
// CHECK: i64 1, label %{{.*}}
29+
// CHECK: i64 -1, label %{{.*}}
3030
// CHECK: ]
3131
fir.select_rank %a : i32 [1, ^bb2(%1:i32), -1, ^bb4, unit, ^bb3(%2:i32)]
3232
^bb2(%3 : i32) :

0 commit comments

Comments
 (0)