diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2018-09-11 01:53:36 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2018-09-11 01:53:36 +0000 |
commit | b59662095b7392220d3c5088656fff190b2c70cc (patch) | |
tree | 2baf495bf8bac17e27fedd6a093f7230dd568c02 /test/Analysis | |
parent | dd24af18f685008660c6115cbffeada44d34528b (diff) |
Prevent Constant Folding From Optimizing inrange GEP
This patch does the following things:
1. update SymbolicallyEvaluateGEP so that it bails out if it cannot preserve inrange arribute;
2. update llvm/test/Analysis/ConstantFolding/gep.ll to remove UB in it;
3. remove inaccurate comment above ConstantFoldInstOperandsImpl in llvm/lib/Analysis/ConstantFolding.cpp;
4. add a new regression test that makes sure that no optimizations change an inrange GEP in an unexpected way.
Patch by Zhaomo Yang!
Differential Revision: https://reviews.llvm.org/D51698
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341888 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Analysis')
-rw-r--r-- | test/Analysis/ConstantFolding/gep.ll | 27 |
1 files changed, 12 insertions, 15 deletions
diff --git a/test/Analysis/ConstantFolding/gep.ll b/test/Analysis/ConstantFolding/gep.ll index caa7f15f36e..259618652ea 100644 --- a/test/Analysis/ConstantFolding/gep.ll +++ b/test/Analysis/ConstantFolding/gep.ll @@ -8,23 +8,20 @@ target triple = "x86_64-unknown-linux-gnu" @vt = external global [3 x i8*] -; CHECK: define i32 (...)* @f0() -define i32 (...)* @f0() { - ; CHECK-NEXT: load i32 (...)*, i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*], [3 x i8*]* @vt, inrange i64 0, i64 2) to i32 (...)**) - %load = load i32 (...)*, i32 (...)** getelementptr (i32 (...)*, i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*], [3 x i8*]* @vt, inrange i64 0, i64 1) to i32 (...)**), i64 1) - ret i32 (...)* %load +; CHECK: define i32 (...)** @f0() +define i32 (...)** @f0() { + ; CHECK-NEXT: ret i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*], [3 x i8*]* @vt, inrange i64 0, i64 2) to i32 (...)** + ret i32 (...)** getelementptr (i32 (...)*, i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*], [3 x i8*]* @vt, inrange i64 0, i64 1) to i32 (...)**), i64 1) } -; CHECK: define i32 (...)* @f1() -define i32 (...)* @f1() { - ; CHECK-NEXT: load i32 (...)*, i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*], [3 x i8*]* @vt, i64 0, i64 2) to i32 (...)**) - %load = load i32 (...)*, i32 (...)** getelementptr (i32 (...)*, i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*], [3 x i8*]* @vt, i64 0, inrange i64 1) to i32 (...)**), i64 1) - ret i32 (...)* %load +; CHECK: define i32 (...)** @f1() +define i32 (...)** @f1() { + ; CHECK-NEXT: ret i32 (...)** getelementptr (i32 (...)*, i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*], [3 x i8*]* @vt, i64 0, inrange i64 1) to i32 (...)**), i64 1) + ret i32 (...)** getelementptr (i32 (...)*, i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*], [3 x i8*]* @vt, i64 0, inrange i64 1) to i32 (...)**), i64 1) } -; CHECK: define i32 (...)* @f2() -define i32 (...)* @f2() { - ; CHECK-NEXT: load i32 (...)*, i32 (...)** bitcast (i8** getelementptr ([3 x i8*], [3 x i8*]* @vt, i64 1, i64 1) to i32 (...)**) - %load = load i32 (...)*, i32 (...)** getelementptr (i32 (...)*, i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*], [3 x i8*]* @vt, i64 0, inrange i64 1) to i32 (...)**), i64 3) - ret i32 (...)* %load +; CHECK: define i32 (...)** @f2() +define i32 (...)** @f2() { + ; CHECK-NEXT: ret i32 (...)** getelementptr (i32 (...)*, i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*], [3 x i8*]* @vt, i64 0, inrange i64 1) to i32 (...)**), i64 3) + ret i32 (...)** getelementptr (i32 (...)*, i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*], [3 x i8*]* @vt, i64 0, inrange i64 1) to i32 (...)**), i64 3) } |