diff options
Diffstat (limited to 'test/Transforms/MergeFunc/linkonce_odr.ll')
-rw-r--r-- | test/Transforms/MergeFunc/linkonce_odr.ll | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/test/Transforms/MergeFunc/linkonce_odr.ll b/test/Transforms/MergeFunc/linkonce_odr.ll new file mode 100644 index 0000000..1ad0d72 --- /dev/null +++ b/test/Transforms/MergeFunc/linkonce_odr.ll @@ -0,0 +1,30 @@ +; RUN: opt -S -mergefunc < %s | FileCheck %s + +; Replacments should be totally ordered on the function name. +; If we don't do this we can end up with one module defining a thunk for @funA +; and another module defining a thunk for @funB. +; +; The problem with this is that the linker could then choose these two stubs +; each of the two modules and we end up with two stubs calling each other. + +; CHECK-LABEL: define linkonce_odr i32 @funA +; CHECK-NEXT: add +; CHECK: ret + +; CHECK-LABEL: define linkonce_odr i32 @funB +; CHECK-NEXT: tail call i32 @funA(i32 %0, i32 %1) +; CHECK-NEXT: ret + +define linkonce_odr i32 @funB(i32 %x, i32 %y) { + %sum = add i32 %x, %y + %sum2 = add i32 %x, %sum + %sum3 = add i32 %x, %sum2 + ret i32 %sum3 +} + +define linkonce_odr i32 @funA(i32 %x, i32 %y) { + %sum = add i32 %x, %y + %sum2 = add i32 %x, %sum + %sum3 = add i32 %x, %sum2 + ret i32 %sum3 +} |