blob: 5152e126e8fae3653811cf8bcc5a92f60a4206f3 [file] [log] [blame]
Florian Hahnf8045b22020-02-14 00:05:50 +01001; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
Eric Christophercee313d2019-04-17 04:52:47 +00002; RUN: opt < %s -sccp -S | FileCheck %s
3
4; Test that SCCP has basic knowledge of when and/or/mul nuke overdefined values.
5
Eric Christophercee313d2019-04-17 04:52:47 +00006 define i32 @test(i32 %X) {
Florian Hahnf8045b22020-02-14 00:05:50 +01007; CHECK-LABEL: @test(
8; CHECK-NEXT: ret i32 0
9;
Eric Christophercee313d2019-04-17 04:52:47 +000010 %Y = and i32 %X, 0
11 ret i32 %Y
12}
13
Eric Christophercee313d2019-04-17 04:52:47 +000014define i32 @test2(i32 %X) {
Florian Hahnf8045b22020-02-14 00:05:50 +010015; CHECK-LABEL: @test2(
16; CHECK-NEXT: ret i32 -1
17;
Eric Christophercee313d2019-04-17 04:52:47 +000018 %Y = or i32 -1, %X
19 ret i32 %Y
20}
21
Eric Christophercee313d2019-04-17 04:52:47 +000022define i32 @test3(i32 %X) {
Florian Hahnf8045b22020-02-14 00:05:50 +010023; CHECK-LABEL: @test3(
24; CHECK-NEXT: [[Y:%.*]] = and i32 undef, [[X:%.*]]
25; CHECK-NEXT: ret i32 [[Y]]
26;
Eric Christophercee313d2019-04-17 04:52:47 +000027 %Y = and i32 undef, %X
28 ret i32 %Y
29}
30
Eric Christophercee313d2019-04-17 04:52:47 +000031define i32 @test4(i32 %X) {
Florian Hahnf8045b22020-02-14 00:05:50 +010032; CHECK-LABEL: @test4(
33; CHECK-NEXT: [[Y:%.*]] = or i32 [[X:%.*]], undef
34; CHECK-NEXT: ret i32 [[Y]]
35;
Eric Christophercee313d2019-04-17 04:52:47 +000036 %Y = or i32 %X, undef
37 ret i32 %Y
38}
39
40; X * 0 = 0 even if X is overdefined.
Eric Christophercee313d2019-04-17 04:52:47 +000041define i32 @test5(i32 %foo) {
Florian Hahnf8045b22020-02-14 00:05:50 +010042; CHECK-LABEL: @test5(
43; CHECK-NEXT: ret i32 0
44;
Eric Christophercee313d2019-04-17 04:52:47 +000045 %patatino = mul i32 %foo, 0
46 ret i32 %patatino
47}