Skip to content

Commit b9566b7

Browse files
committed
Account for aligned load/stores
1 parent 8d992ef commit b9566b7

File tree

4 files changed

+34
-55
lines changed

4 files changed

+34
-55
lines changed

clang/lib/CIR/CodeGen/CIRGenExpr.cpp

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1212,32 +1212,6 @@ static std::optional<LValue> emitLValueOrThrowExpression(CIRGenFunction &cgf,
12121212
return cgf.emitLValue(operand);
12131213
}
12141214

1215-
// Handle the case where the condition is a constant evaluatable simple integer,
1216-
// which means we don't have to separately handle the true/false blocks.
1217-
static std::optional<LValue> handleConditionalOperatorLValueSimpleCase(
1218-
CIRGenFunction &cgf, const AbstractConditionalOperator *e) {
1219-
const Expr *condExpr = e->getCond();
1220-
bool condExprBool = false;
1221-
if (cgf.constantFoldsToSimpleInteger(condExpr, condExprBool)) {
1222-
const Expr *live = e->getTrueExpr(), *dead = e->getFalseExpr();
1223-
if (!condExprBool)
1224-
std::swap(live, dead);
1225-
1226-
// If there's a label in the "dead" branch we can't eliminate that as it
1227-
// could be a used jump target.
1228-
if (!cgf.containsLabel(dead)) {
1229-
// If the true case is live, we need to track its region.
1230-
if (condExprBool) {
1231-
assert(!cir::MissingFeatures::incrementProfileCounter());
1232-
}
1233-
// If a throw expression we emit it and return an undefined lvalue
1234-
// because it can't be used.
1235-
return emitLValueOrThrowExpression(cgf, live);
1236-
}
1237-
}
1238-
return std::nullopt;
1239-
}
1240-
12411215
// Create and generate the 3 blocks for a conditional operator.
12421216
// Leaves the 'current block' in the continuation basic block.
12431217
template <typename FuncTy>

