aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--test/Transforms/CorrelatedExprs/Makefile10
-rw-r--r--test/Transforms/CorrelatedExprs/basictest.ll138
-rw-r--r--test/Transforms/CorrelatedExprs/branchtest.ll38
3 files changed, 186 insertions, 0 deletions
diff --git a/test/Transforms/CorrelatedExprs/Makefile b/test/Transforms/CorrelatedExprs/Makefile
new file mode 100644
index 0000000..91acd4d
--- /dev/null
+++ b/test/Transforms/CorrelatedExprs/Makefile
@@ -0,0 +1,10 @@
+
+LEVEL = ../../../..
+include $(LEVEL)/test/Makefile.tests
+
+TESTS := $(wildcard *.ll)
+
+all:: $(addprefix Output/, $(TESTS:%.ll=%.ll.out))
+
+Output/%.ll.out: %.ll Output/.dir $(LOPT)
+ -$(TESTRUNR) $<
diff --git a/test/Transforms/CorrelatedExprs/basictest.ll b/test/Transforms/CorrelatedExprs/basictest.ll
new file mode 100644
index 0000000..c8eb546
--- /dev/null
+++ b/test/Transforms/CorrelatedExprs/basictest.ll
@@ -0,0 +1,138 @@
+; RUN: if as < %s | opt -cee -constprop -instcombine -dce | dis | grep 'REMOVE'
+; RUN: then exit 1
+; RUN: else exit 0
+; RUN: fi
+
+int %test1(int %A) {
+ %cond = seteq int %A, 40
+ br bool %cond, label %T, label %F
+T:
+ %REMOVE = add int %A, 2 ; Should become = 42
+ ret int %REMOVE
+F:
+ ret int 8
+}
+
+bool %test2(int %A) {
+ %cond = seteq int %A, 40
+ br bool %cond, label %T, label %F
+T:
+ %REMOVE = seteq int %A, 2 ; Should become = false
+ ret bool %REMOVE
+F:
+ ret bool false
+}
+
+bool %test3(int %A) {
+ %cond = setlt int %A, 40
+ br bool %cond, label %T, label %F
+T:
+ %REMOVE = setgt int %A, 47 ; Should become = false
+ ret bool %REMOVE
+F:
+ %REMOVE2 = setge int %A, 40 ; Should become = true
+ ret bool %REMOVE2
+}
+
+bool %test4(int %A) {
+ %cond = setlt int %A, 40
+ br bool %cond, label %T, label %F
+T:
+ %REMOVE = setgt int %A, 47 ; Should become = false
+ ret bool %REMOVE
+F:
+ ret bool false
+}
+
+int %test5(int %A, int %B) {
+ %cond = setne int %A, %B
+ br bool %cond, label %F, label %T
+T:
+ %C = sub int %A, %B ; = 0
+ ret int %C
+F:
+ ret int 0
+}
+
+bool %test6(int %A) {
+ %REMOVE = setlt int %A, 47 ; Should become dead
+ %cond = setlt int %A, 40
+ br bool %cond, label %T, label %F
+T:
+ ret bool %REMOVE ;; == true
+F:
+ ret bool false
+}
+
+bool %test7(int %A) {
+ %cond = setlt int %A, 40
+ br bool %cond, label %T, label %F
+T:
+ %REMOVE = xor bool %cond, true
+ ret bool %REMOVE
+F:
+ ret bool false
+}
+
+; Test that and expressions are handled...
+bool %test8(int %A, int %B) {
+ %cond1 = setle int %A, 7
+ %cond2 = setle int %B, 7
+ %cond = and bool %cond1, %cond2
+ br bool %cond, label %T, label %F
+T:
+ %REMOVE1 = seteq int %A, 9 ; false
+ %REMOVE2 = setge int %B, 9 ; false
+ %REMOVE = or bool %REMOVE1, %REMOVE2 ; false
+ ret bool %REMOVE
+F:
+ ret bool false
+}
+
+; Test that or expressions are handled...
+bool %test9(int %A, int %B) {
+ %cond1 = setle int %A, 7
+ %cond2 = setle int %B, 7
+ %cond = or bool %cond1, %cond2
+ br bool %cond, label %T, label %F
+T:
+ ret bool false
+F:
+ %REMOVE1 = setge int %A, 8 ; true
+ %REMOVE2 = setge int %B, 8 ; true
+ %REMOVE = or bool %REMOVE1, %REMOVE2 ; true
+ ret bool %REMOVE
+}
+
+bool %test10(int %A) {
+ %cond = setle int %A, 7
+ br bool %cond, label %T, label %F
+T:
+ ret bool false
+F:
+ %REMOVE = setge int %A, 8
+ ret bool %REMOVE
+}
+
+; Implement correlated comparisons against non-constants
+bool %test11(int %A, int %B) {
+ %cond = setlt int %A, %B
+ br bool %cond, label %T, label %F
+T:
+ %REMOVE1 = seteq int %A, %B ; false
+ %REMOVE2 = setle int %A, %B ; true
+ %cond2 = and bool %REMOVE1, %REMOVE2
+ ret bool %cond2
+F:
+ ret bool true
+}
+
+bool %test12(int %A) {
+ %cond = setlt int %A, 0
+ br bool %cond, label %T, label %F
+T:
+ %REMOVE = setne int %A, 0 ; true
+ ret bool %REMOVE
+F:
+ ret bool false
+}
diff --git a/test/Transforms/CorrelatedExprs/branchtest.ll b/test/Transforms/CorrelatedExprs/branchtest.ll
new file mode 100644
index 0000000..eeed1fd
--- /dev/null
+++ b/test/Transforms/CorrelatedExprs/branchtest.ll
@@ -0,0 +1,38 @@
+; RUN: if as < %s | opt -cee -simplifycfg | dis | grep 'REMOVE'
+; RUN: then exit 1
+; RUN: else exit 0
+; RUN: fi
+
+implementation
+
+declare void %foo(int)
+
+void %test(int %A) {
+bb1: ;[#uses=0]
+ %cond212 = setgt int %A, 9 ; <bool> [#uses=1]
+ br bool %cond212, label %REMOVEbb3, label %bb2
+
+bb2: ;[#uses=1]
+ call void %foo( int 123 )
+ br label %REMOVEbb3
+
+REMOVEbb3: ;[#uses=2]
+ %cond217 = setle int %A, 9 ; <bool> [#uses=1]
+ br bool %cond217, label %REMOVEbb5, label %bb4
+
+bb4: ;[#uses=1]
+ call void %foo( int 234 )
+ br label %REMOVEbb5
+
+REMOVEbb5: ;[#uses=2]
+ %cond222 = setgt int %A, 9 ; <bool> [#uses=1]
+ br bool %cond222, label %bb7, label %REMOVEbb6
+
+REMOVEbb6: ;[#uses=1]
+ call void %foo( int 456 )
+ br label %bb7
+
+bb7: ;[#uses=2]
+ ret void
+}
+