mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-28 21:34:23 +00:00
Fix a codegen fault in which log2 or exp2 could be dead-code eliminated even though they could have sideeffects.
Only allow log2/exp2 to be converted to an intrinsic if they are declared "readnone". git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@151807 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ccc8d3ba06
commit
391016025a
@ -5627,7 +5627,8 @@ void SelectionDAGBuilder::visitCall(const CallInst &I) {
|
||||
(LibInfo->has(LibFunc::log2l) && Name == "log2l")) {
|
||||
if (I.getNumArgOperands() == 1 && // Basic sanity checks.
|
||||
I.getArgOperand(0)->getType()->isFloatingPointTy() &&
|
||||
I.getType() == I.getArgOperand(0)->getType()) {
|
||||
I.getType() == I.getArgOperand(0)->getType() &&
|
||||
I.onlyReadsMemory()) {
|
||||
SDValue Tmp = getValue(I.getArgOperand(0));
|
||||
setValue(&I, DAG.getNode(ISD::FLOG2, getCurDebugLoc(),
|
||||
Tmp.getValueType(), Tmp));
|
||||
@ -5638,7 +5639,8 @@ void SelectionDAGBuilder::visitCall(const CallInst &I) {
|
||||
(LibInfo->has(LibFunc::exp2l) && Name == "exp2l")) {
|
||||
if (I.getNumArgOperands() == 1 && // Basic sanity checks.
|
||||
I.getArgOperand(0)->getType()->isFloatingPointTy() &&
|
||||
I.getType() == I.getArgOperand(0)->getType()) {
|
||||
I.getType() == I.getArgOperand(0)->getType() &&
|
||||
I.onlyReadsMemory()) {
|
||||
SDValue Tmp = getValue(I.getArgOperand(0));
|
||||
setValue(&I, DAG.getNode(ISD::FEXP2, getCurDebugLoc(),
|
||||
Tmp.getValueType(), Tmp));
|
||||
|
15
test/CodeGen/ARM/log2_not_readnone.ll
Normal file
15
test/CodeGen/ARM/log2_not_readnone.ll
Normal file
@ -0,0 +1,15 @@
|
||||
; RUN: llc -march arm %s -o - | FileCheck %s
|
||||
|
||||
; Log2 and exp2 are string-matched to intrinsics. If they are not declared
|
||||
; readnone, they can't be changed to intrinsics (because they can change errno).
|
||||
|
||||
declare double @log2(double)
|
||||
declare double @exp2(double)
|
||||
|
||||
define void @f() {
|
||||
; CHECK: bl log2
|
||||
%1 = call double @log2(double 0.000000e+00)
|
||||
; CHECK: bl exp2
|
||||
%2 = call double @exp2(double 0.000000e+00)
|
||||
ret void
|
||||
}
|
15
test/CodeGen/X86/log2_not_readnone.ll
Normal file
15
test/CodeGen/X86/log2_not_readnone.ll
Normal file
@ -0,0 +1,15 @@
|
||||
; RUN: llc -march x86 %s -o - | FileCheck %s
|
||||
|
||||
; Log2 and exp2 are string-matched to intrinsics. If they are not declared
|
||||
; readnone, they can't be changed to intrinsics (because they can change errno).
|
||||
|
||||
declare double @log2(double)
|
||||
declare double @exp2(double)
|
||||
|
||||
define void @f() {
|
||||
; CHECK: calll log2
|
||||
%1 = call double @log2(double 0.000000e+00)
|
||||
; CHECK: calll exp2
|
||||
%2 = call double @exp2(double 0.000000e+00)
|
||||
ret void
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user