Skip to content

Commit f8a36d8

Browse files
committed
[IR] Mark add constant expressions as undesirable
In preparation for removing support for add expressions, mark them as undesirable. As such, we will no longer implicitly create such expressions, but they still exist.
1 parent 632594f commit f8a36d8

File tree

7 files changed

+28
-27
lines changed

7 files changed

+28
-27
lines changed

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

+8-4
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,8 @@ 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: 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
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
307308
// 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
308309
// CHECK-SANITIZE: [[HANDLER_POINTER_OVERFLOW]]:
309310
// 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))
@@ -321,7 +322,8 @@ char *one_one_OK(void) {
321322
char *one_allones_BAD(void) {
322323
// CHECK: define{{.*}} ptr @one_allones_BAD()
323324
// CHECK-NEXT: [[ENTRY:.*]]:
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
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
325327
// 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
326328
// CHECK-SANITIZE: [[HANDLER_POINTER_OVERFLOW]]:
327329
// 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))
@@ -390,7 +392,8 @@ char *allones_zero_OK(void) {
390392
char *allones_one_BAD(void) {
391393
// CHECK: define{{.*}} ptr @allones_one_BAD()
392394
// CHECK-NEXT: [[ENTRY:.*]]:
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
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
394397
// 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
395398
// CHECK-SANITIZE: [[HANDLER_POINTER_OVERFLOW]]:
396399
// 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))
@@ -408,7 +411,8 @@ char *allones_one_BAD(void) {
408411
char *allones_allones_OK(void) {
409412
// CHECK: define{{.*}} ptr @allones_allones_OK()
410413
// CHECK-NEXT: [[ENTRY:.*]]:
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
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
412416
// 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
413417
// CHECK-SANITIZE: [[HANDLER_POINTER_OVERFLOW]]:
414418
// 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,8 +1241,6 @@ 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);
12461244
case Instruction::Shl:
12471245
case Instruction::LShr:
12481246
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:
22912292
return false;
22922293
case Instruction::Add:
22932294
case Instruction::Sub:
22942295
case Instruction::Mul:
22952296
case Instruction::Shl:
22962297
case Instruction::LShr:
22972298
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

+12-16
Original file line numberDiff line numberDiff line change
@@ -63,34 +63,30 @@ define void @f1() #0 {
6363
; CHECK: .cfi_startproc
6464
; CHECK-NEXT: // %bb.0: // %entry
6565
; CHECK-NEXT: {
66-
; CHECK-NEXT: r2 = ##g0
67-
; CHECK-NEXT: r0 = #255
66+
; CHECK-NEXT: r3 = ##g0
67+
; CHECK-NEXT: r1:0 = combine(#1,##255)
6868
; CHECK-NEXT: }
6969
; CHECK-NEXT: {
70-
; CHECK-NEXT: r1 = and(r2,#3)
70+
; CHECK-NEXT: r2 = and(r3,#3)
71+
; CHECK-NEXT: r3 = and(r3,#-4)
7172
; CHECK-NEXT: }
7273
; CHECK-NEXT: {
73-
; CHECK-NEXT: r1 = asl(r1,#3)
74-
; CHECK-NEXT: }
75-
; CHECK-NEXT: {
76-
; CHECK-NEXT: r4 = r1
74+
; CHECK-NEXT: r2 = asl(r2,#3)
7775
; CHECK-NEXT: }
7876
; CHECK-NEXT: {
79-
; CHECK-NEXT: r4 = insert(r2,#2,#3)
80-
; CHECK-NEXT: r2 = and(r2,#-4)
77+
; CHECK-NEXT: r4 = asl(r0,r2)
8178
; CHECK-NEXT: }
8279
; CHECK-NEXT: {
83-
; CHECK-NEXT: r3 = lsl(#1,r4)
84-
; CHECK-NEXT: r4 = asl(r0,r4)
80+
; CHECK-NEXT: r4 = sub(#-1,r4)
8581
; CHECK-NEXT: }
8682
; CHECK-NEXT: .p2align 4
8783
; CHECK-NEXT: .LBB1_1: // %cmpxchg.start
8884
; CHECK-NEXT: // =>This Inner Loop Header: Depth=1
8985
; CHECK-NEXT: {
90-
; CHECK-NEXT: r5 = memw_locked(r2)
86+
; CHECK-NEXT: r5 = memw_locked(r3)
9187
; CHECK-NEXT: }
9288
; CHECK-NEXT: {
93-
; CHECK-NEXT: r6 = lsr(r5,r1)
89+
; CHECK-NEXT: r6 = lsr(r5,r2)
9490
; CHECK-NEXT: }
9591
; CHECK-NEXT: {
9692
; CHECK-NEXT: p0 = !bitsclr(r6,r0)
@@ -99,13 +95,13 @@ define void @f1() #0 {
9995
; CHECK-NEXT: .LBB1_2: // %cmpxchg.trystore
10096
; CHECK-NEXT: // in Loop: Header=BB1_1 Depth=1
10197
; CHECK-NEXT: {
102-
; CHECK-NEXT: r6 = r3
98+
; CHECK-NEXT: r5 = and(r5,r4)
10399
; CHECK-NEXT: }
104100
; CHECK-NEXT: {
105-
; CHECK-NEXT: r6 |= and(r5,~r4)
101+
; CHECK-NEXT: r5 |= asl(r1,r2)
106102
; CHECK-NEXT: }
107103
; CHECK-NEXT: {
108-
; CHECK-NEXT: memw_locked(r2,p0) = r6
104+
; CHECK-NEXT: memw_locked(r3,p0) = r5
109105
; CHECK-NEXT: }
110106
; CHECK-NEXT: {
111107
; CHECK-NEXT: if (!p0) jump:nt .LBB1_1

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

+4-2
Original file line numberDiff line numberDiff line change
@@ -786,7 +786,8 @@ 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: [[RES:%.*]] = call i64 @llvm.bswap.i64(i64 and (i64 ptrtoint (ptr @gp to i64), i64 4095))
789+
; CHECK-NEXT: [[EXP:%.*]] = and i64 ptrtoint (ptr @gp to i64), 4095
790+
; CHECK-NEXT: [[RES:%.*]] = call i64 @llvm.bswap.i64(i64 [[EXP]])
790791
; CHECK-NEXT: store i64 [[RES]], ptr [[OUT:%.*]], align 8
791792
; CHECK-NEXT: ret void
792793
;
@@ -800,7 +801,8 @@ define void @bs_and_constexpr(ptr %out, i64 %a) {
800801

801802
define void @bs_and_bs_constexpr(ptr %out, i64 %a) {
802803
; CHECK-LABEL: @bs_and_bs_constexpr(
803-
; CHECK-NEXT: store i64 and (i64 ptrtoint (ptr @gp to i64), i64 -67835469387268096), ptr [[OUT:%.*]], align 8
804+
; CHECK-NEXT: [[TMP1:%.*]] = and i64 ptrtoint (ptr @gp to i64), -67835469387268096
805+
; CHECK-NEXT: store i64 [[TMP1]], ptr [[OUT:%.*]], align 8
804806
; CHECK-NEXT: ret void
805807
;
806808
%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 and (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))
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

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

0 commit comments

Comments
 (0)