Skip to content

Commit 7df66a3

Browse files
update post
Signed-off-by: jonghoonpark <dev@jonghoonpark.com>
1 parent 8ef895a commit 7df66a3

1 file changed

Lines changed: 11 additions & 1 deletion

File tree

_posts/2026-04-25-JDK-8382880.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ float/double 관련 Op 노드들의 case label을 제거하면 `default` case로
120120
121121
`frc.inc_call_count()`만 수행하던 if 분기를 제거하고, else 분기(uncommon call의 shared argument clone)의 조건을 반전시켜 정리했다.
122122
123-
## 정리 후 남은 필드
123+
## 추가: 정리 후 남은 필드
124124
125125
참고로, 이번 정리 대상이 아닌 `Final_Reshape_Counts`의 나머지 필드들은 다음과 같은 역할을 한다.
126126
@@ -138,6 +138,16 @@ float/double 관련 Op 노드들의 case label을 제거하면 `default` case로
138138
139139
`_tests`는 그래프 순회 중 만나는 분기 노드들을 모아두는 리스트다. `IfNode`(if-else 조건 분기, 나가는 경로 2개)와 `PCTableNode`(switch문이나 예외 처리 분기, 나가는 경로 여러 개)을 수집해두었다가, 나중에 "나가는 경로 수가 맞는지" 검증한다. 예를 들어 `IfNode`는 true/false 2개의 경로가 있어야 하는데, 최적화 과정에서 한쪽이 도달 불가능(dead code)으로 제거되면 경로가 1개만 남을 수 있다. 이런 불일치를 잡아내는 무결성 검사용이다.
140140
141+
## 추가: x87 FPU와 SSE의 구조적 차이
142+
143+
이번 이슈를 조사하면서 x87 FPU와 SSE의 차이에 대해서도 알아보았다. 앞서 정밀도 모드 전환 비용을 언급했는데, 사실 x87과 SSE는 그보다 더 근본적인 아키텍처 차이가 있다.
144+
145+
**스택 vs 레지스터**: x87 FPU는 8개의 레지스터가 스택 구조로 연결되어 있어, 연산마다 값을 PUSH하고 계산 후 POP하는 과정을 거쳐야 한다. 반면 SSE는 독립적인 XMM 레지스터를 직접 지정하여 연산한다(`addss xmm0, xmm1`처럼). 레지스터 간 직접 계산이 가능하므로 코드가 직관적이고 컴파일러 최적화도 용이하다.
146+
147+
**SIMD(Single Instruction, Multiple Data)**: x87은 한 번에 값 하나만 처리하지만, SSE는 128비트 XMM 레지스터를 활용하여 float 4개 또는 double 2개를 동시에 처리할 수 있다. 최신 AVX 확장은 256/512비트까지 지원하여 한 명령어로 더 많은 데이터를 병렬 처리한다.
148+
149+
이런 이점들 때문에 SSE2 이상을 지원하는 환경에서는 x87 FPU를 사용할 이유가 없어졌고, 앞서 본 정밀도 모드 전환 최적화도 불필요해진 것이다.
150+
141151
## 마무리
142152
143153
코드 변경 자체는 단순한 dead code 제거지만, 히스토리를 따라가면서 C2 컴파일러의 최종 그래프 재구성 단계가 어떤 일을 하는지, 그리고 현대 x86에서는 더 이상 필요 없어진 x87 FPU 모드 최적화가 과거에 어떤 역할을 했는지를 알 수 있었다. 매번 새로운 것을 배우게 된다.

0 commit comments

Comments
 (0)