Skip to content

Commit df9c2bc

Browse files
committed
Reverted to state before ecc0f40.
1 parent 7e60e8f commit df9c2bc

File tree

7 files changed

+36
-75
lines changed

7 files changed

+36
-75
lines changed

clang/lib/CodeGen/CGAtomic.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -590,7 +590,21 @@ static void EmitAtomicOp(CodeGenFunction &CGF, AtomicExpr *E, Address Dest,
590590
llvm::LoadInst *Load = CGF.Builder.CreateLoad(Ptr);
591591
Load->setAtomic(Order, Scope);
592592
Load->setVolatile(E->isVolatile());
593+
594+
QualType Ty = E->getValueType();
595+
if (CGF.CGM.getCodeGenOpts().OptimizationLevel > 0 && Ty->isBooleanType()) {
596+
llvm::MDBuilder MDHelper(CGF.getLLVMContext());
597+
llvm::APInt BooleanMin = llvm::APInt(CGF.getContext().getTypeSize(Ty), 0);
598+
llvm::APInt BooleanEnd = llvm::APInt(CGF.getContext().getTypeSize(Ty), 2);
599+
if (llvm::MDNode *RangeInfo =
600+
MDHelper.createRange(BooleanMin, BooleanEnd)) {
601+
Load->setMetadata(llvm::LLVMContext::MD_range, RangeInfo);
602+
Load->setMetadata(llvm::LLVMContext::MD_noundef,
603+
llvm::MDNode::get(CGF.getLLVMContext(), {}));
604+
}
605+
}
593606
CGF.Builder.CreateStore(Load, Dest);
607+
594608
return;
595609
}
596610

clang/lib/CodeGen/CGExpr.cpp

Lines changed: 2 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -2077,57 +2077,6 @@ llvm::Value *CodeGenFunction::EmitToMemory(llvm::Value *Value, QualType Ty) {
20772077
return Value;
20782078
}
20792079

2080-
static bool isSafeNUWTrunc(llvm::Value *V, llvm::Type *DestTy) {
2081-
if (!V || !DestTy || !DestTy->isIntegerTy())
2082-
return false;
2083-
2084-
unsigned SrcBits = V->getType()->getIntegerBitWidth();
2085-
unsigned DestBits = DestTy->getIntegerBitWidth();
2086-
2087-
if (DestBits >= SrcBits)
2088-
return false;
2089-
if (V->getType()->isIntegerTy(1))
2090-
return true;
2091-
if (llvm::ZExtInst *Zext = dyn_cast<llvm::ZExtInst>(V)) {
2092-
if (Zext->getSrcTy()->isIntegerTy(1) && DestBits == 1)
2093-
return true;
2094-
}
2095-
if (llvm::LoadInst *I = dyn_cast<llvm::LoadInst>(V)) {
2096-
if (llvm::MDNode *RangeMD = I->getMetadata(llvm::LLVMContext::MD_range)) {
2097-
if (RangeMD->getNumOperands() == 2) {
2098-
llvm::ConstantAsMetadata *LowMD =
2099-
cast<llvm::ConstantAsMetadata>(RangeMD->getOperand(0));
2100-
llvm::ConstantAsMetadata *HighMD =
2101-
cast<llvm::ConstantAsMetadata>(RangeMD->getOperand(1));
2102-
2103-
if (LowMD && HighMD) {
2104-
llvm::ConstantInt *LowConst =
2105-
dyn_cast<llvm::ConstantInt>(LowMD->getValue());
2106-
llvm::ConstantInt *HighConst =
2107-
dyn_cast<llvm::ConstantInt>(HighMD->getValue());
2108-
2109-
if (LowConst && HighConst) {
2110-
llvm::APInt HighVal = HighConst->getValue();
2111-
llvm::APInt MaxVal =
2112-
llvm::APInt(HighVal.getBitWidth(), 1ULL << DestBits);
2113-
2114-
if (HighVal.ule(MaxVal)) {
2115-
return true;
2116-
}
2117-
}
2118-
}
2119-
}
2120-
}
2121-
}
2122-
2123-
if (llvm::ConstantInt *CI = dyn_cast<llvm::ConstantInt>(V)) {
2124-
llvm::APInt Val = CI->getValue();
2125-
return Val.ule(llvm::APInt::getMaxValue(DestBits));
2126-
}
2127-
2128-
return false;
2129-
}
2130-
21312080
/// Converts a scalar value from its load/store type (as returned
21322081
/// by convertTypeForLoadStore) to its primary IR type (as returned
21332082
/// by ConvertType).
@@ -2146,11 +2095,9 @@ llvm::Value *CodeGenFunction::EmitFromMemory(llvm::Value *Value, QualType Ty) {
21462095
}
21472096

