llvm-project/llvm/test/Verifier
Sanjoy Das 5ce3272833 Don't IPO over functions that can be de-refined
Summary:
Fixes PR26774.

If you're aware of the issue, feel free to skip the "Motivation"
section and jump directly to "This patch".

Motivation:

I define "refinement" as discarding behaviors from a program that the
optimizer has license to discard.  So transforming:

```
void f(unsigned x) {
  unsigned t = 5 / x;
  (void)t;
}
```

to

```
void f(unsigned x) { }
```

is refinement, since the behavior went from "if x == 0 then undefined
else nothing" to "nothing" (the optimizer has license to discard
undefined behavior).

Refinement is a fundamental aspect of many mid-level optimizations done
by LLVM.  For instance, transforming `x == (x + 1)` to `false` also
involves refinement since the expression's value went from "if x is
`undef` then { `true` or `false` } else { `false` }" to "`false`" (by
definition, the optimizer has license to fold `undef` to any non-`undef`
value).

Unfortunately, refinement implies that the optimizer cannot assume
that the implementation of a function it can see has all of the
behavior an unoptimized or a differently optimized version of the same
function can have.  This is a problem for functions with comdat
linkage, where a function can be replaced by an unoptimized or a
differently optimized version of the same source level function.

For instance, FunctionAttrs cannot assume a comdat function is
actually `readnone` even if it does not have any loads or stores in
it; since there may have been loads and stores in the "original
function" that were refined out in the currently visible variant, and
at the link step the linker may in fact choose an implementation with
a load or a store.  As an example, consider a function that does two
atomic loads from the same memory location, and writes to memory only
if the two values are not equal.  The optimizer is allowed to refine
this function by first CSE'ing the two loads, and the folding the
comparision to always report that the two values are equal.  Such a
refined variant will look like it is `readonly`.  However, the
unoptimized version of the function can still write to memory (since
the two loads //can// result in different values), and selecting the
unoptimized version at link time will retroactively invalidate
transforms we may have done under the assumption that the function
does not write to memory.

Note: this is not just a problem with atomics or with linking
differently optimized object files.  See PR26774 for more realistic
examples that involved neither.

This patch:

This change introduces a new set of linkage types, predicated as
`GlobalValue::mayBeDerefined` that returns true if the linkage type
allows a function to be replaced by a differently optimized variant at
link time.  It then changes a set of IPO passes to bail out if they see
such a function.

Reviewers: chandlerc, hfinkel, dexonsmith, joker.eph, rnk

Subscribers: mcrosier, llvm-commits

Differential Revision: http://reviews.llvm.org/D18634

llvm-svn: 265762
2016-04-08 00:48:30 +00:00
..
2002-04-13-RetTypes.ll
2002-11-05-GetelementptrPointers.ll [opaque pointer type] Add textual IR support for explicit type parameter to getelementptr instruction 2015-02-27 19:29:02 +00:00
2004-05-21-SwitchConstantMismatch.ll
2006-07-11-StoreStruct.ll
2006-10-15-AddrLabel.ll [opaque pointer type] Add textual IR support for explicit type parameter to load instruction 2015-02-27 21:17:42 +00:00
2006-12-12-IntrinsicDefine.ll Revert "Change memcpy/memset/memmove to have dest and source alignments." 2015-11-19 05:56:52 +00:00
2007-12-21-InvokeParamAttrs.ll
2008-01-11-VarargAttrs.ll [opaque pointer type] Add textual IR support for explicit type parameter to the call instruction 2015-04-16 23:24:18 +00:00
2008-03-01-AllocaSized.ll AsmParser: Reject alloca with function type 2015-02-16 08:38:03 +00:00
2008-08-22-MemCpyAlignment.ll Revert "Change memcpy/memset/memmove to have dest and source alignments." 2015-11-19 05:56:52 +00:00
2008-11-15-RetVoid.ll
2009-05-29-InvokeResult1.ll
2009-05-29-InvokeResult2.ll
2009-05-29-InvokeResult3.ll
2010-08-07-PointerIntrinsic.ll [opaque pointer type] Add textual IR support for explicit type parameter to getelementptr instruction 2015-02-27 19:29:02 +00:00
AmbiguousPhi.ll
PhiGrouping.ll
README.txt
SelfReferential.ll
alias.ll Don't IPO over functions that can be de-refined 2016-04-08 00:48:30 +00:00
align-md.ll Add verification for align, dereferenceable, dereferenceable_or_null load metadata 2015-10-09 17:41:29 +00:00
atomics.ll Polish atomic pointers 2015-12-17 22:09:19 +00:00
bitcast-address-space-nested-global-cycle.ll
bitcast-address-space-nested-global.ll
bitcast-address-space-through-constant-inttoptr-inside-gep-instruction.ll [opaque pointer type] Add textual IR support for explicit type parameter to getelementptr instruction 2015-02-27 19:29:02 +00:00
bitcast-address-space-through-constant-inttoptr.ll
bitcast-address-space-through-gep-2.ll [opaque pointer type] Add textual IR support for explicit type parameter to gep operator 2015-03-13 18:20:45 +00:00
bitcast-address-space-through-gep.ll [opaque pointer type] Add textual IR support for explicit type parameter to gep operator 2015-03-13 18:20:45 +00:00
bitcast-address-space-through-inttoptr.ll
bitcast-address-spaces.ll
bitcast-alias-address-space.ll [opaque pointer type] Add textual IR support for explicit type parameter for global aliases 2015-09-11 03:22:04 +00:00
bitcast-vector-pointer-as.ll
byval-1.ll
byval-4.ll
comdat-decl1.ll Verifier: Forbid comdats on linker declarations. 2015-07-05 20:52:40 +00:00
comdat-decl2.ll Verifier: Forbid comdats on linker declarations. 2015-07-05 20:52:40 +00:00
comdat.ll Change the .ll syntax for comdats and add a syntactic sugar. 2015-01-06 22:55:16 +00:00
comdat2.ll Change the .ll syntax for comdats and add a syntactic sugar. 2015-01-06 22:55:16 +00:00
comdat3.ll Verifier: Unused comdats might not have a corresponding GV 2015-02-20 19:58:48 +00:00
cttz-undef-arg.ll
dbg-difile-crash.ll [IRVerifier] Don't crash on invalid DIFile inside DISubprogram. 2016-04-06 18:46:39 +00:00
dbg-invalid-compileunit.ll [IRVerifier] Avoid crashing on an invalid compile unit. 2016-04-06 03:07:58 +00:00
dbg-invalid-retaintypes.ll [IR/Verifier] Fix (yet another) crash. 2016-04-08 00:01:32 +00:00
dbg-null-retained-type.ll Verifier: Don't crash on null entries in debug info retained types list 2015-08-22 22:36:40 +00:00
dbg-orphaned-compileunit.ll Add an IR Verifier check for orphaned DICompileUnits. 2016-03-28 21:06:26 +00:00
dbg-typerefs.ll DI: Disallow uniquable DICompileUnits 2015-08-03 17:26:41 +00:00
dbg.ll DI: Require subprogram definitions to be distinct 2015-08-28 20:26:49 +00:00
deoptimize-intrinsic.ll Introduce @llvm.experimental.deoptimize 2016-03-11 19:08:34 +00:00
dereferenceable-md.ll Add verification for align, dereferenceable, dereferenceable_or_null load metadata 2015-10-09 17:41:29 +00:00
dominates.ll [Verifier] Reject PHIs using defs from own block. 2016-03-26 23:32:57 +00:00
fpmath.ll IR: Make metadata typeless in assembly 2014-12-15 19:07:53 +00:00
frameescape.ll Rename llvm.frameescape and llvm.framerecover to localescape and localrecover 2015-07-07 22:25:32 +00:00
func-dbg.ll testcase gardening: update the emissionKind enum to the new syntax. (NFC) 2016-04-01 00:16:49 +00:00
function-metadata-bad.ll Add function entry count metadata. 2015-05-13 15:13:45 +00:00
function-metadata-good.ll Add function entry count metadata. 2015-05-13 15:13:45 +00:00
gc_relocate_addrspace.ll [gc.statepoint] Change gc.statepoint intrinsic's return type to token type instead of i32 type 2015-12-26 07:54:32 +00:00
gc_relocate_operand.ll [gc.statepoint] Change gc.statepoint intrinsic's return type to token type instead of i32 type 2015-12-26 07:54:32 +00:00
gc_relocate_return.ll [Statepoints] Initial support for relocating vectors of pointers 2016-01-07 03:32:11 +00:00
gcread-ptrptr.ll
gcroot-alloca.ll
gcroot-meta.ll
gcroot-ptrptr.ll
gcwrite-ptrptr.ll
global-ctors.ll
guard-intrinsic.ll Introduce a @llvm.experimental.guard intrinsic 2016-03-31 00:18:46 +00:00
ident-meta1.ll IR: Stop printing 'metadata' in Metadata::print() 2014-12-16 07:40:31 +00:00
ident-meta2.ll IR: Make metadata typeless in assembly 2014-12-15 19:07:53 +00:00
ident-meta3.ll IR: Stop printing 'metadata' in Metadata::print() 2014-12-16 07:40:31 +00:00
ident-meta4.ll Verifier: Make sure !llvm.ident's operand isn't null 2015-02-11 08:23:20 +00:00
inalloca-vararg.ll [opaque pointer type] Add textual IR support for explicit type parameter to the call instruction 2015-04-16 23:24:18 +00:00
inalloca1.ll
inalloca2.ll
inalloca3.ll
invalid-eh.ll [Verifier] Don't abort on invalid cleanuprets 2016-03-01 18:59:50 +00:00
invalid-statepoint.ll [gc.statepoint] Change gc.statepoint intrinsic's return type to token type instead of i32 type 2015-12-26 07:54:32 +00:00
invalid-statepoint2.ll [gc.statepoint] Change gc.statepoint intrinsic's return type to token type instead of i32 type 2015-12-26 07:54:32 +00:00
invoke.ll [Verifier] Minor fix to error message; NFC 2016-02-29 22:04:25 +00:00
jumptable.ll
llvm.compiler_used-invalid-type.ll
llvm.dbg.declare-address.ll DI: Require subprogram definitions to be distinct 2015-08-28 20:26:49 +00:00
llvm.dbg.declare-expression.ll DI: Require subprogram definitions to be distinct 2015-08-28 20:26:49 +00:00
llvm.dbg.declare-variable.ll DI: Require subprogram definitions to be distinct 2015-08-28 20:26:49 +00:00
llvm.dbg.intrinsic-dbg-attachment.ll DI: Require subprogram definitions to be distinct 2015-08-28 20:26:49 +00:00
llvm.dbg.value-expression.ll DI: Require subprogram definitions to be distinct 2015-08-28 20:26:49 +00:00
llvm.dbg.value-value.ll DI: Require subprogram definitions to be distinct 2015-08-28 20:26:49 +00:00
llvm.dbg.value-variable.ll DI: Require subprogram definitions to be distinct 2015-08-28 20:26:49 +00:00
llvm.used-invalid-init.ll
llvm.used-invalid-init2.ll
llvm.used-invalid-type.ll
llvm.used-invalid-type2.ll
llvm.used-ptr-type.ll
mdcompositetype-templateparams-tuple.ll IR: Give 'DI' prefix to debug info metadata 2015-04-29 16:38:44 +00:00
mdcompositetype-templateparams.ll IR: Give 'DI' prefix to debug info metadata 2015-04-29 16:38:44 +00:00
memcpy.ll Revert "Change memcpy/memset/memmove to have dest and source alignments." 2015-11-19 05:56:52 +00:00
metadata-function-dbg.ll DI: Reverse direction of subprogram -> function edge. 2015-11-05 22:03:56 +00:00
module-flags-1.ll IR: Stop printing 'metadata' in Metadata::print() 2014-12-16 07:40:31 +00:00
module-flags-2.ll Verifier: Check for null operands in !llvm.module.flags 2015-02-11 09:13:06 +00:00
module-flags-3.ll Verifier: Diagnose module flags which have null ID operands 2015-02-16 08:14:22 +00:00
musttail-invalid.ll [opaque pointer type] Add textual IR support for explicit type parameter to the call instruction 2015-04-16 23:24:18 +00:00
musttail-valid.ll [opaque pointer type] Add textual IR support for explicit type parameter to the call instruction 2015-04-16 23:24:18 +00:00
operand-bundles.ll Add a "gc-transition" operand bundle 2016-01-20 19:50:25 +00:00
range-1.ll [opaque pointer type] Add textual IR support for explicit type parameter to load instruction 2015-02-27 21:17:42 +00:00
range-2.ll Move the personality function from LandingPadInst to Function 2015-06-17 20:52:32 +00:00
recursive-struct-param.ll Fix an infinite recursion in the verifier caused by calling isSized on a recursive type. 2015-03-13 06:41:26 +00:00
recursive-type-1.ll
recursive-type-2.ll
recursive-type-3.ll
sret.ll
statepoint.ll [gc.statepoint] Change gc.statepoint intrinsic's return type to token type instead of i32 type 2015-12-26 07:54:32 +00:00
swifterror.ll Swift Calling Convention: add swifterror attribute. 2016-04-01 21:41:15 +00:00
swifterror2.ll Swift Calling Convention: add swifterror attribute. 2016-04-01 21:41:15 +00:00
swifterror3.ll Swift Calling Convention: add swifterror attribute. 2016-04-01 21:41:15 +00:00
swiftself.ll Swift Calling Convention: add swiftself attribute. 2016-03-29 17:37:21 +00:00
token1.ll [IR] Add token types 2015-08-14 05:09:07 +00:00
token2.ll [IR] Add token types 2015-08-14 05:09:07 +00:00
token3.ll [IR] Add token types 2015-08-14 05:09:07 +00:00
token4.ll [IR] Add token types 2015-08-14 05:09:07 +00:00
token5.ll [IR] Add token types 2015-08-14 05:09:07 +00:00
token6.ll [IR] Add token types 2015-08-14 05:09:07 +00:00
token7.ll [IR] Add token types 2015-08-14 05:09:07 +00:00
varargs-intrinsic.ll [opaque pointer type] Add textual IR support for explicit type parameter to the call instruction 2015-04-16 23:24:18 +00:00

README.txt

This directory contains testcases that the verifier is supposed to detect as
malformed LLVM code.  Testcases for situations that the verifier incorrectly
identifies as malformed should go in the test/Assembler directory.