Skip to content

Commit 9dc391e

Browse files
committed
Revert "[IR] Mark add constant expressions as undesirable"
This reverts commit f8a36d8. I believe this is causing an assertion failure on the sanitizer-x86_64-linux buildbot: clang++: /b/sanitizer-x86_64-linux/build/llvm-project/llvm/include/llvm/Support/Casting.h:578: decltype(auto) llvm::cast(From *) [To = llvm::BinaryOperator, From = llvm::Value]: Assertion `isa<To>(Val) && "cast<Ty>() argument of incompatible type!"' failed. #10 0x000055bdd7e82408 canonicalizeLogicFirst(llvm::BinaryOperator&, llvm::IRBuilder<llvm::TargetFolder, llvm::IRBuilderCallbackInserter>&) /b/sanitizer-x86_64-linux/build/llvm-project/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp:2131:5 #11 0x000055bdd7e80183 llvm::InstCombinerImpl::visitAnd(llvm::BinaryOperator&) /b/sanitizer-x86_64-linux/build/llvm-project/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp:2661:20 Likely the code is encountering a constant expression in a case it didn't before.
1 parent 8ef0448 commit 9dc391e

File tree

7 files changed

+27
-28
lines changed

7 files changed

+27
-28
lines changed

clang/test/CodeGen/catch-nullptr-and-nonzero-offset.c

+4-8
Original file line numberDiff line numberDiff line change
@@ -303,8 +303,7 @@ char *one_zero(void) {
303303
char *one_one_OK(void) {
304304
// CHECK: define{{.*}} ptr @one_one_OK()
305305
// CHECK-NEXT: [[ENTRY:.*]]:
306-
// CHECK-SANITIZE-C-NEXT: %[[AND:.*]] = and i1 icmp ne (ptr inttoptr (i64 1 to ptr), ptr null), icmp ne (i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 1 to ptr), i64 1) to i64), i64 1), i64 1), i64 0), !nosanitize
307-
// CHECK-SANITIZE-C-NEXT: br i1 %[[AND]], label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize
306+
// CHECK-SANITIZE-C-NEXT: br i1 and (i1 icmp ne (ptr inttoptr (i64 1 to ptr), ptr null), i1 icmp ne (i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 1 to ptr), i64 1) to i64), i64 1), i64 1), i64 0)), label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize
308307
// CHECK-SANITIZE-CPP-NEXT: br i1 xor (i1 icmp eq (ptr inttoptr (i64 1 to ptr), ptr null), i1 icmp ne (i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 1 to ptr), i64 1) to i64), i64 1), i64 1), i64 0)), label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize
309308
// CHECK-SANITIZE: [[HANDLER_POINTER_OVERFLOW]]:
310309
// CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_pointer_overflow_abort(ptr @[[LINE_1100]], i64 1, i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 1 to ptr), i64 1) to i64), i64 1), i64 1))
@@ -322,8 +321,7 @@ char *one_one_OK(void) {
322321
char *one_allones_BAD(void) {
323322
// CHECK: define{{.*}} ptr @one_allones_BAD()
324323
// CHECK-NEXT: [[ENTRY:.*]]:
325-
// CHECK-SANITIZE-C-NEXT: %[[AND:.*]] = and i1 icmp ne (ptr inttoptr (i64 1 to ptr), ptr null), icmp ne (i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 1 to ptr), i64 -1) to i64), i64 1), i64 1), i64 0), !nosanitize
326-
// CHECK-SANITIZE-C-NEXT: br i1 %[[AND]], label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize
324+
// CHECK-SANITIZE-C-NEXT: br i1 and (i1 icmp ne (ptr inttoptr (i64 1 to ptr), ptr null), i1 icmp ne (i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 1 to ptr), i64 -1) to i64), i64 1), i64 1), i64 0)), label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize
327325
// CHECK-SANITIZE-CPP-NEXT: br i1 xor (i1 icmp eq (ptr inttoptr (i64 1 to ptr), ptr null), i1 icmp ne (i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 1 to ptr), i64 -1) to i64), i64 1), i64 1), i64 0)), label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize
328326
// CHECK-SANITIZE: [[HANDLER_POINTER_OVERFLOW]]:
329327
// CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_pointer_overflow_abort(ptr @[[LINE_1200]], i64 1, i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 1 to ptr), i64 -1) to i64), i64 1), i64 1))
@@ -392,8 +390,7 @@ char *allones_zero_OK(void) {
392390
char *allones_one_BAD(void) {
393391
// CHECK: define{{.*}} ptr @allones_one_BAD()
394392
// CHECK-NEXT: [[ENTRY:.*]]:
395-
// CHECK-SANITIZE-C-NEXT: %[[AND:.*]] = and i1 icmp ne (ptr inttoptr (i64 -1 to ptr), ptr null), icmp ne (i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 -1 to ptr), i64 1) to i64), i64 -1), i64 -1), i64 0), !nosanitize
396-
// CHECK-SANITIZE-C-NEXT: br i1 %[[AND]], label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize
393+
// CHECK-SANITIZE-C-NEXT: br i1 and (i1 icmp ne (ptr inttoptr (i64 -1 to ptr), ptr null), i1 icmp ne (i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 -1 to ptr), i64 1) to i64), i64 -1), i64 -1), i64 0)), label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize
397394
// CHECK-SANITIZE-CPP-NEXT: br i1 xor (i1 icmp eq (ptr inttoptr (i64 -1 to ptr), ptr null), i1 icmp ne (i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 -1 to ptr), i64 1) to i64), i64 -1), i64 -1), i64 0)), label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize
398395
// CHECK-SANITIZE: [[HANDLER_POINTER_OVERFLOW]]:
399396
// CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_pointer_overflow_abort(ptr @[[LINE_1500]], i64 -1, i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 -1 to ptr), i64 1) to i64), i64 -1), i64 -1))
@@ -411,8 +408,7 @@ char *allones_one_BAD(void) {
411408
char *allones_allones_OK(void) {
412409
// CHECK: define{{.*}} ptr @allones_allones_OK()
413410
// CHECK-NEXT: [[ENTRY:.*]]:
414-
// CHECK-SANITIZE-C-NEXT: %[[AND:.*]] = and i1 icmp ne (ptr inttoptr (i64 -1 to ptr), ptr null), icmp ne (i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 -1 to ptr), i64 -1) to i64), i64 -1), i64 -1), i64 0), !nosanitize
415-
// CHECK-SANITIZE-C-NEXT: br i1 %[[AND]], label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize
411+
// CHECK-SANITIZE-C-NEXT: br i1 and (i1 icmp ne (ptr inttoptr (i64 -1 to ptr), ptr null), i1 icmp ne (i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 -1 to ptr), i64 -1) to i64), i64 -1), i64 -1), i64 0)), label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize
416412
// CHECK-SANITIZE-CPP-NEXT: br i1 xor (i1 icmp eq (ptr inttoptr (i64 -1 to ptr), ptr null), i1 icmp ne (i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 -1 to ptr), i64 -1) to i64), i64 -1), i64 -1), i64 0)), label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize
417413
// CHECK-SANITIZE: [[HANDLER_POINTER_OVERFLOW]]:
418414
// CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_pointer_overflow_abort(ptr @[[LINE_1600]], i64 -1, i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 -1 to ptr), i64 -1) to i64), i64 -1), i64 -1))

llvm/lib/IR/ConstantFold.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -1241,6 +1241,8 @@ Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode, Constant *C1,
12411241
case Instruction::Add:
12421242
case Instruction::Sub:
12431243
return ConstantExpr::getXor(C1, C2);
1244+
case Instruction::Mul:
1245+
return ConstantExpr::getAnd(C1, C2);
12441246
case Instruction::Shl:
12451247
case Instruction::LShr:
12461248
case Instruction::AShr:

llvm/lib/IR/Constants.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -2288,14 +2288,14 @@ bool ConstantExpr::isDesirableBinOp(unsigned Opcode) {
22882288
case Instruction::FMul:
22892289
case Instruction::FDiv:
22902290
case Instruction::FRem:
2291-
case Instruction::And:
22922291
return false;
22932292
case Instruction::Add:
22942293
case Instruction::Sub:
22952294
case Instruction::Mul:
22962295
case Instruction::Shl:
22972296
case Instruction::LShr:
22982297
case Instruction::AShr:
2298+
case Instruction::And:
22992299
case Instruction::Or:
23002300
case Instruction::Xor:
23012301
return true;

llvm/test/CodeGen/Hexagon/atomic-opaque-basic.ll

+16-12
Original file line numberDiff line numberDiff line change
@@ -63,30 +63,34 @@ define void @f1() #0 {
6363
; CHECK: .cfi_startproc
6464
; CHECK-NEXT: // %bb.0: // %entry
6565
; CHECK-NEXT: {
66-
; CHECK-NEXT: r3 = ##g0
67-
; CHECK-NEXT: r1:0 = combine(#1,##255)
66+
; CHECK-NEXT: r2 = ##g0
67+
; CHECK-NEXT: r0 = #255
6868
; CHECK-NEXT: }
6969
; CHECK-NEXT: {
70-
; CHECK-NEXT: r2 = and(r3,#3)
71-
; CHECK-NEXT: r3 = and(r3,#-4)
70+
; CHECK-NEXT: r1 = and(r2,#3)
7271
; CHECK-NEXT: }
7372
; CHECK-NEXT: {
74-
; CHECK-NEXT: r2 = asl(r2,#3)
73+
; CHECK-NEXT: r1 = asl(r1,#3)
74+
; CHECK-NEXT: }
75+
; CHECK-NEXT: {
76+
; CHECK-NEXT: r4 = r1
7577
; CHECK-NEXT: }
7678
; CHECK-NEXT: {
77-
; CHECK-NEXT: r4 = asl(r0,r2)
79+
; CHECK-NEXT: r4 = insert(r2,#2,#3)
80+
; CHECK-NEXT: r2 = and(r2,#-4)
7881
; CHECK-NEXT: }
7982
; CHECK-NEXT: {
80-
; CHECK-NEXT: r4 = sub(#-1,r4)
83+
; CHECK-NEXT: r3 = lsl(#1,r4)
84+
; CHECK-NEXT: r4 = asl(r0,r4)
8185
; CHECK-NEXT: }
8286
; CHECK-NEXT: .p2align 4
8387
; CHECK-NEXT: .LBB1_1: // %cmpxchg.start
8488
; CHECK-NEXT: // =>This Inner Loop Header: Depth=1
8589
; CHECK-NEXT: {
86-
; CHECK-NEXT: r5 = memw_locked(r3)
90+
; CHECK-NEXT: r5 = memw_locked(r2)
8791
; CHECK-NEXT: }
8892
; CHECK-NEXT: {
89-
; CHECK-NEXT: r6 = lsr(r5,r2)
93+
; CHECK-NEXT: r6 = lsr(r5,r1)
9094
; CHECK-NEXT: }
9195
; CHECK-NEXT: {
9296
; CHECK-NEXT: p0 = !bitsclr(r6,r0)
@@ -95,13 +99,13 @@ define void @f1() #0 {
9599
; CHECK-NEXT: .LBB1_2: // %cmpxchg.trystore
96100
; CHECK-NEXT: // in Loop: Header=BB1_1 Depth=1
97101
; CHECK-NEXT: {
98-
; CHECK-NEXT: r5 = and(r5,r4)
102+
; CHECK-NEXT: r6 = r3
99103
; CHECK-NEXT: }
100104
; CHECK-NEXT: {
101-
; CHECK-NEXT: r5 |= asl(r1,r2)
105+
; CHECK-NEXT: r6 |= and(r5,~r4)
102106
; CHECK-NEXT: }
103107
; CHECK-NEXT: {
104-
; CHECK-NEXT: memw_locked(r3,p0) = r5
108+
; CHECK-NEXT: memw_locked(r2,p0) = r6
105109
; CHECK-NEXT: }
106110
; CHECK-NEXT: {
107111
; CHECK-NEXT: if (!p0) jump:nt .LBB1_1

llvm/test/Transforms/InstCombine/bswap-fold.ll

+2-4
Original file line numberDiff line numberDiff line change
@@ -786,8 +786,7 @@ define i64 @bs_all_operand64_multiuse_both(i64 %a, i64 %b) #0 {
786786

787787
define void @bs_and_constexpr(ptr %out, i64 %a) {
788788
; CHECK-LABEL: @bs_and_constexpr(
789-
; CHECK-NEXT: [[EXP:%.*]] = and i64 ptrtoint (ptr @gp to i64), 4095
790-
; CHECK-NEXT: [[RES:%.*]] = call i64 @llvm.bswap.i64(i64 [[EXP]])
789+
; CHECK-NEXT: [[RES:%.*]] = call i64 @llvm.bswap.i64(i64 and (i64 ptrtoint (ptr @gp to i64), i64 4095))
791790
; CHECK-NEXT: store i64 [[RES]], ptr [[OUT:%.*]], align 8
792791
; CHECK-NEXT: ret void
793792
;
@@ -801,8 +800,7 @@ define void @bs_and_constexpr(ptr %out, i64 %a) {
801800

802801
define void @bs_and_bs_constexpr(ptr %out, i64 %a) {
803802
; CHECK-LABEL: @bs_and_bs_constexpr(
804-
; CHECK-NEXT: [[TMP1:%.*]] = and i64 ptrtoint (ptr @gp to i64), -67835469387268096
805-
; CHECK-NEXT: store i64 [[TMP1]], ptr [[OUT:%.*]], align 8
803+
; CHECK-NEXT: store i64 and (i64 ptrtoint (ptr @gp to i64), i64 -67835469387268096), ptr [[OUT:%.*]], align 8
806804
; CHECK-NEXT: ret void
807805
;
808806
%gpi = ptrtoint ptr @gp to i64

llvm/test/Transforms/InstSimplify/ConstProp/constant-expr.ll

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
@B = global i1 sub (i1 icmp ult (ptr @X, ptr @Y), i1 icmp ult (ptr @X, ptr @Z)), align 2
1010
; CHECK: @B = global i1 xor (i1 icmp ult (ptr @X, ptr @Y), i1 icmp ult (ptr @X, ptr @Z))
1111
@C = global i1 mul (i1 icmp ult (ptr @X, ptr @Y), i1 icmp ult (ptr @X, ptr @Z))
12-
; CHECK: @C = global i1 mul (i1 icmp ult (ptr @X, ptr @Y), i1 icmp ult (ptr @X, ptr @Z))
12+
; CHECK: @C = global i1 and (i1 icmp ult (ptr @X, ptr @Y), i1 icmp ult (ptr @X, ptr @Z))
1313

1414
@H = global i1 icmp ule (ptr @X, ptr @Y)
1515
; CHECK: @H = global i1 icmp ule (ptr @X, ptr @Y)

llvm/test/Transforms/InstSimplify/compare.ll

+1-2
Original file line numberDiff line numberDiff line change
@@ -490,8 +490,7 @@ define i1 @or(i32 %x) {
490490
define i1 @or_constexp(i32 %x) {
491491
; CHECK-LABEL: @or_constexp(
492492
; CHECK-NEXT: entry:
493-
; CHECK-NEXT: [[TMP0:%.*]] = and i32 ptrtoint (ptr @GV to i32), 32
494-
; CHECK-NEXT: [[O:%.*]] = or i32 [[X:%.*]], [[TMP0]]
493+
; CHECK-NEXT: [[O:%.*]] = or i32 [[X:%.*]], and (i32 ptrtoint (ptr @GV to i32), i32 32)
495494
; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[O]], 0
496495
; CHECK-NEXT: ret i1 [[C]]
497496
;

0 commit comments

Comments
 (0)