Skip to content

Commit ecc0f40

Browse files
committed
Reverted adding range! metadata from 852b691. Added isSafeNUWTrunc helper to EmitFromMemory to allow adding nuw to load when safe.
1 parent c95f16c commit ecc0f40

File tree

7 files changed

+76
-36
lines changed

7 files changed

+76
-36
lines changed

clang/lib/CodeGen/CGAtomic.cpp

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -590,20 +590,6 @@ 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-
}
606-
607593
CGF.Builder.CreateStore(Load, Dest);
608594
return;
609595
}

clang/lib/CodeGen/CGExpr.cpp

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2093,6 +2093,57 @@ llvm::Value *CodeGenFunction::EmitToMemory(llvm::Value *Value, QualType Ty) {
20932093
return Value;
20942094
}
20952095

2096+
static bool isSafeNUWTrunc(llvm::Value *V, llvm::Type *DestTy) {
2097+
if (!V || !DestTy || !DestTy->isIntegerTy())
2098+
return false;
2099+
2100+
unsigned SrcBits = V->getType()->getIntegerBitWidth();
2101+
unsigned DestBits = DestTy->getIntegerBitWidth();
2102+
2103+
if (DestBits >= SrcBits)
2104+
return false;
2105+
if (V->getType()->isIntegerTy(1))
2106+
return true;
2107+
if (llvm::ZExtInst *Zext = dyn_cast<llvm::ZExtInst>(V)) {
2108+
if (Zext->getSrcTy()->isIntegerTy(1) && DestBits == 1)
2109+
return true;
2110+
}
2111+
if (llvm::LoadInst *I = dyn_cast<llvm::LoadInst>(V)) {
2112+
if (llvm::MDNode *RangeMD = I->getMetadata(llvm::LLVMContext::MD_range)) {
2113+
if (RangeMD->getNumOperands() == 2) {
2114+
llvm::ConstantAsMetadata *LowMD =
2115+
cast<llvm::ConstantAsMetadata>(RangeMD->getOperand(0));
2116+
llvm::ConstantAsMetadata *HighMD =
2117+
cast<llvm::ConstantAsMetadata>(RangeMD->getOperand(1));
2118+
2119+
if (LowMD && HighMD) {
2120+
llvm::ConstantInt *LowConst =
2121+
dyn_cast<llvm::ConstantInt>(LowMD->getValue());
2122+
llvm::ConstantInt *HighConst =
2123+
dyn_cast<llvm::ConstantInt>(HighMD->getValue());
2124+
2125+
if (LowConst && HighConst) {
2126+
llvm::APInt HighVal = HighConst->getValue();
2127+
llvm::APInt MaxVal =
2128+
llvm::APInt(HighVal.getBitWidth(), 1ULL << DestBits);
2129+
2130+
if (HighVal.ule(MaxVal)) {
2131+
return true;
2132+
}
2133+
}
2134+
}
2135+
}
2136+
}
2137+
}
2138+
2139+
if (llvm::ConstantInt *CI = dyn_cast<llvm::ConstantInt>(V)) {
2140+
llvm::APInt Val = CI->getValue();
2141+
return Val.ule(llvm::APInt::getMaxValue(DestBits));
2142+
}
2143+
2144+
return false;
2145+
}
2146+
20962147
/// Converts a scalar value from its load/store type (as returned
20972148
/// by convertTypeForLoadStore) to its primary IR type (as returned
20982149
/// by ConvertType).
@@ -2111,9 +2162,12 @@ llvm::Value *CodeGenFunction::EmitFromMemory(llvm::Value *Value, QualType Ty) {
21112162
}
21122163

21132164
llvm::Type *ResTy = ConvertType(Ty);
2165+
bool IsSafe = isSafeNUWTrunc(Value, ResTy);
2166+
21142167
if (hasBooleanRepresentation(Ty) || Ty->isBitIntType() ||
2115-
Ty->isExtVectorBoolType())
2116-
return Builder.CreateTrunc(Value, ResTy, "loadedv");
2168+
Ty->isExtVectorBoolType()) {
2169+
return Builder.CreateTrunc(Value, ResTy, "loadedv", /*IsNUW*/ IsSafe);
2170+
}
21172171

21182172
return Value;
21192173
}

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 i8 %[[ZERO]] to i1
48+
// CHECK-NEXT: {{.+}} = trunc nuw 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 i8 [[FROMMEM]] to i1
13+
// CHECK: [[BOOLVAL:%.*]] = trunc nuw 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, !range ![[$WS_RANGE:[0-9]*]], !noundef !{{[0-9]+}}
7+
// CHECK: load atomic i8, ptr @t1 monotonic, align 1
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 i8 [[TMP0]] to i1
13+
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc nuw 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 i8 [[TMP0]] to i1
40+
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc nuw 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 i8 [[TMP0]] to i1
68+
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc nuw 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 i8 [[TMP0]] to i1
93+
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc nuw 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 i8 [[TMP0]] to i1
116+
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc nuw 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 i8 [[TMP1]] to i1
128+
// CHECK-NEXT: [[TOBOOL3:%.*]] = trunc nuw 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 i8 [[TMP0]] to i1
155+
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc nuw 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 i8 [[TMP1]] to i1
169+
// CHECK-NEXT: [[TOBOOL1:%.*]] = trunc nuw 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 i8 [[TMP0]] to i1
197+
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc nuw 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 i8 [[TMP1]] to i1
211+
// CHECK-NEXT: [[TOBOOL1:%.*]] = trunc nuw 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 i8 [[TMP0]] to i1
240+
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc nuw 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 i8 [[TMP1]] to i1
254+
// CHECK-NEXT: [[TOBOOL1:%.*]] = trunc nuw 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 i8 [[TMP0]] to i1
281+
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc nuw 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 i8 [[TMP0]] to i1
307+
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc nuw 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 i8 [[TMP0]] to i1
330+
// CHECK-NEXT: [[TOBOOL:%.*]] = trunc nuw 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 i8 [[TMP2]] to i1
344+
// CHECK-NEXT: [[TOBOOL1:%.*]] = trunc nuw 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 i8 [[T0]] to i1
17+
// CHECK-NEXT: [[T1:%.*]] = trunc nuw 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)