mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-17 03:30:28 +00:00
Now that instruction optzns can update the iterator as they go, we can
have objectsize folding recursively simplify away their result when it folds. It is important to catch this here, because otherwise we won't eliminate the cross-block values at isel and other times. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@123524 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7579609bfe
commit
94e8e0cfbe
@ -42,6 +42,7 @@
|
||||
#include "llvm/Support/PatternMatch.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/Support/IRBuilder.h"
|
||||
#include "llvm/Support/ValueHandle.h"
|
||||
using namespace llvm;
|
||||
using namespace llvm::PatternMatch;
|
||||
|
||||
@ -634,8 +635,18 @@ bool CodeGenPrepare::OptimizeCallInst(CallInst *CI) {
|
||||
bool Min = (cast<ConstantInt>(II->getArgOperand(1))->getZExtValue() == 1);
|
||||
const Type *ReturnTy = CI->getType();
|
||||
Constant *RetVal = ConstantInt::get(ReturnTy, Min ? 0 : -1ULL);
|
||||
CI->replaceAllUsesWith(RetVal);
|
||||
CI->eraseFromParent();
|
||||
|
||||
// Substituting this can cause recursive simplifications, which can
|
||||
// invalidate our iterator. Use a WeakVH to hold onto it in case this
|
||||
// happens.
|
||||
WeakVH IterHandle(CurInstIterator);
|
||||
|
||||
ReplaceAndSimplifyAllUses(CI, RetVal, TLI ? TLI->getTargetData() : 0, DT);
|
||||
|
||||
// If the iterator instruction was recursively deleted, start over at the
|
||||
// start of the block.
|
||||
if (IterHandle != CurInstIterator)
|
||||
CurInstIterator = BB->begin();
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -653,6 +664,7 @@ bool CodeGenPrepare::OptimizeCallInst(CallInst *CI) {
|
||||
CodeGenPrepareFortifiedLibCalls Simplifier;
|
||||
return Simplifier.fold(CI, TD);
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Memory Optimization
|
||||
//===----------------------------------------------------------------------===//
|
||||
@ -1076,14 +1088,8 @@ bool CodeGenPrepare::OptimizeBlock(BasicBlock &BB) {
|
||||
SunkAddrs.clear();
|
||||
|
||||
CurInstIterator = BB.begin();
|
||||
for (BasicBlock::iterator E = BB.end(); CurInstIterator != E; ) {
|
||||
Instruction *I = CurInstIterator++;
|
||||
|
||||
if (CallInst *CI = dyn_cast<CallInst>(I))
|
||||
MadeChange |= OptimizeCallInst(CI);
|
||||
else
|
||||
MadeChange |= OptimizeInst(I);
|
||||
}
|
||||
for (BasicBlock::iterator E = BB.end(); CurInstIterator != E; )
|
||||
MadeChange |= OptimizeInst(CurInstIterator++);
|
||||
|
||||
return MadeChange;
|
||||
}
|
||||
|
24
test/Transforms/CodeGenPrepare/basic.ll
Normal file
24
test/Transforms/CodeGenPrepare/basic.ll
Normal file
@ -0,0 +1,24 @@
|
||||
; RUN: opt -codegenprepare %s -S -o - | FileCheck %s
|
||||
|
||||
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
|
||||
target triple = "x86_64-apple-darwin10.0.0"
|
||||
|
||||
; CHECK: @test1
|
||||
define i32 @test1(i8* %ptr) nounwind ssp noredzone align 2 {
|
||||
entry:
|
||||
%0 = tail call i64 @llvm.objectsize.i64(i8* %ptr, i1 false)
|
||||
%1 = icmp ugt i64 %0, 3
|
||||
br i1 %1, label %T, label %trap
|
||||
|
||||
; CHECK: br i1 true, label
|
||||
trap: ; preds = %0, %entry
|
||||
tail call void @llvm.trap() noreturn nounwind
|
||||
unreachable
|
||||
|
||||
T:
|
||||
ret i32 4
|
||||
}
|
||||
|
||||
declare i64 @llvm.objectsize.i64(i8*, i1) nounwind readonly
|
||||
|
||||
declare void @llvm.trap() nounwind
|
Loading…
Reference in New Issue
Block a user