21482097
llvm::Type *ResTy = ConvertType(Ty);
2149-
bool IsSafe = isSafeNUWTrunc(Value, ResTy);
21502098
if (Ty->hasBooleanRepresentation() || Ty->isBitIntType() ||
2151-
Ty->isExtVectorBoolType()) {
2152-
return Builder.CreateTrunc(Value, ResTy, "loadedv", /*IsNUW*/ IsSafe);
2153-
}
2099+
Ty->isExtVectorBoolType())
2100+
return Builder.CreateTrunc(Value, ResTy, "loadedv");
21542101

21552102
return Value;
21562103
}

clang/test/C/drs/dr335.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,6 @@ void dr335(void) {
4545
// CHECK-NEXT: %[[CLEAR2:.+]] = and i8 %[[LOAD2]], -2
4646
// CHECK-NEXT: %[[SET:.+]] = or i8 %[[CLEAR2]], %[[ZERO]]
4747
// CHECK-NEXT: store i8 %[[SET]], ptr {{.+}}, align 1
48-
// CHECK-NEXT: {{.+}} = trunc nuw i8 %[[ZERO]] to i1
48+
// CHECK-NEXT: {{.+}} = trunc i8 %[[ZERO]] to i1
4949
}
5050

clang/test/CodeGen/PowerPC/bool_test.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ void f(_Bool *x, _Bool *y) {
1010

1111
// CHECK-LABEL: define{{.*}} void @f(
1212
// CHECK: [[FROMMEM:%.*]] = load i8, ptr %
13-
// CHECK: [[BOOLVAL:%.*]] = trunc nuw i8 [[FROMMEM]] to i1
13+
// CHECK: [[BOOLVAL:%.*]] = trunc i8 [[FROMMEM]] to i1
1414
// CHECK: [[TOMEM:%.*]] = zext i1 [[BOOLVAL]] to i8
1515
// CHECK: store i8 [[TOMEM]]
1616
// CHECK: ret void

clang/test/CodeGen/atomic-ops-load.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
extern bool t1;
55
bool test1(void) {
66
// CHECK-LABEL: define{{.*}} i1 @test1
7-
// CHECK: load atomic i8, ptr @t1 monotonic, align 1
7+
// CHECK: load atomic i8, ptr @t1 monotonic, align 1, !range ![[$WS_RANGE:[0-9]*]], !noundef !{{[0-9]+}}
88
// CHECK-NEXT: trunc nuw i8 %{{.*}} to i1
99
// CHECK-NEXT: ret i1 %{{.*}}
1010
return __atomic_load_n(&t1, __ATOMIC_RELAXED);

clang/test/CodeGenCXX/attr-likelihood-if-branch-weights.cpp

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ extern bool B();
1010
// CHECK-NEXT: entry:
1111
// CHECK-NEXT: [[RETVAL:%.*]] = alloca i1, align 1
1212
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[TBAA2:![0-9]+]], !range [[RNG6:![0-9]+]]
13-
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc nuw i8 [[TMP0]] to i1
13+
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc i8 [[TMP0]] to i1
1414
// CHECK-NEXT: [[TOBOOL_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[TOBOOL]], i1 true)
1515
// CHECK-NEXT: br i1 [[TOBOOL_EXPVAL]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
1616
// CHECK: if.then:
@@ -37,7 +37,7 @@ bool f() {
3737
// CHECK-NEXT: entry:
3838
// CHECK-NEXT: [[RETVAL:%.*]] = alloca i1, align 1
3939
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[TBAA2]], !range [[RNG6]]
40-
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc nuw i8 [[TMP0]] to i1
40+
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc i8 [[TMP0]] to i1
4141
// CHECK-NEXT: [[TOBOOL_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[TOBOOL]], i1 false)
4242
// CHECK-NEXT: br i1 [[TOBOOL_EXPVAL]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
4343
// CHECK: if.then:
@@ -65,7 +65,7 @@ bool g() {
6565
// CHECK-NEXT: entry:
6666
// CHECK-NEXT: [[RETVAL:%.*]] = alloca i1, align 1
6767
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[TBAA2]], !range [[RNG6]]
68-
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc nuw i8 [[TMP0]] to i1
68+
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc i8 [[TMP0]] to i1
6969
// CHECK-NEXT: [[TOBOOL_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[TOBOOL]], i1 false)
7070
// CHECK-NEXT: br i1 [[TOBOOL_EXPVAL]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
7171
// CHECK: if.then:
@@ -90,7 +90,7 @@ bool h() {
9090
// CHECK-LABEL: @_Z8NullStmtv(
9191
// CHECK-NEXT: entry:
9292
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[TBAA2]], !range [[RNG6]]
93-
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc nuw i8 [[TMP0]] to i1
93+
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc i8 [[TMP0]] to i1
9494
// CHECK-NEXT: [[TOBOOL_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[TOBOOL]], i1 false)
9595
// CHECK-NEXT: br i1 [[TOBOOL_EXPVAL]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
9696
// CHECK: if.then:
@@ -113,7 +113,7 @@ void NullStmt() {
113113
// CHECK-LABEL: @_Z6IfStmtv(
114114
// CHECK-NEXT: entry:
115115
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[TBAA2]], !range [[RNG6]]
116-
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc nuw i8 [[TMP0]] to i1
116+
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc i8 [[TMP0]] to i1
117117
// CHECK-NEXT: [[TOBOOL_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[TOBOOL]], i1 false)
118118
// CHECK-NEXT: br i1 [[TOBOOL_EXPVAL]], label [[IF_THEN:%.*]], label [[IF_END2:%.*]]
119119
// CHECK: if.then:
@@ -125,7 +125,7 @@ void NullStmt() {
125125
// CHECK-NEXT: br label [[IF_END2]]
126126
// CHECK: if.end2:
127127
// CHECK-NEXT: [[TMP1:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[TBAA2]], !range [[RNG6]]
128-
// CHECK-NEXT: [[TOBOOL3:%.*]] = trunc nuw i8 [[TMP1]] to i1
128+
// CHECK-NEXT: [[TOBOOL3:%.*]] = trunc i8 [[TMP1]] to i1
129129
// CHECK-NEXT: br i1 [[TOBOOL3]], label [[IF_THEN4:%.*]], label [[IF_END8:%.*]]
130130
// CHECK: if.then4:
131131
// CHECK-NEXT: [[CALL5:%.*]] = call noundef zeroext i1 @_Z1Bv()
@@ -152,7 +152,7 @@ void IfStmt() {
152152
// CHECK-LABEL: @_Z9WhileStmtv(
153153
// CHECK-NEXT: entry:
154154
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[TBAA2]], !range [[RNG6]]
155-
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc nuw i8 [[TMP0]] to i1
155+
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc i8 [[TMP0]] to i1
156156
// CHECK-NEXT: [[TOBOOL_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[TOBOOL]], i1 false)
157157
// CHECK-NEXT: br i1 [[TOBOOL_EXPVAL]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
158158
// CHECK: if.then:
@@ -166,7 +166,7 @@ void IfStmt() {
166166
// CHECK-NEXT: br label [[IF_END]]
167167
// CHECK: if.end:
168168
// CHECK-NEXT: [[TMP1:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[TBAA2]], !range [[RNG6]]
169-
// CHECK-NEXT: [[TOBOOL1:%.*]] = trunc nuw i8 [[TMP1]] to i1
169+
// CHECK-NEXT: [[TOBOOL1:%.*]] = trunc i8 [[TMP1]] to i1
170170
// CHECK-NEXT: br i1 [[TOBOOL1]], label [[IF_THEN2:%.*]], label [[IF_END7:%.*]]
171171
// CHECK: if.then2:
172172
// CHECK-NEXT: br label [[WHILE_COND3:%.*]]
@@ -194,7 +194,7 @@ void WhileStmt() {
194194
// CHECK-LABEL: @_Z6DoStmtv(
195195
// CHECK-NEXT: entry:
196196
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[TBAA2]], !range [[RNG6]]
197-
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc nuw i8 [[TMP0]] to i1
197+
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc i8 [[TMP0]] to i1
198198
// CHECK-NEXT: [[TOBOOL_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[TOBOOL]], i1 false)
199199
// CHECK-NEXT: br i1 [[TOBOOL_EXPVAL]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
200200
// CHECK: if.then:
@@ -208,7 +208,7 @@ void WhileStmt() {
208208
// CHECK-NEXT: br label [[IF_END]]
209209
// CHECK: if.end:
210210
// CHECK-NEXT: [[TMP1:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[TBAA2]], !range [[RNG6]]
211-
// CHECK-NEXT: [[TOBOOL1:%.*]] = trunc nuw i8 [[TMP1]] to i1
211+
// CHECK-NEXT: [[TOBOOL1:%.*]] = trunc i8 [[TMP1]] to i1
212212
// CHECK-NEXT: br i1 [[TOBOOL1]], label [[IF_THEN2:%.*]], label [[IF_END7:%.*]]
213213
// CHECK: if.then2:
214214
// CHECK-NEXT: br label [[DO_BODY3:%.*]]
@@ -237,7 +237,7 @@ void DoStmt() {
237237
// CHECK-LABEL: @_Z7ForStmtv(
238238
// CHECK-NEXT: entry:
239239
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[TBAA2]], !range [[RNG6]]
240-
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc nuw i8 [[TMP0]] to i1
240+
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc i8 [[TMP0]] to i1
241241
// CHECK-NEXT: [[TOBOOL_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[TOBOOL]], i1 false)
242242
// CHECK-NEXT: br i1 [[TOBOOL_EXPVAL]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
243243
// CHECK: if.then:
@@ -251,7 +251,7 @@ void DoStmt() {
251251
// CHECK-NEXT: br label [[IF_END]]
252252
// CHECK: if.end:
253253
// CHECK-NEXT: [[TMP1:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[TBAA2]], !range [[RNG6]]
254-
// CHECK-NEXT: [[TOBOOL1:%.*]] = trunc nuw i8 [[TMP1]] to i1
254+
// CHECK-NEXT: [[TOBOOL1:%.*]] = trunc i8 [[TMP1]] to i1
255255
// CHECK-NEXT: br i1 [[TOBOOL1]], label [[IF_THEN2:%.*]], label [[IF_END7:%.*]]
256256
// CHECK: if.then2:
257257
// CHECK-NEXT: br label [[FOR_COND3:%.*]]
@@ -278,7 +278,7 @@ void ForStmt() {
278278
// CHECK-LABEL: @_Z8GotoStmtv(
279279
// CHECK-NEXT: entry:
280280
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[TBAA2]], !range [[RNG6]]
281-
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc nuw i8 [[TMP0]] to i1
281+
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc i8 [[TMP0]] to i1
282282
// CHECK-NEXT: [[TOBOOL_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[TOBOOL]], i1 false)
283283
// CHECK-NEXT: br i1 [[TOBOOL_EXPVAL]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
284284
// CHECK: if.then:
@@ -304,7 +304,7 @@ end:;
304304
// CHECK-LABEL: @_Z10ReturnStmtv(
305305
// CHECK-NEXT: entry:
306306
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[TBAA2]], !range [[RNG6]]
307-
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc nuw i8 [[TMP0]] to i1
307+
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc i8 [[TMP0]] to i1
308308
// CHECK-NEXT: [[TOBOOL_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[TOBOOL]], i1 false)
309309
// CHECK-NEXT: br i1 [[TOBOOL_EXPVAL]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
310310
// CHECK: if.then:
@@ -327,7 +327,7 @@ void ReturnStmt() {
327327
// CHECK-LABEL: @_Z10SwitchStmtv(
328328
// CHECK-NEXT: entry:
329329
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[TBAA2]], !range [[RNG6]]
330-
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc nuw i8 [[TMP0]] to i1
330+
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc i8 [[TMP0]] to i1
331331
// CHECK-NEXT: [[TOBOOL_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[TOBOOL]], i1 false)
332332
// CHECK-NEXT: br i1 [[TOBOOL_EXPVAL]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
333333
// CHECK: if.then:
@@ -341,7 +341,7 @@ void ReturnStmt() {
341341
// CHECK-NEXT: br label [[IF_END]]
342342
// CHECK: if.end:
343343
// CHECK-NEXT: [[TMP2:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[TBAA2]], !range [[RNG6]]
344-
// CHECK-NEXT: [[TOBOOL1:%.*]] = trunc nuw i8 [[TMP2]] to i1
344+
// CHECK-NEXT: [[TOBOOL1:%.*]] = trunc i8 [[TMP2]] to i1
345345
// CHECK-NEXT: br i1 [[TOBOOL1]], label [[IF_THEN2:%.*]], label [[IF_ELSE4:%.*]]
346346
// CHECK: if.then2:
347347
// CHECK-NEXT: [[TMP3:%.*]] = load volatile i32, ptr @i, align 4, !tbaa [[TBAA15]]

clang/test/CodeGenObjC/arc-ternary-op.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ void test0(_Bool cond) {
1414
// CHECK-NEXT: store
1515
// CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 8, ptr [[X]])
1616
// CHECK-NEXT: [[T0:%.*]] = load i8, ptr [[COND]]
17-
// CHECK-NEXT: [[T1:%.*]] = trunc nuw i8 [[T0]] to i1
17+
// CHECK-NEXT: [[T1:%.*]] = trunc i8 [[T0]] to i1
1818
// CHECK-NEXT: store i1 false, ptr [[RELCOND]]
1919
// CHECK-NEXT: br i1 [[T1]],
2020
// CHECK: br label

0 commit comments

Comments
 (0)