Skip to content

Commit

Permalink
Asg 2: Mask Reduction for or with Constant (Cayden Lund) (`0xFFFFFFFE…
Browse files Browse the repository at this point in the history
… - (x | 0x7FFFFFFF) → x | 0x7FFFFFFF`) (llvm#45)

* [Cayden Lund]: Implement working optimization. Todo: test cases

* [Cayden Lund]: Add test cases for optimization
  • Loading branch information
caydenlund authored Sep 10, 2024
1 parent 42044da commit 4e427eb
Show file tree
Hide file tree
Showing 2 changed files with 219 additions and 0 deletions.
26 changes: 26 additions & 0 deletions llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5304,6 +5304,32 @@ Instruction* cs6475_optimizer(Instruction *I, InstCombinerImpl &IC, LazyValueInf
}
}
}

// BEGIN CAYDEN LUND
// 0xFFFFFFFE - (x | 0x7FFFFFFF) → x | 0x7FFFFFFF
{
// Opening new block to allow binding variables of the same name,
// in order to prevent collisions with other optimizations.
ConstantInt *C1 = nullptr; // (-2)
ConstantInt *C2 = nullptr; // (IntMax)
Value *X = nullptr; // (x)
Value *Y = nullptr; // (x | IntMax)
if (match(I, m_Sub(m_ConstantInt(C1), m_Value(Y)))) {
if (match(Y, m_Or(m_Value(X), m_ConstantInt(C2)))) {
cs6475_debug("CML: matched 'C1 - (X | C2)'\n");
if (C1->getValue() == APInt::getMaxValue(C2->getBitWidth()) - 1) {
cs6475_debug("CML: C1 == -2\n");
if (C2->getValue() == APInt::getSignedMaxValue(C2->getBitWidth())) {
cs6475_debug("CML: C2 == IntMax\n");
log_optzn("Cayden Lund");
// (x | IntMax)
return BinaryOperator::CreateOr(X, C2);
}
}
}
}
}
// END CAYDEN LUND

