--- /dev/null
+; This testcase ensures that redundant loads are eliminated when they should
+; be. All RL variables (redundant loads) should be eliminated.
+;
+; RUN: if as < %s | opt -gcse | dis | grep %RL
+; RUN: then exit 1
+; RUN: else exit 0
+; RUN: fi
+;
+int "test1"(int* %P) {
+ %A = load int* %P
+ %RL = load int* %P
+ %C = add int %A, %RL
+ ret int %C
+}
+
+int "test2"(int* %P) {
+ %A = load int* %P
+ br label %BB2
+BB2:
+ br label %BB3
+BB3:
+ %RL = load int* %P
+ %B = add int %A, %RL
+ ret int %B
+}
+
--- /dev/null
+; This testcase ensures that redundant loads are preserved when they are not
+; allowed to be eliminated.
+; RUN: as < %s | dis > Output/%s.before
+; RUN: as < %s | opt -gcse | dis > Output/%s.after
+; RUN: diff Output/%s.before Output/%s.after
+;
+int "test1"(int* %P) {
+ %A = load int* %P
+ store int 1, int * %P
+ %B = load int* %P
+ %C = add int %A, %B
+ ret int %C
+}
+
+int "test2"(int* %P) {
+ %A = load int* %P
+ br label %BB2
+BB2:
+ store int 5, int * %P
+ br label %BB3
+BB3:
+ %B = load int* %P
+ %C = add int %A, %B
+ ret int %C
+}
+
+