Why should I know this?

[TODO] possiblyBits(???) 추가하기 본문

LLVM-STUDY/TODO

[TODO] possiblyBits(???) 추가하기

die4taoam 2023. 12. 16. 22:49

 

 

LLVM 에서 제공하는 비트 연산은 다음같은 연산을 추정하는데 한계가 있다.

 

x == ~x

x는 ~x와 같을 수 없다. false가 되야 한다.

이를 비트로 바꿔말하면,

x에 가용한 비트 조합과 ~x의 가용한 비트 조합 간에 일치되는 조합이 없다고 할 수 있다.

 

PossiblyBit Pb = PossiblyBit(X).matchPossiblyBit(PossiblyBit(~X));

; Pb == nullptr

 

이에 연장으로 x s< ~x 는 어떨까?

이 연산은 x 의 Signbit 가 세팅되어 있는지 여부인지가 중요하다.

 

만약 x에

SignBit가 세팅되어 있다면,  x s< ~x 는 true  이고,

SignBit가 세팅되지 않았다면,  x s< ~x 는 false 이다

signbit를 검사하는 것으로 단순화 할 수 있다. 

x s< 0 이렇게

 

즉, x와 ~x 의 비교문에서 x와 ~x는 식 자체가 말하듯 한 쪽의 PossiblyBit에 최상위 부호비트가 set되면

반대편의 식의 PossiblyBit에는 최상위 부호비트가 set되지 않는다.

 

그렇다면 두 값의 비교문은, 최상위 부호비트의 여부를 비교하는 것으로 단순화 할 수 있다.

 

PossiblyBit Pb = PossiblyBit(X).calculateMaxDiffBit(PossiblyBit(~X))

; Pb = signedMaxValue

 

 

다음.

x&y == 0 ? x|y : x^y

위 식은 x^y 로 단순화 할 수 있다.

 

x&y == 0 이란 연산 결과는, x와 y에 공통으로 활성화된 비트가 없다는 것을 의미한다.

그렇다면 true 에 있는 x | y 연산은 x = 1, y = 1 이 제거된 x | y 연산이고, 그 결과는 x ^ y와 같다.

false일 때는 어차피 x ^ y 이므로 동일 연산.

 

그러므로 x&y == 0 ? x|y : x^y --> x ^ y 이다.

 

똑같은 말을, PossiblyBit로표현하면, 

 

x&y == 0 일 때의 x와 y 각각의 possiblyBit는

x = 0,  y = {0, 1}  -->  0

x = 1,  y = 0        -->   0

x = {0, 1}, y = 0   -->  0

로 표현할 수 있다. Possibly(X&Y==0) 의 결과 PossiblyBit이다.

 

본래 x|y의 possiblyBits는 다음과 같다.

x = 0,  y = 0       -> 0

x = {0, 1},  y = 0 -> 1

x = 1,  y = {0, 1} -> 1

x = 1,  y = 1       -> 1

그러나 여기서 x & y == 0 의 PossiblyBit에 x = 1, y = 1 은 포함되지 않는다.

 

PossiblyBit("X&Y==0").caculatePossiblyBit("X|Y") 와 같이 함수를 호출했다고 가정하면 결과가 반영될 것이다.

x = 0,  y = 0       --> 0

x = 1,  y = 0       --> 1

x = 0,  y = 1       --> 1

 

 

x&y != 0 일 때, x와 y 각각의 possiblyBit는

x = 0,  y = 0        -->  0

x = 1,  y = 0        -->   0

x = 0,  y = 0        -->  0
x = 1, y = 1         -->   1

 

x&y != 0 일 때, x^y의 possiblyBits는 다음과 같다.

x = 0,  y = 0       --> 0

x = 1,  y = 0       --> 1

x = 0,  y = 1       --> 1

x = 1,  y = 1       --> 0

PossiblyBit("X&Y!=0").caculatePossiblyBit("X^Y") 와 같이 함수를 호출했다고 가정하면 결과가 반영될 것이다.

x = 0,  y = 0       --> 0

x = 1,  y = 0       --> 1

x = 0,  y = 1       --> 1

x = 1,  y = 1       --> 0

 

의 결과는 X^Y에 모두 포함되므로 이는 단순화 될 수 있다.

그리고 두 식의 단순화 PossiblyBit는  XOR의 PossiblyBit와 동일하다.

"x&y == 0 ? x|y : x^y --> x ^ y "

 

PossiblyBit("X&Y==0").caculatePossiblyBit("X|Y")

isPartOf

PossiblyBit("X&Y!=0").caculatePossiblyBit("X^Y")

 

possiblyBit Pb = PossiblyBit.simplify(

                                                PossiblyBit("X&Y==0").caculatePossiblyBit("X|Y"),                   

                                                PossiblyBit("X&Y!=0").caculatePossiblyBit("X^Y"));

 

PossiblyBit.CreateNewOp(Pb);

--> X ^ Y

 

문제는 LLVM에는 이런 비트 연산을 할 수 있는 방법이 현존하지 않는다.

위 두 문제를 단순화 하기 위해 PossiblyBit (가칭) 을 만들 것을 제한하려는 이유이다.

 

PossiblyBit 함수의 목적은 다음과 같다.

-.. 어떤 변수(혹은 식)의 비교연산 구문에서,

-.. 좌측과 우측에 공통의 항목이 존재할 때

 

1. 공통의 항목이 가진 가능한 비트 조합 범위 내에서 좌항과 우항이 단순화 될 수 있는 여부를 판단하는 기능.

2. 공통의 비트 조합이 나올 수 있는 단순화 된 연산 조합의 생성 기능.

 

 

'LLVM-STUDY > TODO' 카테고리의 다른 글

[TODO] ConstantRange  (0) 2023.12.12
[TODO] MemorySSAAnalysis  (0) 2023.11.07
[TODO] Metadata & Attribute  (0) 2023.11.06
[TODO] MemorySSA = MSSA  (0) 2023.11.06
[TODO] 목록  (0) 2023.11.02
Comments