diff options
author | Matthijs Kooijman <matthijs@stdin.nl> | 2008-06-18 08:30:37 +0000 |
---|---|---|
committer | Matthijs Kooijman <matthijs@stdin.nl> | 2008-06-18 08:30:37 +0000 |
commit | c2afe89019790adb2c590397960d69b8f1d9a537 (patch) | |
tree | cc719815f557bcfec364560d61cb88cad21b9eca /test/Transforms/IPConstantProp | |
parent | 359e9371b9537ddf60229c8c219c2b51b8574a08 (diff) | |
download | external_llvm-c2afe89019790adb2c590397960d69b8f1d9a537.zip external_llvm-c2afe89019790adb2c590397960d69b8f1d9a537.tar.gz external_llvm-c2afe89019790adb2c590397960d69b8f1d9a537.tar.bz2 |
Reapply r52397 (make IPConstProp promote returned arguments), but fixed this
time. Sorry for the trouble!
This time, also add a testcase, which I should have done in the first place...
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52455 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Transforms/IPConstantProp')
-rw-r--r-- | test/Transforms/IPConstantProp/return-argument.ll | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/test/Transforms/IPConstantProp/return-argument.ll b/test/Transforms/IPConstantProp/return-argument.ll new file mode 100644 index 0000000..53288ee --- /dev/null +++ b/test/Transforms/IPConstantProp/return-argument.ll @@ -0,0 +1,46 @@ +; RUN: llvm-as < %s | opt -ipconstprop | llvm-dis > %t +; RUN: cat %t | grep {store i32 %Z, i32\\* %Q} +; RUN: cat %t | grep {add i32 1, 3} + +;; This function returns its second argument on all return statements +define internal i32* @incdec(i1 %C, i32* %V) { + %X = load i32* %V + br i1 %C, label %T, label %F + +T: ; preds = %0 + %X1 = add i32 %X, 1 + store i32 %X1, i32* %V + ret i32* %V + +F: ; preds = %0 + %X2 = sub i32 %X, 1 + store i32 %X2, i32* %V + ret i32* %V +} + +;; This function returns its first argument as a part of a multiple return +;; value +define internal { i32, i32 } @foo(i32 %A, i32 %B) { + %X = add i32 %A, %B + %Y = insertvalue { i32, i32 } undef, i32 %A, 0 + %Z = insertvalue { i32, i32 } %Y, i32 %X, 1 + ret { i32, i32 } %Z +} + +define void @caller(i1 %C) { + %Q = alloca i32 + ;; Call incdec to see if %W is properly replaced by %Q + %W = call i32* @incdec(i1 %C, i32* %Q ) ; <i32> [#uses=1] + ;; Call @foo twice, to prevent the arguments from propagating into the + ;; function (so we can check the returned argument is properly + ;; propagated per-caller). + %S1 = call { i32, i32 } @foo(i32 1, i32 2); + %X1 = extractvalue { i32, i32 } %S1, 0 + %S2 = call { i32, i32 } @foo(i32 3, i32 4); + %X2 = extractvalue { i32, i32 } %S2, 0 + ;; Do some stuff with the returned values which we can grep for + %Z = add i32 %X1, %X2 + store i32 %Z, i32* %W + ret void +} + |