// BEGIN KHAGAN KARIMOV
{
Expand Down
193 changes: 193 additions & 0 deletions llvm/test/Transforms/InstCombine/or-constant-mask-reduction.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,193 @@
; RUN: opt < %s -passes=instcombine -S | FileCheck %s

define i8 @test-i8-pos1(i8 %x) {
%a = or i8 %x, 127
%b = sub i8 -2, %a
ret i8 %b
; CHECK-LABEL: @test-i8-pos1(
; CHECK-NEXT: [[p1:%.*]] = or i8 %x, 127
; CHECK-NEXT: ret i8 [[p1]]
}

define i8 @test-i8-pos2(i8 %x) {
%a = or i8 127, %x
%b = sub i8 -2, %a
ret i8 %b
; CHECK-LABEL: @test-i8-pos2(
; CHECK-NEXT: [[p1:%.*]] = or i8 %x, 127
; CHECK-NEXT: ret i8 [[p1]]
}

define i8 @test-i8-neg1(i8 %x) {
%a = or i8 %x, 126
%b = sub i8 -2, %a
ret i8 %b
; CHECK-LABEL: @test-i8-neg1(
; CHECK-NEXT: [[p1:%.*]] = or i8 %x, 126
; CHECK-NEXT: [[p2:%.*]] = sub i8 -2, [[p1]]
; CHECK-NEXT: ret i8 [[p2]]
}

define i8 @test-i8-neg2(i8 %x) {
%a = or i8 126, %x
%b = sub i8 -2, %a
ret i8 %b
; CHECK-LABEL: @test-i8-neg2(
; CHECK-NEXT: [[p1:%.*]] = or i8 %x, 126
; CHECK-NEXT: [[p2:%.*]] = sub i8 -2, [[p1]]
; CHECK-NEXT: ret i8 [[p2]]
}

define i8 @test-i8-neg3(i8 %x) {
%a = or i8 %x, 127
%b = sub i8 0, %a
ret i8 %b
; CHECK-LABEL: @test-i8-neg3(
; CHECK-NEXT: [[p1:%.*]] = or i8 %x, 127
; CHECK-NEXT: [[p2:%.*]] = sub nsw i8 0, [[p1]]
; CHECK-NEXT: ret i8 [[p2]]
}

define i16 @test-i16-pos1(i16 %x) {
%a = or i16 %x, 32767
%b = sub i16 -2, %a
ret i16 %b
; CHECK-LABEL: @test-i16-pos1(
; CHECK-NEXT: [[p1:%.*]] = or i16 %x, 32767
; CHECK-NEXT: ret i16 [[p1]]
}

define i16 @test-i16-pos2(i16 %x) {
%a = or i16 32767, %x
%b = sub i16 -2, %a
ret i16 %b
; CHECK-LABEL: @test-i16-pos2(
; CHECK-NEXT: [[p1:%.*]] = or i16 %x, 32767
; CHECK-NEXT: ret i16 [[p1]]
}

define i16 @test-i16-neg1(i16 %x) {
%a = or i16 %x, 32766
%b = sub i16 -2, %a
ret i16 %b
; CHECK-LABEL: @test-i16-neg1(
; CHECK-NEXT: [[p1:%.*]] = or i16 %x, 32766
; CHECK-NEXT: [[p2:%.*]] = sub i16 -2, [[p1]]
; CHECK-NEXT: ret i16 [[p2]]
}

define i16 @test-i16-neg2(i16 %x) {
%a = or i16 32766, %x
%b = sub i16 -2, %a
ret i16 %b
; CHECK-LABEL: @test-i16-neg2(
; CHECK-NEXT: [[p1:%.*]] = or i16 %x, 32766
; CHECK-NEXT: [[p2:%.*]] = sub i16 -2, [[p1]]
; CHECK-NEXT: ret i16 [[p2]]
}

define i16 @test-i16-neg3(i16 %x) {
%a = or i16 %x, 32767
%b = sub i16 0, %a
ret i16 %b
; CHECK-LABEL: @test-i16-neg3(
; CHECK-NEXT: [[p1:%.*]] = or i16 %x, 32767
; CHECK-NEXT: [[p2:%.*]] = sub nsw i16 0, [[p1]]
; CHECK-NEXT: ret i16 [[p2]]
}

define i32 @test-i32-pos1(i32 %x) {
%a = or i32 %x, 2147483647
%b = sub i32 -2, %a
ret i32 %b
; CHECK-LABEL: @test-i32-pos1(
; CHECK-NEXT: [[p1:%.*]] = or i32 %x, 2147483647
; CHECK-NEXT: ret i32 [[p1]]
}

define i32 @test-i32-pos2(i32 %x) {
%a = or i32 2147483647, %x
%b = sub i32 -2, %a
ret i32 %b
; CHECK-LABEL: @test-i32-pos2(
; CHECK-NEXT: [[p1:%.*]] = or i32 %x, 2147483647
; CHECK-NEXT: ret i32 [[p1]]
}

define i32 @test-i32-neg1(i32 %x) {
%a = or i32 %x, 2147483646
%b = sub i32 -2, %a
ret i32 %b
; CHECK-LABEL: @test-i32-neg1(
; CHECK-NEXT: [[p1:%.*]] = or i32 %x, 2147483646
; CHECK-NEXT: [[p2:%.*]] = sub i32 -2, [[p1]]
; CHECK-NEXT: ret i32 [[p2]]
}

define i32 @test-i32-neg2(i32 %x) {
%a = or i32 2147483646, %x
%b = sub i32 -2, %a
ret i32 %b
; CHECK-LABEL: @test-i32-neg2(
; CHECK-NEXT: [[p1:%.*]] = or i32 %x, 2147483646
; CHECK-NEXT: [[p2:%.*]] = sub i32 -2, [[p1]]
; CHECK-NEXT: ret i32 [[p2]]
}

define i32 @test-i32-neg3(i32 %x) {
%a = or i32 %x, 2147483647
%b = sub i32 0, %a
ret i32 %b
; CHECK-LABEL: @test-i32-neg3(
; CHECK-NEXT: [[p1:%.*]] = or i32 %x, 2147483647
; CHECK-NEXT: [[p2:%.*]] = sub nsw i32 0, [[p1]]
; CHECK-NEXT: ret i32 [[p2]]
}

define i64 @test-i64-pos1(i64 %x) {
%a = or i64 %x, 9223372036854775807
%b = sub i64 -2, %a
ret i64 %b
; CHECK-LABEL: @test-i64-pos1(
; CHECK-NEXT: [[p1:%.*]] = or i64 %x, 9223372036854775807
; CHECK-NEXT: ret i64 [[p1]]
}

define i64 @test-i64-pos2(i64 %x) {
%a = or i64 9223372036854775807, %x
%b = sub i64 -2, %a
ret i64 %b
; CHECK-LABEL: @test-i64-pos2(
; CHECK-NEXT: [[p1:%.*]] = or i64 %x, 9223372036854775807
; CHECK-NEXT: ret i64 [[p1]]
}

define i64 @test-i64-neg1(i64 %x) {
%a = or i64 %x, 9223372036854775806
%b = sub i64 -2, %a
ret i64 %b
; CHECK-LABEL: @test-i64-neg1(
; CHECK-NEXT: [[p1:%.*]] = or i64 %x, 9223372036854775806
; CHECK-NEXT: [[p2:%.*]] = sub i64 -2, [[p1]]
; CHECK-NEXT: ret i64 [[p2]]
}

define i64 @test-i64-neg2(i64 %x) {
%a = or i64 9223372036854775806, %x
%b = sub i64 -2, %a
ret i64 %b
; CHECK-LABEL: @test-i64-neg2(
; CHECK-NEXT: [[p1:%.*]] = or i64 %x, 9223372036854775806
; CHECK-NEXT: [[p2:%.*]] = sub i64 -2, [[p1]]
; CHECK-NEXT: ret i64 [[p2]]
}

define i64 @test-i64-neg3(i64 %x) {
%a = or i64 %x, 9223372036854775807
%b = sub i64 0, %a
ret i64 %b
; CHECK-LABEL: @test-i64-neg3(
; CHECK-NEXT: [[p1:%.*]] = or i64 %x, 9223372036854775807
; CHECK-NEXT: [[p2:%.*]] = sub nsw i64 0, [[p1]]
; CHECK-NEXT: ret i64 [[p2]]
}

0 comments on commit 4e427eb

Please sign in to comment.