Skip to content

Commit 0cab8d2

Browse files
committed
Reapply [IR] Mark and/or constant expressions as undesirable
This reapplies the change for and, but also marks or as undesirable at the same time. Only handling one of them can cause infinite combine loops due to the asymmetric handling. ----- In preparation for removing support for and/or expressions, mark them as undesirable. As such, we will no longer implicitly create such expressions, but they still exist.
1 parent 92c0611 commit 0cab8d2

File tree

9 files changed

+38
-31
lines changed

9 files changed

+38
-31
lines changed

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

Lines changed: 8 additions & 4 deletions
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

Lines changed: 0 additions & 2 deletions
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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2288,15 +2288,15 @@ bool ConstantExpr::isDesirableBinOp(unsigned Opcode) {
22882288
case Instruction::FMul:
22892289
case Instruction::FDiv:
22902290
case Instruction::FRem:
2291+
case Instruction::And:
2292+
case Instruction::Or:
22912293
return false;
22922294
case Instruction::Add:
22932295
case Instruction::Sub:
22942296
case Instruction::Mul:
22952297
case Instruction::Shl:
22962298
case Instruction::LShr:
22972299
case Instruction::AShr:
2298-
case Instruction::And:
2299-
case Instruction::Or:
23002300
case Instruction::Xor:
23012301
return true;
23022302
default:

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

Lines changed: 12 additions & 16 deletions
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/and-xor-or.ll

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4762,7 +4762,9 @@ define i8 @canonicalize_logic_first_xor_bad_constants2(i8 %x) {
47624762
define i32 @canonicalize_logic_first_constexpr(i32 %x) {
47634763
; CHECK-LABEL: define {{[^@]+}}@canonicalize_logic_first_constexpr
47644764
; CHECK-SAME: (i32 [[X:%.*]]) {
4765-
; CHECK-NEXT: ret i32 and (i32 add (i32 ptrtoint (ptr @g to i32), i32 48), i32 -10)
4765+
; CHECK-NEXT: [[TMP1:%.*]] = and i32 ptrtoint (ptr @g to i32), -10
4766+
; CHECK-NEXT: [[R:%.*]] = add i32 [[TMP1]], 48
4767+
; CHECK-NEXT: ret i32 [[R]]
47664768
;
47674769
%a = add i32 ptrtoint (ptr @g to i32), 48
47684770
%r = and i32 %a, -10
@@ -4772,7 +4774,9 @@ define i32 @canonicalize_logic_first_constexpr(i32 %x) {
47724774
define i32 @canonicalize_logic_first_constexpr_nuw(i32 %x) {
47734775
; CHECK-LABEL: define {{[^@]+}}@canonicalize_logic_first_constexpr_nuw
47744776
; CHECK-SAME: (i32 [[X:%.*]]) {
4775-
; CHECK-NEXT: ret i32 and (i32 add (i32 ptrtoint (ptr @g to i32), i32 48), i32 -10)
4777+
; CHECK-NEXT: [[TMP1:%.*]] = and i32 ptrtoint (ptr @g to i32), -10
4778+
; CHECK-NEXT: [[R:%.*]] = add i32 [[TMP1]], 48
4779+
; CHECK-NEXT: ret i32 [[R]]
47764780
;
47774781
%a = add nuw i32 ptrtoint (ptr @g to i32), 48
47784782
%r = and i32 %a, -10

llvm/test/Transforms/InstCombine/and.ll

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2432,7 +2432,9 @@ define i8 @negate_lowbitmask_use2(i8 %x, i8 %y) {
24322432

24332433
define i64 @test_and_or_constexpr_infloop() {
24342434
; CHECK-LABEL: @test_and_or_constexpr_infloop(
2435-
; CHECK-NEXT: ret i64 or (i64 and (i64 ptrtoint (ptr @g to i64), i64 -8), i64 1)
2435+
; CHECK-NEXT: [[AND:%.*]] = and i64 ptrtoint (ptr @g to i64), -8
2436+
; CHECK-NEXT: [[OR:%.*]] = or i64 [[AND]], 1
2437+
; CHECK-NEXT: ret i64 [[OR]]
24362438
;
24372439
%and = and i64 ptrtoint (ptr @g to i64), -8
24382440
%or = or i64 %and, 1

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

Lines changed: 4 additions & 2 deletions
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 2 additions & 1 deletion
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)