clang/lib/CIR/CodeGen/CIRGenFunction.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -879,7 +879,8 @@ class CIRGenFunction : public CIRGenTypeCache {
879879
public:
880880
ConditionalEvaluation(CIRGenFunction &cgf)
881881
: cgf(cgf), insertPt(cgf.builder.saveInsertionPoint()) {}
882-
ConditionalEvaluation(CIRGenFunction &cgf, mlir::OpBuilder::InsertPoint ip) : cgf(cgf), insertPt(ip) {}
882+
ConditionalEvaluation(CIRGenFunction &cgf, mlir::OpBuilder::InsertPoint ip)
883+
: cgf(cgf), insertPt(ip) {}
883884

884885
void beginEvaluation() {
885886
assert(cgf.outermostConditional != this);
@@ -913,9 +914,11 @@ class CIRGenFunction : public CIRGenTypeCache {
913914
{
914915
mlir::OpBuilder::InsertionGuard guard(builder);
915916
builder.restoreInsertionPoint(outermostConditional->getInsertPoint());
916-
assert(!cir::MissingFeatures::opLoadStoreAlignment());
917-
// TODO(cir): This store needs to use the alignment of addr
918-
builder.createStore(value.getLoc(), value, addr.getPointer());
917+
builder.createStore(
918+
value.getLoc(), value, addr,
919+
mlir::IntegerAttr::get(
920+
mlir::IntegerType::get(value.getContext(), 64),
921+
(uint64_t)addr.getAlignment().getAsAlign().value()));
919922
}
920923
}
921924

clang/test/CIR/CodeGen/binop.cpp

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -553,26 +553,27 @@ void b1(bool a, bool b) {
553553
// CIR: [[X:%[0-9]+]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["x", init]
554554
// CIR: cir.store %[[ARG0]], [[A]] : !cir.bool, !cir.ptr<!cir.bool>
555555
// CIR: cir.store %[[ARG1]], [[B]] : !cir.bool, !cir.ptr<!cir.bool>
556-
// CIR: [[AVAL:%[0-9]+]] = cir.load [[A]] : !cir.ptr<!cir.bool>, !cir.bool
556+
// CIR: [[AVAL:%[0-9]+]] = cir.load align(1) [[A]] : !cir.ptr<!cir.bool>, !cir.bool
557557
// CIR: [[RES1:%[0-9]+]] = cir.ternary([[AVAL]], true {
558-
// CIR: [[BVAL:%[0-9]+]] = cir.load [[B]] : !cir.ptr<!cir.bool>, !cir.bool
558+
// CIR: [[BVAL:%[0-9]+]] = cir.load align(1) [[B]] : !cir.ptr<!cir.bool>, !cir.bool
559559
// CIR: cir.yield [[BVAL]] : !cir.bool
560560
// CIR: }, false {
561561
// CIR: [[FALSE:%[0-9]+]] = cir.const #false
562562
// CIR: cir.yield [[FALSE]] : !cir.bool
563563
// CIR: }) : (!cir.bool) -> !cir.bool
564-
// CIR: cir.store [[RES1]], [[X]] : !cir.bool, !cir.ptr<!cir.bool>
565-
// CIR: [[XVAL:%[0-9]+]] = cir.load [[X]] : !cir.ptr<!cir.bool>, !cir.bool
564+
// CIR: cir.store align(1) [[RES1]], [[X]] : !cir.bool, !cir.ptr<!cir.bool>
565+
// CIR: [[XVAL:%[0-9]+]] = cir.load align(1) [[X]] : !cir.ptr<!cir.bool>, !cir.bool
566566
// CIR: [[RES2:%[0-9]+]] = cir.ternary([[XVAL]], true {
567567
// CIR: [[TRUE:%[0-9]+]] = cir.const #true
568568
// CIR: cir.yield [[TRUE]] : !cir.bool
569569
// CIR: }, false {
570-
// CIR: [[BVAL2:%[0-9]+]] = cir.load [[B]] : !cir.ptr<!cir.bool>, !cir.bool
570+
// CIR: [[BVAL2:%[0-9]+]] = cir.load align(1) [[B]] : !cir.ptr<!cir.bool>, !cir.bool
571571
// CIR: cir.yield [[BVAL2]] : !cir.bool
572572
// CIR: }) : (!cir.bool) -> !cir.bool
573-
// CIR: cir.store [[RES2]], [[X]] : !cir.bool, !cir.ptr<!cir.bool>
573+
// CIR: cir.store align(1) [[RES2]], [[X]] : !cir.bool, !cir.ptr<!cir.bool>
574574
// CIR: cir.return
575575

576+
576577
// LLVM-LABEL: define void @_Z2b1bb(
577578
// LLVM-SAME: i1 %[[ARG0:[0-9]+]], i1 %[[ARG1:[0-9]+]])
578579
// LLVM: %[[A_ADDR:.*]] = alloca i8, i64 1
@@ -632,34 +633,35 @@ void b3(int a, int b, int c, int d) {
632633
// CIR: cir.store %[[ARG1]], [[B]] : !s32i, !cir.ptr<!s32i>
633634
// CIR: cir.store %[[ARG2]], [[C]] : !s32i, !cir.ptr<!s32i>
634635
// CIR: cir.store %[[ARG3]], [[D]] : !s32i, !cir.ptr<!s32i>
635-
// CIR: [[AVAL1:%[0-9]+]] = cir.load [[A]] : !cir.ptr<!s32i>, !s32i
636-
// CIR: [[BVAL1:%[0-9]+]] = cir.load [[B]] : !cir.ptr<!s32i>, !s32i
636+
// CIR: [[AVAL1:%[0-9]+]] = cir.load align(4) [[A]] : !cir.ptr<!s32i>, !s32i
637+
// CIR: [[BVAL1:%[0-9]+]] = cir.load align(4) [[B]] : !cir.ptr<!s32i>, !s32i
637638
// CIR: [[CMP1:%[0-9]+]] = cir.cmp(eq, [[AVAL1]], [[BVAL1]]) : !s32i, !cir.bool
638639
// CIR: [[AND_RESULT:%[0-9]+]] = cir.ternary([[CMP1]], true {
639-
// CIR: [[CVAL1:%[0-9]+]] = cir.load [[C]] : !cir.ptr<!s32i>, !s32i
640-
// CIR: [[DVAL1:%[0-9]+]] = cir.load [[D]] : !cir.ptr<!s32i>, !s32i
640+
// CIR: [[CVAL1:%[0-9]+]] = cir.load align(4) [[C]] : !cir.ptr<!s32i>, !s32i
641+
// CIR: [[DVAL1:%[0-9]+]] = cir.load align(4) [[D]] : !cir.ptr<!s32i>, !s32i
641642
// CIR: [[CMP2:%[0-9]+]] = cir.cmp(eq, [[CVAL1]], [[DVAL1]]) : !s32i, !cir.bool
642643
// CIR: cir.yield [[CMP2]] : !cir.bool
643644
// CIR: }, false {
644645
// CIR: [[FALSE:%[0-9]+]] = cir.const #false
645646
// CIR: cir.yield [[FALSE]] : !cir.bool
646647
// CIR: }) : (!cir.bool) -> !cir.bool
647-
// CIR: cir.store [[AND_RESULT]], [[X]] : !cir.bool, !cir.ptr<!cir.bool>
648-
// CIR: [[AVAL2:%[0-9]+]] = cir.load [[A]] : !cir.ptr<!s32i>, !s32i
649-
// CIR: [[BVAL2:%[0-9]+]] = cir.load [[B]] : !cir.ptr<!s32i>, !s32i
648+
// CIR: cir.store align(1) [[AND_RESULT]], [[X]] : !cir.bool, !cir.ptr<!cir.bool>
649+
// CIR: [[AVAL2:%[0-9]+]] = cir.load align(4) [[A]] : !cir.ptr<!s32i>, !s32i
650+
// CIR: [[BVAL2:%[0-9]+]] = cir.load align(4) [[B]] : !cir.ptr<!s32i>, !s32i
650651
// CIR: [[CMP3:%[0-9]+]] = cir.cmp(eq, [[AVAL2]], [[BVAL2]]) : !s32i, !cir.bool
651652
// CIR: [[OR_RESULT:%[0-9]+]] = cir.ternary([[CMP3]], true {
652653
// CIR: [[TRUE:%[0-9]+]] = cir.const #true
653654
// CIR: cir.yield [[TRUE]] : !cir.bool
654655
// CIR: }, false {
655-
// CIR: [[CVAL2:%[0-9]+]] = cir.load [[C]] : !cir.ptr<!s32i>, !s32i
656-
// CIR: [[DVAL2:%[0-9]+]] = cir.load [[D]] : !cir.ptr<!s32i>, !s32i
656+
// CIR: [[CVAL2:%[0-9]+]] = cir.load align(4) [[C]] : !cir.ptr<!s32i>, !s32i
657+
// CIR: [[DVAL2:%[0-9]+]] = cir.load align(4) [[D]] : !cir.ptr<!s32i>, !s32i
657658
// CIR: [[CMP4:%[0-9]+]] = cir.cmp(eq, [[CVAL2]], [[DVAL2]]) : !s32i, !cir.bool
658659
// CIR: cir.yield [[CMP4]] : !cir.bool
659660
// CIR: }) : (!cir.bool) -> !cir.bool
660-
// CIR: cir.store [[OR_RESULT]], [[X]] : !cir.bool, !cir.ptr<!cir.bool>
661+
// CIR: cir.store align(1) [[OR_RESULT]], [[X]] : !cir.bool, !cir.ptr<!cir.bool>
661662
// CIR: cir.return
662663

664+
663665
// LLVM-LABEL: define void @_Z2b3iiii(
664666
// LLVM-SAME: i32 %[[ARG0:[0-9]+]], i32 %[[ARG1:[0-9]+]], i32 %[[ARG2:[0-9]+]], i32 %[[ARG3:[0-9]+]])
665667
// LLVM: %[[A_ADDR:.*]] = alloca i32, i64 1

clang/test/CIR/CodeGen/ternary.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ int x(int y) {
99

1010
// CIR-LABEL: cir.func @_Z1xi(
1111
// CIR-SAME: %[[ARG0:.*]]: !s32i {{.*}}) -> !s32i {
12-
// CIR: [[Y:%[0-9]+]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["y", init]
13-
// CIR: [[RETVAL:%[0-9]+]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["__retval"]
12+
// CIR: [[Y:%[0-9]+]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["y", init] {alignment = 4 : i64}
13+
// CIR: [[RETVAL:%[0-9]+]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["__retval"] {alignment = 4 : i64}
1414
// CIR: cir.store %[[ARG0]], [[Y]] : !s32i, !cir.ptr<!s32i>
15-
// CIR: [[YVAL:%[0-9]+]] = cir.load [[Y]] : !cir.ptr<!s32i>, !s32i
15+
// CIR: [[YVAL:%[0-9]+]] = cir.load align(4) [[Y]] : !cir.ptr<!s32i>, !s32i
1616
// CIR: [[ZERO:%[0-9]+]] = cir.const #cir.int<0> : !s32i
1717
// CIR: [[CMP:%[0-9]+]] = cir.cmp(gt, [[YVAL]], [[ZERO]]) : !s32i, !cir.bool
1818
// CIR: [[THREE:%[0-9]+]] = cir.const #cir.int<3> : !s32i
@@ -42,20 +42,20 @@ int foo(int a, int b) {
4242

4343
// CIR-LABEL: cir.func @_Z3fooii(
4444
// CIR-SAME: %[[ARG0:.*]]: !s32i {{.*}}, %[[ARG1:.*]]: !s32i {{.*}}) -> !s32i {
45-
// CIR: [[A:%[0-9]+]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["a", init]
46-
// CIR: [[B:%[0-9]+]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["b", init]
47-
// CIR: [[RETVAL:%[0-9]+]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["__retval"]
45+
// CIR: [[A:%[0-9]+]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["a", init] {alignment = 4 : i64}
46+
// CIR: [[B:%[0-9]+]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["b", init] {alignment = 4 : i64}
47+
// CIR: [[RETVAL:%[0-9]+]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["__retval"] {alignment = 4 : i64}
4848
// CIR: cir.store %[[ARG0]], [[A]] : !s32i, !cir.ptr<!s32i>
4949
// CIR: cir.store %[[ARG1]], [[B]] : !s32i, !cir.ptr<!s32i>
5050
// CIR: cir.scope {
51-
// CIR: [[ALOAD:%[0-9]+]] = cir.load [[A]] : !cir.ptr<!s32i>, !s32i
52-
// CIR: [[BLOAD:%[0-9]+]] = cir.load [[B]] : !cir.ptr<!s32i>, !s32i
51+
// CIR: [[ALOAD:%[0-9]+]] = cir.load align(4) [[A]] : !cir.ptr<!s32i>, !s32i
52+
// CIR: [[BLOAD:%[0-9]+]] = cir.load align(4) [[B]] : !cir.ptr<!s32i>, !s32i
5353
// CIR: [[CMP:%[0-9]+]] = cir.cmp(lt, [[ALOAD]], [[BLOAD]]) : !s32i, !cir.bool
5454
// CIR: [[TERNARY_RES:%[0-9]+]] = cir.ternary([[CMP]], true {
5555
// CIR: [[ZERO:%[0-9]+]] = cir.const #cir.int<0> : !s32i
5656
// CIR: cir.yield [[ZERO]] : !s32i
5757
// CIR: }, false {
58-
// CIR: [[ALOAD2:%[0-9]+]] = cir.load [[A]] : !cir.ptr<!s32i>, !s32i
58+
// CIR: [[ALOAD2:%[0-9]+]] = cir.load align(4) [[A]] : !cir.ptr<!s32i>, !s32i
5959
// CIR: cir.yield [[ALOAD2]] : !s32i
6060
// CIR: }) : (!cir.bool) -> !s32i
6161
// CIR: [[CAST:%[0-9]+]] = cir.cast(int_to_bool, [[TERNARY_RES]] : !s32i), !cir.bool

0 commit comments

Comments
 (0)