|  | ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py | 
|  | ; RUN: opt < %s -instcombine -S | FileCheck %s | 
|  |  | 
|  | ; Result of left shifting a non-negative integer | 
|  | ; with nsw flag should also be non-negative | 
|  | define i1 @test_shift_nonnegative(i32 %a) { | 
|  | ; CHECK-LABEL: @test_shift_nonnegative( | 
|  | ; CHECK-NEXT:    ret i1 true | 
|  | ; | 
|  | %b = lshr i32 %a, 2 | 
|  | %shift = shl nsw i32 %b, 3 | 
|  | %cmp = icmp sge i32 %shift, 0 | 
|  | ret i1 %cmp | 
|  | } | 
|  |  | 
|  | ; Result of left shifting a negative integer with | 
|  | ; nsw flag should also be negative | 
|  | define i1 @test_shift_negative(i32 %a, i32 %b) { | 
|  | ; CHECK-LABEL: @test_shift_negative( | 
|  | ; CHECK-NEXT:    ret i1 true | 
|  | ; | 
|  | %c = or i32 %a, -2147483648 | 
|  | %d = and i32 %b, 7 | 
|  | %shift = shl nsw i32 %c, %d | 
|  | %cmp = icmp slt i32 %shift, 0 | 
|  | ret i1 %cmp | 
|  | } | 
|  |  | 
|  | ; If sign bit is a known zero, it cannot be a known one. | 
|  | ; This test should not crash opt. The shift produces poison. | 
|  | define i32 @test_no_sign_bit_conflict1(i1 %b) { | 
|  | ; CHECK-LABEL: @test_no_sign_bit_conflict1( | 
|  | ; CHECK-NEXT:    ret i32 0 | 
|  | ; | 
|  | %sel = select i1 %b, i32 8193, i32 8192 | 
|  | %mul = shl nsw i32 %sel, 18 | 
|  | ret i32 %mul | 
|  | } | 
|  |  | 
|  | ; If sign bit is a known one, it cannot be a known zero. | 
|  | ; This test should not crash opt. The shift produces poison. | 
|  | define i32 @test_no_sign_bit_conflict2(i1 %b) { | 
|  | ; CHECK-LABEL: @test_no_sign_bit_conflict2( | 
|  | ; CHECK-NEXT:    ret i32 0 | 
|  | ; | 
|  | %sel = select i1 %b, i32 -8193, i32 -8194 | 
|  | %mul = shl nsw i32 %sel, 18 | 
|  | ret i32 %mul | 
|  | } |